上文:jvm参数PretenureSizeThreshold让对象直接进入老年代!
本文主要是通过案例打印出java虚拟机gc记录。
配置命令
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
解释:
命令 | 解释 |
---|---|
-Xms20M | Java堆大小为20MB |
-Xmx20M | 最大的堆大小为20MB |
-Xmn10M | 10MB分配给新生代,也就是说10MB给了老年代 |
-XX:Survivor-Ratio=8 | 新生代中Eden区与一个Survivor区的空间比例是8∶1 |
-XX:+PrintGCDetails | 标记打印日志 |
代码
package com.jvm.gc;
/**
* @author: csh
* @Date: 2020/12/9 16:09
* @Description:测试打印GC
*/
public class MinorGC {
private static final int _1MB = 1024 * 1024;
/**
* VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
*/
public static void testAllocation() {
byte[] allocation1, allocation2, allocation3, allocation4;
allocation1 = new byte[2 * _1MB];
allocation2 = new byte[2 * _1MB];
allocation3 = new byte[2 * _1MB];
allocation4 = new byte[4 * _1MB]; // 出现一次Minor GC
}
public static void main(String[] args) {
testAllocation();
}
}
运行配置
结果
[GC (Allocation Failure) [PSYoungGen: 6301K->776K(9216K)] 6301K->4880K(19456K), 0.0030922 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
PSYoungGen total 9216K, used 7241K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 78% used [0x00000000ff600000,0x00000000ffc50660,0x00000000ffe00000)
from space 1024K, 75% used [0x00000000ffe00000,0x00000000ffec2020,0x00000000fff00000)
to space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
ParOldGen total 10240K, used 4104K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 40% used [0x00000000fec00000,0x00000000ff002020,0x00000000ff600000)
Metaspace used 3448K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 376K, capacity 388K, committed 512K, reserved 1048576K
Process finished with exit code 0
注意:
6301K->776K(9216K) 代码回收新生代为6301K变为776K也就是说回收了 6301-776=5525K
最后
查看日志gc的相关记录是日常开发和维护常用的,比较简单和常用。