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