Как освободить память с помощью 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.
Другие вопросы по тегам