kafka服务端频繁FullGC问题定位
1、安装JDK
2、查看微服务JVM参数配置
3、jps命令查看当前微服务进程号 70803,(忽略步骤2中的截图,属于后面补的图片)
-m: 虚拟机进程启动时传递给主类main()函数的参数
-l: 进程执行的JAR包路径
-v: 虚拟机进程启动时JVM参数
4、查看GC情况
发现FGC一直上涨,FullGC频繁,比对OC和OU,发现老年代一直GC,但是一直回收不掉,怀疑有大对象或者内存泄漏
5、查看内存分布情况,执行命令 ,导出堆文件
sudo -u ossuser ./jmap -dump:format=b,file=70803.hprof 70803
6、MAT内存分析工具,查看对象分布
发现服务端日志清除线程有占用超500M的大对象,被直接分配到老年代了
7、分析kafka源码,发现线程有常驻大对象存在
发现这个默认配置不符合当前的JVM堆分配场景,总共1G,-Xmx1G -Xms1G,占用了一半以上
该对象的大小,可以通过修改kafka服务端 server.properties文件配置,修改log.cleaner,dedupe.buffer.size配置项的大小为128M,重启微服务进行猜想验证
8、持续监测一段时间,观察FullGC情况,后续进行功能验证,验证完毕