我怎样才能得到在java中的对象的内存位置?
我想知道JVM分配给放置在系统内存中的对象的位置。
这是你可能不想做的事情。
如果你真的想这样做,像这样的代码可能会有所帮助:
package test; import java.lang.reflect.Field; import sun.misc.Unsafe; public class Addresser { private static Unsafe unsafe; static { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe)field.get(null); } catch (Exception e) { e.printStackTrace(); } } public static long addressOf(Object o) throws Exception { Object[] array = new Object[] {o}; long baseOffset = unsafe.arrayBaseOffset(Object[].class); int addressSize = unsafe.addressSize(); long objectAddress; switch (addressSize) { case 4: objectAddress = unsafe.getInt(array, baseOffset); break; case 8: objectAddress = unsafe.getLong(array, baseOffset); break; default: throw new Error("unsupported address size: " + addressSize); } return(objectAddress); } public static void main(String... args) throws Exception { Object mine = "Hi there".toCharArray(); long address = addressOf(mine); System.out.println("Addess: " + address); //Verify address works - should see the characters in the array in the output printBytes(address, 27); } public static void printBytes(long objectAddress, int num) { for (long i = 0; i < num; i++) { int cur = unsafe.getByte(objectAddress + i); System.out.print((char)cur); } System.out.println(); } }
但
- 不能跨JVM甚至不同版本移植
- 对象随时可能由于GC而移动,无法在GC之间同步,因此结果可能不合理
- 没有在所有的体系结构上进行testing,endianess等可能会使这不起作用
如果不使用JVM特有的function,则无法完成。 Java故意隐藏与每个对象相关联的位置,以便实现更多的灵活性(JVM经常在执行垃圾回收时在内存中移动对象)并提高安全性(不能使用原始指针来垃圾内存或访问不存在的对象)。
您可以使用http://openjdk.java.net/projects/code-tools/jol来分析对象布局。; 对于一个对象,你可以使用:
System.out.println( GraphLayout.parseInstance(someObject).toPrintable());
我想知道JVM分配给对象的位置
你不能,因为它不存在。 它随着时间的推移而变化,由于垃圾收集器的行动 没有“地点”这样的东西。