jvm调优,总体来说就是分析dump包,看看有没有内存泄露的代码,如果没有;可以考虑进行jvm参数调优来达到目的。
使用的工具
VisualVm 进行堆各个对象内存的使用情况进行分析,也可以对比正常应用程序的dump进行分析,得出存活对象的一个占比情况,这个工具一个强大的地方就是使用插件,记住,一定要安装插件 eclipseMAT 插件:在eclipse上安装MAT插件,直接打开
.hprof
文件,即可进行导入分析,速度是比VisualVM要快很多。
dump包的转储
- 第一步:jps 查看java的进程号
- 第二步:jmap -dump:format=b,file=heap.hprof 87489 87489是java进程号,jmap的使用可以使用jmap -help命令查看
jstat -gc 进程号 可以查看FullGC的次数和其他代的回收情况
jvm参数调优,与OracleJDK来举例说明
具体可以进入oracle的官网》jdk》选择对应的版本》jvm调优篇,进行收集器的选择
- 第一步:确认你的JDK是否运行在server模式,具体可以看官网的参数调优,有对应的指导;
- 第二步:根据jdk的版本知道默认的收集器是那种(可以使用命令查看 jinfo 进程号);
- 第三步:确认堆内存的大小,堆内存大于6g,官方推荐G1收集器,G1收集器的特点是:大堆内存,暂停时间可预期;
- 第四步:根据官网的收集器进行对比,现在官方主推G1收集器,jdk9后的版本默认收集器基本都是G1收集器,可见取优越性,总的有三种收集器,对于100m以内的应用,使用穿行收集器;大应用使用G1,并发收集器是暂停时间比较短;
- 第五步:使用G1收集器,官方给的是在jdk7u4后才能使用,确认你使用的版本是否符合。
可以熟读oracle官网对于jdk版本调优的参数篇,除此之外你要堆jvm的各个代有一个了解,不然读起来可能有点费解。
官方给的参数调优有两种吞吐量调优(根据使用的服务器的架构自动选择,一般都是并行收集器)和低延迟调优(使用G1收集器,进行暂定时间可预期)
查看FGC原因
jstat -gccause pid