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

 

目录
相关文章
|
6月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
841 1
|
Arthas 运维 监控
定位频繁创建对象导致内存溢出风险的思路
定位频繁创建对象导致内存溢出风险的思路
287 1
|
3月前
|
存储 缓存 JSON
一行代码,我优化掉了1G内存占用
这里一行代码,指的是:String.intern()的调用,为了调用这一行代码,也写了几十行额外的代码。
|
6月前
|
并行计算 索引 Python
讨论如何优化 DataFrame 操作,减少内存占用和提高执行速度
【5月更文挑战第19天】优化 DataFrame 操作涉及选择合适的数据类型、避免复制、使用向量化、高效迭代和设置索引。通过这些策略,如使用 `np.int8` 节省内存,直接修改列数据,利用 `itertuples`,设置分类数据类型,以及分块和并行计算,可以显著减少内存占用和提高执行速度,从而更好地处理大规模数据。实践中需结合具体情况综合运用,不断测试和优化。
215 2
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
1243 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
存储 缓存
关于为什么使用缓存能提高程序执行效率
关于为什么使用缓存能提高程序执行效率
111 0
|
前端开发 JavaScript Java
移动端性能优化:减少应用的加载时间和内存占用
移动应用的性能对用户体验至关重要。在移动设备上,加载时间和内存占用是两个主要的性能指标。本文将介绍一些有效的技术和策略,帮助开发人员优化移动应用的加载时间并减少内存占用,以提升应用的性能和响应速度。
313 0
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
又抓到一个导致频繁GC的鬼——数组动态扩容
概述 本周有个同事过来咨询一个比较诡异的gc问题,大概现象是,系统一直在做cms gc,但是老生代一直不降下去,但是执行一次jmap -histo:live之后,也就是主动触发一次full gc之后,通过jstat -gcutil来看老生代一下就降下去了,初看下理论上不太可能,因为full gc也会对old做回收,于是我要同事针对他们的场景写了一个简单的demo出来,然后果然还真能重现,不过他的demo设置的Heap有32G,于是我通过慢慢调整,最终在很小的内存下也能重现出来。
又抓到一个导致频繁GC的鬼——数组动态扩容
|
缓存 Java 数据库
如何避免无意间创建多余对象
6 避免创建不必要的对象 从字面意思上来看,大家肯定都知道创建不必要的对象是错误的做法。但这一节其实主要是提醒我们避免无意识的创建不必要对象的代码写法。
如何避免无意间创建多余对象