查看GC日志

首先学习JVM,那我们就必须学会查看GC日志

那么,我们就要学会IDE的控制台打印GC日志

下面是idea打开GC日志的方法

1.首先点击Run,选择Edit Configurations

java打印日志命令 打印jvm日志_JVM


2.选中对应的项目,在Configuration的Environment中的VM options,加上-XX:+PrintGCDetails

java打印日志命令 打印jvm日志_JVM_02

3.启动项目,即可在控制台看到对应的日志

注意:以下为JDK10的G1垃圾收集器的日志,不同的JDK使用不同的收集器

java打印日志命令 打印jvm日志_JVM_03



分析:

#堆每块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即可查看

java打印日志命令 打印jvm日志_java_04

非标准参数(-X)
非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
通过命令 java -X,如下

java打印日志命令 打印jvm日志_jvm_05

非Stable参数(-XX)

非Stable参数(-XX),此类参数各个jvm实现会有所不同(有的JDK版本有的参数,但其他版本不一定有),需要根据自己所使用的JDK来选择对应的参数(但是,这些参数往往是非常有用的). 通过命令java -XX:+PrintFlagsFinal查看

java打印日志命令 打印jvm日志_jdk_06



JVM重要参数

接下来,我们介绍一下一些重要的JVM参数

标准参数:

-verbose:gc 查看GC情况

例:

java打印日志命令 打印jvm日志_jdk_07

-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 新生代内存容量与老生代内存容量的比例