Java Unsafe获取对象内存地址
public class UnsafeTestKlass {
private int value;
public UnsafeTestKlass() { this(99); }
public UnsafeTestKlass(int value) { this.value = value; }
public int value() { return value; } } |
获取对象内存地址
public long location(Object object) throws Throwable { Unsafe unsafe = getUnsafe();
Object[] array = new Object[] {object};
long baseOffset = unsafe.arrayBaseOffset(Object[].class); int addressSize = unsafe.addressSize(); long location; switch (addressSize) { case 4: location = unsafe.getInt(array, baseOffset); break; case 8: location = unsafe.getLong(array, baseOffset); break; default: throw new Error("unsupported address size: " + addressSize); } return (location); } |
例子
@Test public void getObjectAddress() throws Throwable { UnsafeTestKlass klass = new UnsafeTestKlass(); long baseAddress = location(klass); System.out.println("base address: " + baseAddress); } |