4

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());

どうも正しくないようです...

4

1 に答える 1

13
  • オブジェクトは Java ヒープを越えて移動できるため、オブジェクト参照の「メモリ アドレス」は意味がありません。
  • によって割り当てられた領域を明示的に解放することはできませんUnsafe.allocateInstance。これは、この領域が Java ヒープに属しており、解放できるのはガベージ コレクターのみであるためです。
  • Java ヒープ外で独自のメモリ管理が必要な場合は、Unsafe.allocateMemory/Unsafe.freeMemoryメソッドを使用できます。として表される生のメモリアドレスを扱いlongます。ただし、このメモリは Java オブジェクト用ではありません。
于 2014-06-26T13:19:50.993 に答える