你在实际项目中是否做过JVM GC的优化,怎么做的
如果通过预估+压测,做一份生产环境的jvm参数出来的,如何去观察jvm的运行情况.
jvm出现频繁的full gc问题,有没有尝试过生产环境的系统进行gc的一个优化.对于这个问题
说说平时工作怎么JVM调优的
如果开发一个新系统,JVM的调优不是一次性就调完的,要分几次去看
第一步,系统开发完需要自己预估一个JVM参数,也就是你预估每秒大概会有多少的对象进入,然后选几台机器,把内存比例设置的合理一些就好了,一般公司都会有一套公司级的通用JVM参数模板,如果是刚开发完,可以直接使用通用模板,反正测试环境还要压测
第二步,测试环境系统压测,使用工具模拟1000人或几千人同时使用,造成每秒几百上千的请求压力,响应时间要控制在200ms。然后压测期间我们需要通过 jstat 去看下内存使用情况,就是我之前说的那些,什么Eden区增长速度,各个GC的频率啊,有没有内存泄漏情况等等吧。如果观察YoungGC和Full GC频率没什么问题,系统没有卡顿现象,就可以上线了。
第三步,如果公司有监控系统,就持续监控,如果没有就每天高峰时期,通过jstat查看一下机器的JVM运行状态,如果需要优化,就继续优化
说一下 JVM 调优的工具?
JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和jvisualvm 这两款视图监控工具。
• jconsole:用于对 JVM 中的内存、线程和类等进行监控;
• jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。
常用的 JVM 调优的参数都有哪些?
• -Xms2g:初始化推大小为 2g;
• -Xmx2g:堆最大内存为 2g;
• -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
• -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
• –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
• -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
• -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
• -XX:+PrintGC:开启打印 gc 信息;
• -XX:+PrintGCDetails:打印 gc 详细信息。