频繁 YGC的一段代码

简介: 假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。

问题背景:系统启动后,啥事没干,不停的YGC,并且YGC能回收彻底。
排查流程:
(1)top + shift  jstack  
输出 、jmap 输出、 没发现异常
(2)
线程数量非常多,关闭cache、关闭查询统计输出,依然出现ygc
(3)
怀疑reader reopen没有关闭、资源泄露,输出reader计数,没有发现异常
(4)
调整jvm参数,依然没有效果
(5)
代码步步打开,最后发现无意发现问题,原来实时add 操作也有统计输出,关掉这部分,ygc解决。

最终定位原因:
   
线程生成了大量 new String 对象了。String对象内存杀手!!!!慎用!lucene4.0 string对象,无疑是非常大的好处。面向byte 层的cachebyteterm!!!

代码如下,逻辑功能:等间隔输出统计信息。
public class PerfTracer {
   private AtomicInteger counter;
   private long startTime;
   private long intervalTime = 1 * 60 * 1000;
   private Log logger;
   private String name;
 
   public PerfTracer(String name,Log logger) {
       this.logger = logger;
       this.name = name;
       this.startTime = System.currentTimeMillis();
       this.counter = new AtomicInteger(0);
   }
 
   public void increment() {
       counter.incrementAndGet();
       if((System.currentTimeMillis() - startTime) >= intervalTime){
           this.onTime();
       }
   }  
   public void reset() {
       counter.set(0);
       this.startTime = System.currentTimeMillis();
   }
   protected String exportLog() {
       return "[" + name+"-statistics] " + (counter.get() / (intervalTime/1000)) + "-tps";
   }  
   protected void onTime() {
       logger.warn(this.exportLog());
       this.reset();
   }
}
调用
....//
其他代码
       perfTracer = new PerfTracer("DefaultRealTimeService-Write-CommitLog", log) {
           protected void onTime() {
               log.warn(this.exportLog());
               log.warn(getStatistics());
               this.reset();
           }
       };
       Thread printThread = new Thread(new PrintLogTask(perfTracer));
       printThread.start();
...//
其他代码

public String getStatistics() {
       StringBuilder sb = new StringBuilder();
       sb.append("CoreName:{").append(coreName).append("}  ");
       sb.append("1000ms: {").append(below1000.get()).append("}").append("  ");
       sb.append("1000ms~2000ms: {").append(below2000.get()).append("}").append("  ");
       sb.append("2000ms~5000ms: {").append(below5000.get()).append("}").append("  ");
       sb.append("5000ms++: {").append(above5000.get()).append("}").append("  ");      
       return sb.toString();
   }

 

目录
相关文章
|
2月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
56 0
|
7月前
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
379 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
10月前
|
存储 缓存
关于为什么使用缓存能提高程序执行效率
关于为什么使用缓存能提高程序执行效率
72 0
|
缓存 JavaScript 前端开发
图解 Google V8 # 22 :关于内存泄漏、内存膨胀、频繁垃圾回收的解决策略(完结篇)
图解 Google V8 # 22 :关于内存泄漏、内存膨胀、频繁垃圾回收的解决策略(完结篇)
276 0
图解 Google V8 # 22 :关于内存泄漏、内存膨胀、频繁垃圾回收的解决策略(完结篇)
一次性讲清楚 Handler 使用不当导致的内存泄露?
一次性讲清楚 Handler 使用不当导致的内存泄露?
一次性讲清楚 Handler 使用不当导致的内存泄露?
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
|
JavaScript 前端开发 Java
JavaScript的垃圾回收机制,清除无用变量,释放多余内存,展现更好的性能
本篇文章将讲解一下javascript的垃圾回收机制。同时,我们必须先具备作用域链的概念,不懂的小伙伴可以先花3分钟观看一下这篇文章,简单了解一下作用域链的知识——从零开始讲解JavaScript中作用域链的概念及用途
436 0
|
存储 Java 数据处理
高效读取大文件,再也不用担心 OOM 了!(下)
最近阿粉接到一个需求,需要从文件读取数据,然后经过业务处理之后存储到数据库中。这个需求,说实话不是很难,阿粉很快完成了第一个版本。
|
存储 Apache 数据库
高效读取大文件,再也不用担心 OOM 了!(上)
最近阿粉接到一个需求,需要从文件读取数据,然后经过业务处理之后存储到数据库中。这个需求,说实话不是很难,阿粉很快完成了第一个版本。
高效读取大文件,再也不用担心 OOM 了!(上)
|
存储 安全 Java
高效读取大文件,再也不用担心 OOM 了!(中)
最近阿粉接到一个需求,需要从文件读取数据,然后经过业务处理之后存储到数据库中。这个需求,说实话不是很难,阿粉很快完成了第一个版本。

相关实验场景

更多