Creating Dangling Pointers in Java
OverviewSince Java uses a Garbage Collector it is not possoble to create a dangling reference in pure Java See here for more details However using the Java Library it is possible to create a dangling pointer if you go out of your way to create one. You still cannot create one by accident AFAIK.
Creating a dangling pointer deliberatelyA DirectByteBuffer has the address to a direct area of memory. In C terminology this could be called a pointer. This area of memory is not managed by the GC and must be explicity freed. The DirectByteBuffer manages the creation and cleanup for you so that when the DirectByteBuffer's Cleaner/Deallocator is GC'ed, the memory is freed. This means that indirectly the area of memory is freed when it is no longer used, however it is not directly managed meaning you can pervert this process and create a dangling references like so
ByteBuffer bb1 = ByteBuffer.allocateDirect(4096); ByteBuffer bb2 = ByteBuffer.allocateDirect(4096); useReflectionsToCopyTheAddressFieldFrom(bb1, /* to */ bb2); // now both byte buffers use the same address. bb1.put(0, 5); assert bb2.get(0) == 5; // clean up bb1 bb1= null; System.gc(); // etc. // bb1 is gone and so is its memory, but bb2 lives on. bb2.get(0); // can return 5 or kill the JVM.