JDK предоставляет возможность выделять так называемые прямые ByteBuffers, где память выделяется вне кучи Java.Это может быть полезно, поскольку сборщик мусора не затрагивает эту память и, как таковой, не влияет на издержки GC: это очень полезно для свойства для долгоживущих вещей, таких как кеши.
Однако есть одинкритическая проблема с существующей реализацией: основная память выделяется асинхронно только тогда, когда владеющий ByteBuffer собирается мусором;нет способа форсировать раннее освобождение.Это может быть проблематично, поскольку на сам цикл GC не влияет обработка ByteBuffers, и, учитывая, что ByteBuffers, скорее всего, находятся в области памяти старого поколения, возможно, что GC вызывается через несколько часов после того, как ByteBuffer больше не используется.
Но теоретически должно быть возможно использовать sun.misc.Unsafe
методы (freeMemory, allocateMemory) напрямую: это то, что сам JDK использует для выделения / освобождения собственной памяти.Глядя на код, одна потенциальная проблема, которую я вижу, это возможность двойного освобождения памяти, поэтому я хотел бы убедиться, что состояние будет очищено должным образом.
Может кто-нибудь указать мне на код, который делает это?В идеале хотелось бы использовать это вместо JNA.
ПРИМЕЧАНИЕ: я видел этот вопрос , который как бы связан.
Похоже, что указанные ответы являются хорошим способомgo: здесь - пример кода из Elastic Search, который использует эту идею.Спасибо всем!