【问题标题】:How to free memory using Java Unsafe, using a Java reference?如何使用 Java Unsafe 释放内存,使用 Java 引用?
【发布时间】: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


【解决方案1】:
  • 对象引用的“内存地址”没有意义,因为对象可以跨 Java 堆移动。
  • 你不能显式释放Unsafe.allocateInstance分配的空间,因为这个空间属于Java Heap,只有Garbage Collector可以释放它。
  • 如果您想在 Java Heap 之外进行自己的内存管理,您可以使用 Unsafe.allocateMemory / Unsafe.freeMemory 方法。它们处理表示为long 的原始内存地址。但是,此内存不适用于 Java 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多