如何使用Java引用使用Java Unsafe释放内存?
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堆移动。
- 您无法显式释放
Unsafe.allocateInstance
分配的空间,因为此空间属于Java堆,并且只有垃圾收集器可以释放它。 - 如果您想在Java Heap之外进行自己的内存管理,可以使用
Unsafe.allocateMemory
/Unsafe.freeMemory
方法。 它们处理表示为long
原始内存地址。 但是,此内存不适用于Java对象。