Skip to main content Link Menu Expand (external link) Document Search Copy Copied

1. 背景

各个业务主机通过kafka将数据上报,有一个进行数据同步的系统, 将kafka上的数据同步到消费,简单加工后,存放在ES。

问题:4台 2C 16G 的机器内存使用占比在85%以上。

2. 分析过程

  • jps

选出进程

  • jinfo

查看进程的信息 发现14G的jvm内存,新生代只占了140MB,许多数据全在老年代,且不回收。 后面发现是因为公司默认使用ParNew对年轻代进行回收,CMS进行老年代回收。140M是 公司默认的。

  • jstat -gcutil <jpid> 5000 20 查看到有YGC频繁,每次30ms、FGC2小时一次

  • jstat -gcnew <jpid> 5000 20
  • jstat -gcnewcapbility <jpid> 5000 20

3. 解决办法

  • 可以指定新生代最大的内存
  • 使用G1作为垃圾回收

4. 参考资料

  • https://zhuanlan.zhihu.com/p/83804324 JVM之G1回收器和常见参数配置
  • https://zhuanlan.zhihu.com/p/626362331 JVM性能调优常用命令Jstat
  • https://www.elastic.co/guide/en/logstash/current/tuning-logstash.html#profiling-the-heap
  • https://www.elastic.co/guide/en/logstash/current/jvm-settings.html