Как освободить память с помощью Java Unsafe, используя ссылку на Java?
Класс Java Unsafe позволяет распределять память для объекта следующим образом, но используя этот метод, как бы вы освободили память, выделенную после завершения, так как он не предоставляет адрес памяти...
Field f = Unsafe.class.getDeclaredField("theUnsafe"); //Internal reference
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
//This creates an instance of player class without any initialization
Player p = (Player) unsafe.allocateInstance(Player.class);
Есть ли способ доступа к адресу памяти из ссылки на объект, может быть, целое число, возвращаемое реализацией hashCode по умолчанию, будет работать, так что вы могли бы сделать...
unsafe.freeMemory(p.hashCode());
не кажется правильным, как...
1 ответ
- "Адрес памяти" ссылки на объект не имеет смысла, так как объекты могут перемещаться по куче Java.
- Вы не можете явно освободить место, выделенное
Unsafe.allocateInstance
потому что это пространство принадлежит Java Heap, и только сборщик мусора может его освободить. - Если вы хотите собственное управление памятью вне Java Heap, вы можете использовать
Unsafe.allocateMemory
/Unsafe.freeMemory
методы. Они имеют дело с необработанными адресами памяти, представленными какlong
, Однако эта память не для объектов Java.