Java - 堆与直接内存访问

标签 java memory-management heap-memory bytebuffer memory-mapped-files

我最近遇到了 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 也是如此),因此它们也应该受到 JNI 调用的影响,如文章 1 中所述。另外,在文章 2 中,堆外内存访问类似于文章 1 中的那些,并给出完全相反的结果。

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

最佳答案

1).从 Java 使用 native 内存有其用法,例如当您 需要处理大量数据(> 2 GB)或当您 想逃离垃圾收集器。然而就 延迟,从 JVM 直接访问内存并不比 如上所示访问堆。结果实际上使 从某种意义上说,因为跨越 JVM 障碍必须付出代价。那就是 使用直接或堆 ByteBuffer 之间同样的困境。速度 直接 ByteBuffer 的优势不是访问速度而是 直接与操作系统的 native 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 的读取速度很糟糕,我不确定为什么这么慢。因此,如果内存读/写成为您系统中的瓶颈,那么 Off-heap 肯定是可行的方法,记住这是高速公路,所以小心驾驶。

来源:http://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html

关于Java - 堆与直接内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332990/

相关文章:

对指针指针和动态内存分配感到困惑

java - IntelliJ Idea 给出 java.lang.OutOfMemoryError : Java heap space error even after increasing heap size

java - 找不到问题所在

java - 使用 java 处理 Json API 响应

c++ - 没有句柄的动态分配变量会发生什么? (C++)

java - JVM 在堆栈上创建对象? (和更多)

linux - Linux下如何将正在运行的C++进程堆转储到一个文件中?

java - Java 中的内部类覆盖率

Java继承: Superclass being "overriden" by Subclass function with different signature

swift - 计算属性不需要存储分配