Java – 堆与直接内存访问

我最近遇到了sun.misc.Unsafe类,允许用户以类似于C的方式分配,解除分配和一般访问内存。我读了几个解决这个问题的博客,例如

  1. 哪个更快 – 堆或直接内存 – 测试结果声称堆
  2. 堆外内存与DirectByteBuffer vs Heap – 堆外似乎是最快的
  3. 时间序列数据的内存映射文件 – MappedByteBuffer比堆对象更快

第1条似乎与其他条款相矛盾,我无法理解其中的原因。 DirectMemoryBuffer在引擎盖下使用了sun.misc.Unsafe (因此是MappedByteBuffer ),因此它们也应该受到第1条所述的JNI调用的影响。另外,在第2条中,堆外内存访问类似于第1条中的内容,并给出完全相反的结果。

有人可能会评论如何处理堆外记忆,即何时使用它,是否有显着的好处,最重要的是,为什么类似的主题根据上述文章给出了截然不同的结果? 谢谢。

1)。 使用Java的Native内存有其用途,例如当您需要处理大量数据(> 2 GB)或者想要从垃圾收集器中逃脱时。 但是就延迟而言,如上所示,来自JVM的直接内存访问并不比访问堆快。 结果实际上是有意义的,因为穿越JVM屏障必须有成本。 这与使用直接或堆ByteBuffer之间的困境相同。 直接ByteBuffer的速度优势不是访问速度,而是直接与操作系统的本机I / O操作通信的能力。 Peter Lawrey讨论的另一个很好的例子是在处理时间序列时使用内存映射文件。

资料来源: http : //mentablog.soliveirajr.com/2012/11/which-one-is-faster-java-heap-or-native-memory/

2)。 通过Unsafe离开堆快速燃烧速度为330/11200百万/秒。 所有其他类型的分配的性能要么适合读取,要么写入,没有一个分配对两者都有好处。 关于ByteBuffer的特别说明,这很可怜,我相信看到这样的号码后你不会用它。 DirectBytebuffer读取速度很慢,我不知道为什么它会如此慢。所以如果内存读/写正在成为你系统的瓶颈,那么绝对是堆外即可,记住它是高速公路,所以小心驾驶。

Soruce: http : //www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html