Java:如何像 C++ 一样存储和检索内存地址

标签 java jvm memory-address unsafe

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

 uint32_t StoreAddresses[2];

我写:

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

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

 X * stored_x = (X*)StoreAdresses[0];
 Y * stored_y = (Y*)StoreAdresses[1];

我如何在 Java 中完成它? 感谢您的帮助!

最佳答案

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

地址的大小会根据您启动 JVM 的方式而改变。 64 位 JVM 通常使用 32 位引用(这可能来自 C++ 令人惊讶)您可以使用 Unsafe.ADDRESS_SIZE

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

很可能您尝试做的事情可以用更好的方式完成。你能给我们更多的细节吗?

关于Java:如何像 C++ 一样存储和检索内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635598/

相关文章:

java - 数组的内存地址 - Java

java - 如何从多个存储库中拉取相关信息?

java - 使用 Java 的 LDAP 身份验证

java - 无法在基本类型 double 上调用 set Double(Double)

java - 线程工作分配和多核的JVM实现

特定内存地址上的内容与 gdb 中的预期不同

java - 如何在 IntelliJ 代码中中断异常

java - 如何在具有内存和时间限制的沙箱中运行不受信任的 Groovy 代码?

java - 共享 JVM session

c - 指针寻址并在函数内部创建新值