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

时间:2014-06-26 11:51:23

标签: java memory-management jvm directmemory

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 个答案:

答案 0 :(得分:8)

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