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

 

目录
相关文章
|
8月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
987 1
|
Arthas 运维 监控
定位频繁创建对象导致内存溢出风险的思路
定位频繁创建对象导致内存溢出风险的思路
317 1
|
2月前
|
前端开发 JavaScript
Promise有哪些缺点?如何解决这些缺点?
需要注意的是,虽然 Promise 存在这些缺点,但它仍然是 JavaScript 异步编程中的重要工具之一,并且通过合理的设计和使用,可以在很大程度上避免或减轻这些问题的影响。同时,随着技术的不断发展和进步,也会有更多更好的解决方案和模式出现,来进一步优化异步编程的体验。
|
4月前
|
缓存 监控 前端开发
多个异步操作对网页性能的影响及优化建议
多个异步操作会影响网页性能,主要体现在网络请求延迟、资源竞争及浏览器限制等方面,可能导致页面加载缓慢。为优化性能,可采用 `Promise.all()` 并行处理、请求合并、懒加载、缓存利用、CDN 托管、请求优化及性能监控等策略,从而提升用户体验。
|
8月前
|
并行计算 索引 Python
讨论如何优化 DataFrame 操作,减少内存占用和提高执行速度
【5月更文挑战第19天】优化 DataFrame 操作涉及选择合适的数据类型、避免复制、使用向量化、高效迭代和设置索引。通过这些策略,如使用 `np.int8` 节省内存,直接修改列数据,利用 `itertuples`,设置分类数据类型,以及分块和并行计算,可以显著减少内存占用和提高执行速度,从而更好地处理大规模数据。实践中需结合具体情况综合运用,不断测试和优化。
251 2
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
1399 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
存储 缓存
关于为什么使用缓存能提高程序执行效率
关于为什么使用缓存能提高程序执行效率
120 0
|
前端开发 JavaScript Java
移动端性能优化:减少应用的加载时间和内存占用
移动应用的性能对用户体验至关重要。在移动设备上,加载时间和内存占用是两个主要的性能指标。本文将介绍一些有效的技术和策略,帮助开发人员优化移动应用的加载时间并减少内存占用,以提升应用的性能和响应速度。
333 0
|
SQL 存储 缓存
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
接口性能优化技巧,干掉慢代码!
|
存储 Apache 数据库
高效读取大文件,再也不用担心 OOM 了!(上)
最近阿粉接到一个需求,需要从文件读取数据,然后经过业务处理之后存储到数据库中。这个需求,说实话不是很难,阿粉很快完成了第一个版本。
高效读取大文件,再也不用担心 OOM 了!(上)

热门文章

最新文章

相关实验场景

更多