java堆与直接内存访问

tkclm6bt  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(399)

我最近碰到 sun.misc.Unsafe 类,允许用户以类似于c的方式分配、取消分配和访问内存。我在几个博客上读到了这个问题。
哪个更快-堆或直接内存-测试结果声明堆
堆外内存vs directbytebuffer vs堆外堆似乎是最快的
时间序列数据的内存Map文件- MappedByteBuffer 比堆对象快
第1)条似乎与其他条款相矛盾,我不明白为什么。directmemorybuffer正在使用 sun.misc.Unsafe 在引擎盖下(也是 MappedByteBuffer ),因此它们还应该受到第1条中描述的jni调用的影响。另外,在第2条中,堆外内存访问类似于第1条中的访问,并给出完全相反的结果。
有没有人会对如何使用堆外内存(即何时使用它)发表一般性的评论,对它有没有显著的好处,最重要的是,为什么类似的主题会根据上面的文章给出截然不同的结果?谢谢。

v440hwme

v440hwme1#

1). 从java使用本机内存有它的用途,例如当您需要处理大量数据(>2G字节)或当您想从垃圾收集器中逃逸时。但是,就延迟而言,从jvm直接访问内存并不比访问堆快,如上所示。结果实际上是有意义的,因为跨越jvm屏障必须付出代价。这与使用direct或heap bytebuffer的情况相同。直接bytebuffer的速度优势不是访问速度,而是能够直接与操作系统的本地i/o操作进行通信。peterlawrey讨论的另一个很好的例子是在处理时间序列时使用内存Map文件。
资料来源:http://mentablog.soliveirajr.com/2012/11/which-one-is-faster-java-heap-or-native-memory/
2). 堆外通过不安全的是燃烧迅速330/1120亿/秒。所有其他类型的分配的性能要么对读或写都是好的,没有一种分配对这两种都是好的。关于bytebuffer的特别说明,它是可怜的,我相信你在看到这样的数字后不会使用这个。directbytebuffer的读取速度很慢,我不知道为什么这么慢。因此,如果内存读/写在您的系统中成为瓶颈,那么肯定要离开堆,记住这是高速路,所以小心驾驶。
原因:http://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html

相关问题