memory - 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)之间没有变化。如果有人遇到此问题或相关知识,我将发布此问题。
谢谢
解决方案
推荐阅读
- javascript - 如何避免在本机反应中重新渲染?
- python - 如何加速python函数(numpy)
- java - 最有效的算法和 BigO 表示法
- function - 这个语法是什么意思?(持续时间)-> 字符串?
- discord - 票务系统 Discord.js v.13
- google-sheets - countifs 奇怪的行为——使用“通配符”的结果仍然不等于总数
- mobile - 响应式移动应用程序不信任证书颁发机构
- r - 从闪亮的日历中删除几个月
- javascript - 如何通过 Phantom 使用 web3js 正确传输 Solana SOL
- css - React 应用程序上的 CSS 突然停止工作