Java - 堆与直接内存访问

问题描述 投票:8回答:1

我最近遇到过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比堆对象更快

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

有人可能会评论如何继续使用堆外内存,即何时使用它,是否有一个显着的好处,最重要的是,为什么类似主题根据上述文章给出了非常不同的结果?谢谢。

java memory-management heap memory-mapped-files bytebuffer
1个回答
6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.