package ch.claude_martin.java8.security; public class Troll { volatile static Troll trash; private final String msg; public Troll(final byte[] bytes) { this.msg = new String(bytes); } @Override public String toString() { return this.msg; } @Override protected void finalize() throws Throwable { System.out.println("finalizing the object " + hashCode()); trash = this; // Don't mind me putting the reference there... }; public static void main(final String[] args) throws InterruptedException { try { Troll troll = new Troll(new byte[] { 85, 32, 109, 97, 100, 63 }); System.out.println("hash=" + troll.hashCode()); troll = null; // This hints the GC that "troll" can be collected } catch (final Exception e) { } while (trash == null) { System.gc(); // hint to run gc Thread.sleep(100); System.runFinalization(); // hint to run finalization Thread.sleep(100); } System.out.println(trash); System.out.println("hash=" + trash.hashCode()); } }