1、vm参数设置
调整vm的参数,记录gc日志,服务器端可以在catatlina.sh或者catalina.bat(windows)中的JAVA_OPTS中追加如下参数
-Xms512m -Xmx1028m -XX:MaxNewSize=512m -XX:MaxPermSize=1028m -XX:+PrintGCTimeStamps
-XX:+PrintGCDetails -verbose:gc -Xloggc:../logs/gc.log
如果在使用idea在可以如下窗口设置vm参数:
2、运行代码模拟gc
2.1minor GC
minor GC 只发生在年轻代。
public class JVMTest {
private static int _1MB = 1024 * 1024;
public static void main(String[] args) {
testMinorGC();
}
private static void testMinorGC() {
byte[] allocation1 = new byte[2 * _1MB];
byte[] allocation2 = new byte[2 * _1MB];
byte[] allocation3 = new byte[2 * _1MB];
byte[] allocation4 = new byte[4 * _1MB];//Eden空间不足分配,出现一次minor GC
}
}
gc日志如下:
2019-10-04T11:13:00.244+0800: 0.108: [GC (Allocation Failure) [PSYoungGen: 6951K->1000K(9216K)] 6951K->5104K(19456K), 0.0016411 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
解释:
2019-10-04T11:13:00.244+0800(GC发生的时间,对应于 -XX:+PrintGCDateStamps参数)
GC (Allocation Failure) 分配内存失败
PSYoungGen: 在young区发生了一次gc,说明这是一次minor gc
6951K->1000K(9216K): gc前young区内存使用6951kb,gc后使用1000kb,young区总内存为9216kb
6951K->5104K(19456K): gc前堆内存使用6951kb,gc后堆内存使用5104kb,堆内存总共有19456kb
0.0016411 secs :整个gc耗时0.0016411秒
2.2 full GC
Full GC 发生在整个堆空间,即年轻代 + 老年代 + 元空间 或者 永久代
2019-10-04T11:39:08.524+0800: 0.107: [GC (System.gc()) [PSYoungGen: 2855K->1000K(9216K)] 2855K->1053K(19456K), 0.0008367 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
2019-10-04T11:39:08.540+0800: 0.108: [Full GC (System.gc()) [PSYoungGen: 1000K->0K(9216K)] [ParOldGen: 53K->879K(10240K)] 1053K->879K(19456K), [Metaspace: 3496K->3496K(1056768K)], 0.0033307 secs]
解释类似上面,可以看到有PSYoungGen(年轻代)、ParOldGen(老年代)、Metaspace(元空间)三个区域都发生了gc动作,即full GC。