如何在Java中访问内存位置?

3

我们是否可以直接或间接地访问Java中的内存位置?

如果我们尝试打印一个对象,它将打印哈希码。哈希码是否间接表示内存位置?

对于两个位于不同内存位置的对象,它们的哈希码仍然可能不同。

-阿比舍克


正如@Valetin所建议的那样,您不应该需要这样做。如果您有非常特定的原因要这样做,例如编写设备驱动程序,请使用带有C/C++的JNI。 - Peter Lawrey
4个回答

12

在Java中,我们是否可以直接或间接地访问内存地址?

不行。


7

不,一般情况下,哈希码与内存位置无关。对象的内存位置是对象本身的引用。

然而,也许并不完全不可能挤出实际位置。根据Java文档,Java Object 的哈希码通常是通过将对象的内部地址转换为整数来实现的,但这种实现技术并不是Java编程语言所必需的。并且有一个 System#identityHashCode(Object) 方法,它将返回与默认方法hashCode()(即Object的hashCode())返回相同的给定对象的哈希码。因此,通过这种方式,您确实可以获得实际的内存位置。但是,是否有效取决于具体实现。而且,即使您知道了位置,您绝对无法直接读写内存,那么您会怎么做呢?


2

对于基本数据类型可能不适用。但是对于引用类型,可以通过Java本机接口获取用于对象存储的数据区域的地址,从C++或C中获取内存位置。

然而这样做有点毫无意义。由于垃圾回收,任何Java对象都可能在任何线程创建新对象时随时移动到内存中的其他位置。


2

如果提供了某些API,您可以读取/写入内存地址。在Sun / Oracle JRE上,sun.misc.Unsafe允许您执行此操作,尽管故意使您必须通过一些步骤才能获得实例。


2
值得注意的是,Unsafe类不像C语言中的指针那样提供对象的位置信息。然而,不正确地使用这个类可能会导致JVM崩溃,有时会以意想不到的方式发生。请非常小心处理。 - Peter Lawrey
@Peter Lawrey:是的,您可以访问相对于对象的内存(以读取实例字段),或者访问绝对位置的内存。对象在内存中移动,因此对象的地址具有有限的意义。 - Tom Hawtin - tackline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接