Java内存垃圾回收(Garbage Collection)机制基本方法和原则:System.gc()与finalize()

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/84650786

Java内存垃圾回收(Garbage Collection)机制基本方法和原则:System.gc()与finalize()

Java一个对象的finalize()函数,是在当前对象被回收时才会调用。System.gc()暗示和提醒JVM开始垃圾回收。Java程序中显示调用System.gc() 搭配 Runtime.getRuntime().gc(),JVM并不一定马上就进行垃圾回收。这些方法实际上只是建议与提醒JVM该进行垃圾回收了,但是JVM到底做或者不做垃圾回收,JVM会自己决定(JVM判断的重要原则是Heap Space剩余大小)。
简单的说,System.gc()只是给了JVM一个垃圾回收的提醒:“嗨,可以垃圾回收了!”,至于JVM是否真的进行垃圾回收,JVM后续行为是不可预测的。JVM可以接受建议回收垃圾,也可以拒绝垃圾回收,即垃圾回收的时机不由System.gc()决定。JVM收到System.gc()垃圾回收提醒,到JVM真正进行垃圾回收动作是有时间延迟的。程序代码中调用System.gc()之后,JVM可能不会立即垃圾回收,但是JVM垃圾回收时候,会回收之前调用System.gc()的垃圾。

例如代码:

public class MainClass {
	public static void main(String[] args) {
		GCClass g = new GCClass();
		// 创建一个Java类,但是立即置为null。没有任何引用。
		g = null;

		// 此处专门开辟一个线程,模拟程序在进行其他一些有意义的活动。
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();

		System.gc();
		System.runFinalization();
	}

	private static class GCClass {
		@Override
		protected void finalize() throws Throwable {
			super.finalize();
			System.out.println(this.getClass().getSimpleName() + "垃圾回收");
		}
	}
}


运行后输出:

GCClass垃圾回收

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/84650786