一般在jdk机器上可以通过命令粗略查看jvm当前参数运行状态,根据状态跟应用性质来调整参数
jstat -gcutil jvm的pid号----改命令可查看jvm堆内存分配的使用的百分比情况与普通GC,FULLGC从启动到查看为止所执行的次数以及执行时间
jstat -gacapity jvm的pid好---该命令可查看使用的内存量,与GC时间
当然详细情况需要通过gc日志来分析
tomcat开启GC日志记录
vim bin/catalina.sh 先编辑tomcat启动脚本,加上初始化jvm参数
JAVA_OPTS='-Xms512m -Xmx4096m -XX:PermSize=64M -XX:MaxNewSize=128m -XX:MaxPermSize=64m -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -Xloggc:/usr/local/tomcat/logs/tomcat_gc.log'
重启tomcat
可以使用windows下的gchisto软件把获取到的日志导进去,查看具体性能分析
也可以用在线工具https://gceasy.io/把日志包导进去获取性能分析
根据日志的gc响应时间跟应用类加载对象实例存活时间特点调整jvm参数
一般,如果对象存活时间短,那么可以设置年轻代的大小大,还有就是如果追求响应时间快,也可设置大内存
当年轻代内存大时,普通GC的周期会小,年轻代大,年老代就小,如果此时进入年老代的实例多的话,那么就会进行频繁full gc,由于年老代gc一般是用串行回收器的
所以,full gc的时间就会变长,而在gc的时候,对外是不响应请求的,这样用户体验就不好,还有就是,如果前面还有反向代理的话,反代的后端健康检查失效时间必须要大于gc的时间