如何在java中获取对象的内存位置? [英] How can I get the memory location of a object in java?
本文介绍了如何在java中获取对象的内存位置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想知道 JVM 分配给放置在系统内存中的对象的位置.
I want to know the location that JVM allocates to objects being placed in the system memory.
推荐答案
这是您可能不想做的事情.
This is something you probably don't want to do.
如果您真的想这样做,像这样的代码可能会有所帮助:
If you really want to do this, something like this code might help:
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 同步,因此结果可能没有意义
- 未在所有架构、字节序等中进行测试.这可能会使其无法在所有地方运行
这篇关于如何在java中获取对象的内存位置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文