Java:如何在C++中存储和检索内存地址

gos*_*eib 4 java jvm unsafe memory-address

我来自C++背景.在C++中,我可以存储一个内存地址,我刚刚在全局数组中新建,并在以后重新使用它.例如,假设我有两个类X,Y和我创建两个对象x,y.全局数组StoreAddresses [2]定义为:

 uint32_t StoreAddresses[2];
Run Code Online (Sandbox Code Playgroud)

我写:

 X * x = new X();
 Y * y = new Y();
 StoreAdresses[0] = (uint32t *) x; //for example, 0x12345678
 StoreAdresses[1] = (uint32t *) y; //for example, 0x12345698
Run Code Online (Sandbox Code Playgroud)

在我的程序中的任何地方,我都可以通过调用来检索内存中写入的数据:

 X * stored_x = (X*)StoreAdresses[0];
 Y * stored_y = (Y*)StoreAdresses[1];
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Java中实现这一目标?感谢帮助!

Pet*_*rey 7

您可以使用Unsafe在Java中执行此操作.然而这是一个非常糟糕的主意.这是因为对象的地址可以随时改变(通过GC)如果您存储这样的地址,以后再使用它可能不再有效,甚至会使应用程序崩溃.如果GC认为对象没有强引用,则可以清理对象.当您尝试再次引用该对象时,它可能不再位于JVM中.

地址大小可能会根据您启动JVM的方式而改变.64位JVM通常使用32位引用(这可能是C++的一个惊喜)你可以使用它Unsafe.ADDRESS_SIZE

我只会使用Unsafe来查看地址是什么,以查看对象在缓存中的布局方式.(这不是很有用,因为你可以做的不多:()

很可能你正在努力的事情可以做得更好.你能告诉我们更多细节吗?