jvm相关参数及java内存调优常用命令方法
1、通过 jstat -gc pid interval 查看每次 GC 之后,具体每一个分区的内存使用率变化情况
2、通过jcmd pid VM.flags 就可以查看到jvm相关的设置参数
3、通过“jmap -heap 进程id”查询出 当前进程的JVM 的配置信息,其中就包括垃圾收集器的设置类型
4、查看 & 分析 GC 日志
首先,我们需要通过 JVM 参数预先设置 GC 日志,通常有以下几种 JVM 参数设置:
-XX:+PrintGC 输出 GC 日志
-XX:+PrintGCDetails 输出 GC 的详细日志
-XX:+PrintGCTimeStamps 输出 GC 的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出 GC 的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行 GC 的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
eg:-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/log/heapTest.log
如果GC日志非常大,可以用GCViewer工具打开日志文件,图形化界面查看整体的 GC 性能,如下图所示:
也可以用GCeasy工具,并且还可以将日志文件压缩之后,上传到 GCeasy 官网即可看到非常清楚的 GC 日志分析结果
5、堆中年轻代和老年代的比例设置
在 JDK中,默认情况下年轻代和老年代的比例是 1:2,我们可以通过–XX:NewRatio 重置该配置项。
6、堆中年轻代的 Eden 和 To Survivor、From Survivor 的比例是设置
在 JDK中,默认情况堆中年轻代的 Eden 和 To Survivor、From Survivor 的比例是8:1:1,我们可以通过 -XX:SurvivorRatio 重置该配置项。
eg:-XX:SurvivorRatio=8 将 Eden、Survivor 的比例设置为 8:2
7、 -XX:+UseAdaptiveSizePolicy 配置项,JVM 将会动态调整 Java 堆中各个区域的大小以及进入老年代的年龄
ps1、通过 -XX:-UseAdaptiveSizePolicy 关闭该项配置
ps2、如果开启了 -XX:+UseAdaptiveSizePolicy 配置项,–XX:NewRatio 和 -XX:SurvivorRatio 将会失效,而 JDK1.8 是默认开启 -XX:+UseAdaptiveSizePolicy 的。
ps3、在 JDK1.8 中,不要随便关闭 UseAdaptiveSizePolicy 配置项,除非你已经对初始化堆内存 / 最大堆内存、年轻代 / 老年代以及 Eden 区 /Survivor 区有非常明确的规划了。否则 JVM 将会分配最小堆内存,年轻代和老年代按照默认比例 1:2 进行分配,年轻代中的 Eden 和 Survivor 则按照默认比例 8:2 进行分配。这个内存分配未必是应用服务的最佳配置,因此可能会给应用服务带来严重的性能问题。
8、调整某一个程序的堆内存空间
java -jar -Xms4g -Xmx4g heapTest-0.0.1-SNAPSHOT.jar
9、-XX:PetenureSizeThreshold
如果分配的对象内存超过了设置的阀值,会直接分配到老年代,这样做的好处就是可以减少新生代的垃圾回收。