我最近遇到了sun.misc.Unsafe类,允许用户以类似于C的方式分配、释放和访问内存,我在几个解决这个问题的博客中看到。
MappedByteBuffer比堆对象快第一条似乎与其他条款相矛盾,我不明白为什么。DirectMemoryBuffer在引擎盖下使用sun.misc.Unsafe (MappedByteBuffer也是如此),因此它们也应该受到第1条中描述的JNI调用的影响。此外,在第2条中,离堆内存访问类似于第1条中的访问,并给出了完全相反的结果。
对于如何处理堆外内存,比如何时使用它,是否有很大的好处,最重要的是,为什么相似的主题根据上面的文章给出了非常不同的结果?谢谢。
发布于 2014-03-11 18:10:35
1)。使用Java中的本机内存有其用途,例如当您需要处理大量数据(> 2G)或希望从垃圾收集器中脱身时。但是,在延迟方面,从JVM直接访问内存并不比上面演示的访问堆更快。结果实际上是有意义的,因为跨越JVM屏障必须付出一定的代价。在使用直接或堆ByteBuffer之间的情况是相同的。直接ByteBuffer的速度优势不是访问速度,而是能够直接与操作系统的本地I/O操作对话。Peter讨论的另一个很好的例子是在使用时间序列时使用内存映射文件。
来源:http://mentablog.soliveirajr.com/2012/11/which-one-is-faster-java-heap-or-native-memory/
2)。通过不安全的弃堆正在以330/1.12亿/Sec的速度快速燃烧。对于所有其他类型的分配,无论是读还是写,性能都是好的,没有一种分配对两者都有好处。特别是关于ByteBuffer,它是可悲的,我相信你不会使用这个数字后,看到这样的数字。DirectBytebuffer在读取速度上很差,我不知道为什么slow.So会这样,如果内存读写成为你系统中的瓶颈,那么肯定是离开堆的路,记住它是高速公路,所以要小心开车。
索卢斯:http://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html
https://stackoverflow.com/questions/22332990
复制相似问题