我最近遇到sun.misc.Unsafe
类,允许用户以类似于C的方式分配,解除分配和一般访问内存。我在几个博客中阅读了解决此问题的内容,例如:
MappedByteBuffer
第1条)似乎与其他的相矛盾,我无法理解为什么。 DirectMemoryBuffer在引擎盖下使用sun.misc.Unsafe
(所以MappedByteBuffer
),因此它们也应该受到第1条所述的JNI调用的困扰。另外,在第2条中,堆外内存访问类似于在第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