代码如下
/** * -XX:+PrintGCDetails * -XX:+PrintGCDateStamps * -XX:+PrintGCTimeStamps */ public class ReferenceCountingGC { public Object instance = null; private static final int _1MB = 1024 * 1024; /** * 这个成员属性的唯一意义就是占点内存,以便在能在GC日志中看清楚是否有回收过 */ private byte[] bigSize = new byte[2 * _1MB]; public static void testGC() { ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); objA.instance = objB; objB.instance = objA; objA = null; objB = null; // 假设在这行发生GC,objA和objB是否能被回收? System.gc(); } public static void main(String[] args) { testGC(); } }gc日志如下
D:\Java\jdk1.8.0_172\bin\java.exe -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps " Heap PSYoungGen total 38400K, used 333K [0x00000000d5e00000, 0x00000000d8880000, 0x0000000100000000) eden space 33280K, 1% used [0x00000000d5e00000,0x00000000d5e534a8,0x00000000d7e80000) from space 5120K, 0% used [0x00000000d7e80000,0x00000000d7e80000,0x00000000d8380000) to space 5120K, 0% used [0x00000000d8380000,0x00000000d8380000,0x00000000d8880000) ParOldGen total 87552K, used 643K [0x0000000081a00000, 0x0000000086f80000, 0x00000000d5e00000) object space 87552K, 0% used [0x0000000081a00000,0x0000000081aa0e50,0x0000000086f80000) Metaspace used 3444K, capacity 4496K, committed 4864K, reserved 1056768K class space used 376K, capacity 388K, committed 512K, reserved 1048576K
Process finished with exit code 0
因为我是jdk8,所以这部分和书上的不一样
代码如下
public class GC { public static GC SAVE_HOOK = null; public static void main(String[] args) throws InterruptedException { SAVE_HOOK = new GC(); SAVE_HOOK = null; System.gc(); Thread.sleep(500); if (null != SAVE_HOOK) { //此时对象应该处于(reachable, finalized)状态 System.out.println("Yes , I am still alive"); } else { System.out.println("No , I am dead"); } SAVE_HOOK = null; System.gc(); Thread.sleep(500); if (null != SAVE_HOOK) { System.out.println("Yes , I am still alive"); } else { System.out.println("No , I am dead"); } } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("execute method finalize()"); SAVE_HOOK = this; } }
