如何使用Java Unsafe和Java引用释放内存?

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

看起来不太对劲...


释放Java引用所占用的内存,您需要将该引用设置为null。 - Hot Licks
从理论上讲,是的,因为Unsafe允许您执行JVM可以执行的任何操作(通过操作JVM的内存)。但这需要对JVM的内部实现细节有精细的了解。(换句话说:不行,你做不到。) - user253751
4
这个问题可能源于一种想法,即Unsafe.allocateInstance可能会在Java堆之外分配对象。但这是不正确的。allocateInstance的工作方式与new Object()完全相同,只是它不调用构造函数。 - apangin
1个回答

13
  • 对象引用的"内存地址"并没有意义,因为对象可以在Java堆上移动。
  • 你不能显式地释放由Unsafe.allocateInstance分配的空间,因为该空间属于Java堆,只有垃圾收集器才能释放它。
  • 如果你想在Java堆之外进行自己的内存管理,可以使用Unsafe.allocateMemory / Unsafe.freeMemory方法。它们处理表示为long的原始内存地址。但是这种内存不适用于Java对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接