我最近遇到了 sun.misc.Unsafe
类,它允许用户以类似于 C 的方式分配、取消分配和一般访问内存。我在几个解决这个问题的博客中读到问题例如
- Which is faster - heap or direct memory - 测试结果声明堆
- Off-heap memory vs DirectByteBuffer vs Heap - 堆外似乎是最快的
- Memory mapped files for time series data -
MappedByteBuffer
比堆对象更快
第 1) 条似乎与其他条相矛盾,我不明白为什么。 DirectMemoryBuffer 在底层使用了 sun.misc.Unsafe
(MappedByteBuffer
也是如此),因此它们也应该受到 JNI 调用的影响,如文章 1 中所述。另外,在文章 2 中,堆外内存访问类似于文章 1 中的那些,并给出完全相反的结果。
有人可以对如何继续使用堆外内存发表一般评论,即何时使用它,它是否有显着的好处,最重要的是,为什么类似的主题根据上述文章给出截然不同的结果?谢谢。
最佳答案
1).从 Java 使用 native 内存有其用法,例如当您 需要处理大量数据(> 2 GB)或当您 想逃离垃圾收集器。然而就 延迟,从 JVM 直接访问内存并不比 如上所示访问堆。结果实际上使 从某种意义上说,因为跨越 JVM 障碍必须付出代价。那就是 使用直接或堆 ByteBuffer 之间同样的困境。速度 直接 ByteBuffer 的优势不是访问速度而是 直接与操作系统的 native 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 的读取速度很糟糕,我不确定为什么这么慢。因此,如果内存读/写成为您系统中的瓶颈,那么 Off-heap 肯定是可行的方法,记住这是高速公路,所以小心驾驶。
来源:http://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html
关于Java - 堆与直接内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332990/