【发布时间】:2014-08-17 06:17:51
【问题描述】:
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 允许您做任何 JVM 可以做的事情(通过操纵 JVM 的内存)。这样做需要对 JVM 的内部实现细节有复杂的了解。 (换句话说:不,你不能。)
-
这个问题可能源于
Unsafe.allocateInstance可能从Java Heap 分配对象的想法。但是这是错误的。allocateInstance的工作方式与new Object()完全相同,只是它不调用构造函数。
标签: java memory-management jvm directmemory