频繁 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();
   }

 

目录
相关文章
|
24天前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
51 0
|
6月前
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
326 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
9月前
|
存储 缓存
关于为什么使用缓存能提高程序执行效率
关于为什么使用缓存能提高程序执行效率
69 0
|
9月前
|
Android开发 容器
要小心点,不要掉 Recomposition 带来的性能坑了
今天我们就来聊聊可能因为没理解透 Recomposition 而写出的性能问题。
62 0
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
|
JavaScript 前端开发 Java
JavaScript的垃圾回收机制,清除无用变量,释放多余内存,展现更好的性能
本篇文章将讲解一下javascript的垃圾回收机制。同时,我们必须先具备作用域链的概念,不懂的小伙伴可以先花3分钟观看一下这篇文章,简单了解一下作用域链的知识——从零开始讲解JavaScript中作用域链的概念及用途
430 0
|
缓存 Java 数据库
如何避免无意间创建多余对象
6 避免创建不必要的对象 从字面意思上来看,大家肯定都知道创建不必要的对象是错误的做法。但这一节其实主要是提醒我们避免无意识的创建不必要对象的代码写法。
如何避免无意间创建多余对象
一次性搞清楚线上CPU100%,频繁FullGC排查套路
“ 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题。 当然,这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警。 本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。
2201 0
|
测试技术 数据库连接 数据库
我的程序优化-尽量减少数据库连接操作
最近做一个项目,做的比较郁闷,现在把项目经验总结在这里。项目的主要功能就是为第三方程序提供数据,并根据客户端的调用提供数据更新。我的程序属于服务端。服务端以站点形式部署,以Xml的数据格式输出。 项目以我自己的设计编码完成,并整合测试。
1255 0