Java - 堆与直接内存访问

Bob*_*r02 9 java heap memory-management bytebuffer memory-mapped-files

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

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

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

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

MGo*_*t90 7

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