Java - 堆与直接内存访问

时间:2014-03-11 18:05:13

标签: java memory-management heap memory-mapped-files bytebuffer

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

  1. Which is faster - heap or direct memory - 测试结果声明堆
  2. Off-heap memory vs DirectByteBuffer vs Heap - 堆外似乎最快
  3. Memory mapped files for time series data - 比堆对象快MappedByteBuffer
  4. 第1条)似乎与其他的相矛盾,我无法理解为什么。 DirectMemoryBuffer在引擎盖下使用sun.misc.Unsafe(所以MappedByteBuffer),因此它们也应该受到第1条所述的JNI调用的困扰。另外,在第2条中,堆外内存访问类似于在第1条中,给出完全相反的结果。

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

1 个答案:

答案 0 :(得分:6)

<强> 1)。使用Java的Native内存有其用途,例如当你     需要处理大量数据(> 2千兆字节)或当你     想逃离垃圾收集器。但是就此而言     延迟,来自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