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