JDK 11 (и новее) DirectByteBuffer удерживает большую память вне кучи даже при запуске
Наше приложение использует много объектов DirectByteBuffer через FileChannel.map() nio и ByteBuffer.allocateDirect() для загрузки и обработки файлов (например, DICOM). Код написан на java 8, но скомпилирован на java 11.0.3. Мы профилировали наше приложение, используя JMC 7.x и JxRay (который конкретно показывает память DirectByteBuffers). JxRay сообщил, что наше приложение использует большой объем DirectByteBuffer (память вне кучи) около 140 МБ даже при запуске приложения, что довольно необычно. Формально отчет JxRay указывает на объект jdk.internal.jimage.ImageReader$SharedImageReader, который содержит этот большой объем памяти. Итак, я создал небольшой приветственный мир без какой-либо ссылки на класс / объект DirectBuffer, и JxRay сообщил почти идентичный результат, что меня озадачило. Связался с командой JxRay, и они сказали мне, возможно, более новый JDK 11 jdk.internal.jimage.ImageReader$SharedImageReader мог быть инициализирован и выделен этот большой объем памяти. JxRay не сообщает об этой проблеме в версии JDK 1.8, и они также заявили, что формат дампа кучи не изменился между версиями JDK (8 против 11). Я отправляю этот вопрос, если кто-то сталкивался с этой проблемой или знал о ней.
Спасибо