【发布时间】:2016-02-28 06:33:36
【问题描述】:
我目前遇到一个问题,即我的一类对象没有调用其finalize() 方法,尽管它仅存储在ConcurrentHashMap 作为值,而对象的UUID 作为映射的键。
这是我创建的示例(它不是在我的实际项目中使用的示例,但此示例也没有调用对象的 finalize() 方法。
TestMain.class //处理HashMap的主类
public class TestMain {
public static ConcurrentHashMap<String, WeakReference<Test>> map = new ConcurrentHashMap<String, WeakReference<Test>>();
public static void main(String args[]) {
map.put("Key1", new WeakReference<Test>(new Test("test 1", 2))); //This "Test" Object shouldn't be accessible anywhere besides the HashMap anymore, and therefore I want it to be "finalized" by the garbage collector.
System.out.println("DONE");
}
}
Test.class //对象类
public class Test {
public String string;
public int intt;
public Test(String string, int intt) {
this.string = string;
this.intt = intt;
}
@Override
protected void finalize() throws Throwable {
System.out.println("FINALIZED TEST CLASS: " + string);
super.finalize();
}
}
当 main 方法运行时,打印的所有内容都是“DONE”,而我预计在此之前也会打印“FINALIZED TEST CLASS:Test 1”。我的代码有问题,还是我误解了 finalize() 的工作原理?
另外,我希望它能够像我解释的那样工作,因为我需要使用 finalize() 方法从“映射”Map 和内存中删除对象,因为在此期间将生成数百个对象我的项目的运行持续时间,因此我希望清除不再使用的对象,以便为更多新对象腾出空间。
编辑:我在互联网上的其他地方看到人们说程序可能会在垃圾收集器有机会处理上述对象之前终止。因此,我试图通过添加一个简单的while(true){} 循环来让我的程序不终止,并等待了几分钟,但仍然没有看到对象正在“完成”的消息。
非常感谢任何帮助,谢谢。
【问题讨论】:
-
不保证finalize方法会被调用
-
@PragnaniKinnera 那么在其他任何地方都无法访问这些对象后,我将如何手动处理它们呢?我现在很困惑
-
@C_Beth 这不是你的工作,GC 会处理的。当您尝试自己做时,会引起额外的头痛
标签: java