学习 JVM 垃圾回收器时,可以手动制造一些垃圾回收事件,便于理论联系实际。
通过增加 VM 参数,垃圾回收过程会打印在控制台
-verbose:gc -XX:+PrintGCDetails
更多命令可以参考(比如指定垃圾回收日志到指定文件):https://blog.csdn.net/q291611265/article/details/48028189
这个是Java 代码。
//手动触发GC
System.gc();
当内存空间不够时,就需要触发GC了,利用这一机制,我们可以设定堆的大小和创大对象来认为的制造垃圾回收场景,一个main方法就足够了。
限定堆大小、新生代存活次数、大对象阀值
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3145728
// 查看 GC 日志的含义
public class GcTest {
//-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3145728
private static final int _1MB = 1024 * 1024;
private static final int _4MB = 4*1024 * 1024;
/**
* 小对象先保存到 新生代 Eden
*/
public static void testThreshold(){
byte[] allocation;
allocation = new byte[1 * _1MB];
}
/**
* 大对象直接进入老年代
* -XX:PretenureSizeThreshold=3145728
*/
public static void testPretenureSizeThreshold(){
byte[] allocation;
allocation = new byte[1 * _4MB];
}
public static void main(String[] args) {
//触发老年代GC
for(int j=0;j<3;j++) {
testPretenureSizeThreshold();
}
//触发新生代GC
for(int i=0;i<10;i++) {
GcTest.testThreshold();
}
//手动触发GC
System.gc();
}
}
方式一和方式二触发的GC 日志在内容上有一些差别,System.gc 会额外有一个(System)的标识
[GC [Tenured: 8192K->444K(10240K), 0.0101062 secs] 9232K->444K(19456K), [Perm : 228K->228K(12288K)], 0.0101825 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC [DefNew: 7495K->0K(9216K), 0.0008479 secs] 12036K->4540K(19456K), 0.0008748 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System) [Tenured: 4540K->444K(10240K), 0.0049976 secs] 7696K->444K(19456K), [Perm : 228K->228K(12288K)], 0.0050333 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
Heap
def new generation total 9216K, used 163K [0x33330000, 0x33d30000, 0x33d30000)
eden space 8192K, 2% used [0x33330000, 0x33358fc8, 0x33b30000)
from space 1024K, 0% used [0x33c30000, 0x33c30000, 0x33d30000)
to space 1024K, 0% used [0x33b30000, 0x33b30000, 0x33c30000)
tenured generation total 10240K, used 444K [0x33d30000, 0x34730000, 0x34730000)
the space 10240K, 4% used [0x33d30000, 0x33d9f168, 0x33d9f200, 0x34730000)
compacting perm gen total 12288K, used 228K [0x34730000, 0x35330000, 0x38730000)
the space 12288K, 1% used [0x34730000, 0x34769328, 0x34769400, 0x35330000)
ro space 10240K, 45% used [0x38730000, 0x38bb3958, 0x38bb3a00, 0x39130000)
rw space 12288K, 54% used [0x39130000, 0x397b7498, 0x397b7600, 0x39d30000)
Process finished with exit code 0