3.3、人为制造“JVM 垃圾回收事件”

文章目录

      • 前言
      • 增加 VM 参数
      • 方式一:System.gc();
      • 方式二:减小堆大小并创建多个大对象
      • 垃圾回收和heap信息

前言

学习 JVM 垃圾回收器时,可以手动制造一些垃圾回收事件,便于理论联系实际。

增加 VM 参数

通过增加 VM 参数,垃圾回收过程会打印在控制台

-verbose:gc -XX:+PrintGCDetails 
    

更多命令可以参考(比如指定垃圾回收日志到指定文件):https://blog.csdn.net/q291611265/article/details/48028189

方式一:System.gc();

这个是Java 代码。

 //手动触发GC
 System.gc();

方式二:减小堆大小并创建多个大对象

当内存空间不够时,就需要触发GC了,利用这一机制,我们可以设定堆的大小和创大对象来认为的制造垃圾回收场景,一个main方法就足够了。

  • 1、设定 VM 参数

限定堆大小、新生代存活次数、大对象阀值

-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3145728

eclipse中的设置
3.3、人为制造“JVM 垃圾回收事件”_第1张图片
IDEA中的设置
3.3、人为制造“JVM 垃圾回收事件”_第2张图片

  • 2、运行main方法
// 查看 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();
	    }
}

垃圾回收和heap信息

方式一和方式二触发的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

你可能感兴趣的:(JVM)