System.gc()的理解
- 在默认情况下,通过System.gc()或者是Runtime.gc()的调用,会显示的触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象的内存;
- 但是System.gc()调用附带有一个免责声明,也就是说即使调用了System.gc()也无法保证对垃圾收集器的调用(也就是无法保证立即触发GC);
- JVM的实现者可以通过System.gc()调用来决定JVM的GC行为,而一般情况下,垃圾回收应该是自动的,无需手动实现的,否则就太过于麻烦了,但是在一些特殊的情况下,比如我们正在编写一个性能基准,我们可以在运行之间调用System.gc();
- 以下代码如果注释掉System.runFinalization(),那么控制台就不一定会输出相关的内容,这也证明了System.gc()无法保证GC一定会执行;
public class SystemGCTest {
public static void main(String[] args) {
new SystemGCTest();
System.gc();
System.runFinalization();
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("SystemGCTest 重写了finalize()");
}
}
手动GC理解不可达对象的回收行为
public class LocalVarGC {
public void localvarGC1() {
byte[] buffer = new byte[10 * 1024 * 1024];
System.gc();
}
public void localvarGC2() {
byte[] buffer = new byte[10 * 1024 * 1024];
buffer = null;
System.