首页 > 解决方案 > JDK 11(和更新版本)DirectByteBuffer 即使在启动时也拥有大量的堆外内存

问题描述

我们的应用程序通过 nio 的 FileChannel.map() 和 ByteBuffer.allocateDirect() 使用大量 DirectByteBuffer 对象来加载和处理文件(例如 DICOM)。代码用 java 8 编写,但用 java 11.0.3 编译。我们使用 JMC 7.x 和 JxRay(专门显示 DirectByteBuffers 内存)分析了我们的应用程序。JxRay 报告说,即使在应用程序启动时,我们的应用程序也使用了大约 140MB 的大量 DirectByteBuffer(堆外内存),这很不寻常。特别是 JxRay 报告指向持有这个大内存的 jdk.internal.jimage.ImageReader$SharedImageReader 对象。所以我创建了一个小型的 hello world,没有任何对 DirectBuffer 的类/对象的引用,而 JxRay 报告了几乎相同的结果,这让我感到困惑。联系了 JxRay 团队,他们告诉我可能是更新的 JDK 11 jdk。internal.jimage.ImageReader$SharedImageReader 可能已经被初始化并分配了这么大的内存。JxRay 没有在 JDK 1.8 版本上报告这个问题,他们还说堆转储的格式在 JDK 版本(8 和 11)之间没有变化。如果有人遇到此问题或相关知识,我将发布此问题。

谢谢

标签: memoryjava-11bytebufferoff-heap

解决方案


推荐阅读