查看GC日志
首先学习JVM,那我们就必须学会查看GC日志
那么,我们就要学会IDE的控制台打印GC日志
下面是idea打开GC日志的方法
1.首先点击Run,选择Edit Configurations
2.选中对应的项目,在Configuration的Environment中的VM options,加上-XX:+PrintGCDetails
3.启动项目,即可在控制台看到对应的日志
注意:以下为JDK10的G1垃圾收集器的日志,不同的JDK使用不同的收集器
分析:
#堆每块1M大小
[0.024s][info ][gc,heap] Heap region size: 1M
#使用G1垃圾收集器
[0.030s][info ][gc ] Using G1
#堆地址、大小
[0.030s][info ][gc,heap,coops] Heap address: 0x0000000081c00000, size: 2020 MB, Compressed Oops mode: 32-bit
#初始标记开始,引发GC的原因是G1 Evacuation Pause
[1.397s][info ][gc,start ] GC(0) Pause Young (G1 Evacuation Pause)
[1.397s][info ][gc,task ] GC(0) Using 4 workers of 4 for evacuation
[1.418s][info ][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.0ms
[1.418s][info ][gc,phases ] GC(0) Evacuate Collection Set: 20.1ms
[1.418s][info ][gc,phases ] GC(0) Post Evacuate Collection Set: 0.1ms
[1.418s][info ][gc,phases ] GC(0) Other: 0.3ms
#Eden区回收14个region
[1.418s][info ][gc,heap ] GC(0) Eden regions: 14->0(9)
#Survivor区增加2个region
[1.418s][info ][gc,heap ] GC(0) Survivor regions: 0->2(2)
#Old regions增加7个
[1.418s][info ][gc,heap ] GC(0) Old regions: 0->7
#Humongous 回收一个
[1.418s][info ][gc,heap ] GC(0) Humongous regions: 3->2
#元空间不变
[1.418s][info ][gc,metaspace ] GC(0) Metaspace: 4658K->4658K(1056768K)
[1.418s][info ][gc ] GC(0) Pause Young (G1 Evacuation Pause) 17M->10M(128M) 20.557ms
[1.418s][info ][gc,cpu ] GC(0) User=0.02s Sys=0.00s Real=0.02s
JVM参数
jvm参数分类
根据JVM参数开头可以区分参数类型,共三类:“-”、“-X”、“-XX”,
不同JDK的参数会有所不同,所以我们需要根据实际的JDK来配置
标准参数
标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
通过命令 java即可查看
非标准参数(-X)
非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
通过命令 java -X,如下
非Stable参数(-XX)
非Stable参数(-XX),此类参数各个jvm实现会有所不同(有的JDK版本有的参数,但其他版本不一定有),需要根据自己所使用的JDK来选择对应的参数(但是,这些参数往往是非常有用的). 通过命令java -XX:+PrintFlagsFinal查看
JVM重要参数
接下来,我们介绍一下一些重要的JVM参数
标准参数:
-verbose:gc 查看GC情况
例:
-version 输出JDK的版本信息
-verbose:class 在程序运行的时候有多少类被加载
–verbose:jni 输出native方法调用的相关情况
非标准参数
-Xloggc: filepath 将GC日志输出到指定文件中
-Xms
设置jvm堆的初始大小,默认为物理内存的1/64,最小为1M;可以指定单位,比如k、m,若不指定,则默认为字节
-Xmx
设置jvm堆的最大值,默认为物理内存的1/4或者1G。
-Xmn
-Xmn 20m设置新生代大小为20m。
–Xss
设置线程栈的大小
-XX的一些重要可配置参数(注意:下面参数在一些JDK版本可能没有)
-XX:+printGC;
-XX:+PrintGCDetails:打印GC详情;
-XX:+PrintGCTimeStamps:打印时间戳;
-XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
-XX:-UseParallelGC 启用并行GC
-XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC 启用串行GC
性能调优参数列表:
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MaxPermSize=64m 老生代对象能占用内存的最大值
-XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 新生代内存容量与老生代内存容量的比例