Java允许直接内存访问

时间:2013-08-11 14:06:56

标签: c# java pointers memory-management

我知道C#允许您在unsafe上下文中使用指针。但是Java有一些类似的内存访问方法吗?

Java没有指针(有充分的理由),所以如果有类似的内存访问方法,它究竟会是什么?

4 个答案:

答案 0 :(得分:4)

不,你不能。

最接近的是使用JNI并调用一个C函数,该函数返回给定内存位置的数据。

答案 1 :(得分:3)

嗯,有一个sun.misc.Unsafe类。它允许直接内存访问,因此您可以实现一些魔术,如重新解释强制转换等等。问题是你需要使用hacky反射方法来获取实例,而这个类并没有得到很好的记录。通常,您需要在生产代码中使用此类工具。

以下是如何获取它的示例:

Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);

有105种方法,允许不同的低级别的东西。这些方法专门用于直接内存访问:

  • allocateMemory
  • CopyMemory的
  • freeMemory
  • 的getAddress
  • getInt

编辑:此方法可能与OpenJDK的未来版本或任何其他JVM实现不兼容,因为它不是公共API的一部分。虽然很多OpenJDK代码使用Unsafe,但它的实现仍然是一个变化的主题,没有任何通知。感谢所有在评论中指出这一点的人。

答案 2 :(得分:2)

标准Java使用直接内存缓冲区为非托管内存提供直接内存地址。您可以使用ByteBuffer.allocateDirect方法在Java中分配直接内存缓冲区,或使用NewDirectByteBuffer JNI函数在C或C ++中分配直接内存缓冲区。您无法访问任意内存位置,但是对于大多数用途来说,访问直接内存缓冲区已足够,特别是因为NewDirectByteBuffer函数允许在ByteBuffer中包装完全任意的内存区域。

答案 3 :(得分:1)

不,Java没有任何用于访问任意内存位置的语言机制。 JNI可以执行操作系统允许的任何(不安全和非托管)操作,但这种操作尽可能接近。