Java 尽管存在WeakReference,但未调用finalize()方法
我目前遇到一个问题,我的一个类的对象没有调用它们的Java 尽管存在WeakReference,但未调用finalize()方法,java,Java,我目前遇到一个问题,我的一个类的对象没有调用它们的finalize()方法,尽管只作为值存储在ConcurrentHashMap中,并且对象的UUID作为映射键 下面是我创建的一个示例(它不是我实际项目中使用的示例,但是这个示例也没有调用对象的finalize()方法) TestMain.class//处理HashMap的主类 public class TestMain { public static ConcurrentHashMap<String, WeakReference<
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");
}
}
当主方法运行时,所有打印的内容都是“完成”的,而我希望在此之前也打印“最终测试类:测试1”。我的代码是否有问题,或者我是否误解了finalize()
的工作原理
另外,我希望它能像我解释的那样工作,因为我需要从“映射”中删除带有finalize()
方法的对象Map
和内存,因为在项目运行期间将生成数百个对象,所以我希望清除不再使用的对象,以便为更多新对象腾出空间
编辑:我在互联网上的其他地方看到,有人说程序可能会在垃圾收集器有机会处理上述对象之前终止。因此,我尝试通过添加一个简单的while(true){}来让我的程序不终止
循环并等待了几分钟,仍然没有看到正在“完成”的对象的消息
非常感谢您的帮助。正如评论中正确提到的,不能保证调用finalize方法 Java编程语言不能保证哪个线程将 调用任何给定对象的finalize方法。它是有保证的, 但是,调用finalize的线程将不会保存任何 调用finalize时用户可见的同步锁定。如果 finalize方法引发未捕获异常,异常为 忽略该对象并终止该对象的终结
现在回到您所关心的在这些对象不再可访问后手动处理这些对象的问题,您不需要处理它们,Java垃圾收集器将通过它的自动内存管理为您处理这些问题。如果您想加速垃圾收集,请阅读G1垃圾收集器。正如注释中正确提到的,没有finalize方法被调用的保证 Java编程语言不能保证哪个线程将 调用任何给定对象的finalize方法。它是有保证的, 但是,调用finalize的线程将不会保存任何 调用finalize时用户可见的同步锁定。如果 finalize方法引发未捕获异常,异常为 忽略该对象并终止该对象的终结
现在回到您所关心的在这些对象不再可访问后手动处理这些对象的问题,您不需要处理它们,Java垃圾收集器将通过它的自动内存管理为您处理这些问题。如果您想加速垃圾收集,请阅读G1垃圾收集器。最有可能的解释是弗伦
- 如果GC没有运行,那么对象就不会被垃圾收集
- 如果未收集对象,则不会最终确定它们
等待GC不会有帮助。通常它只在>>需要时运行最可能的解释是GC从未运行过
- 如果GC没有运行,那么对象就不会被垃圾收集
- 如果未收集对象,则不会最终确定它们
等待GC是没有帮助的。通常它只在>>需要时运行。不能保证finalize方法会被使用called@PragnaniKinnera那么,当这些对象在其他任何地方都无法访问时,我该如何手动处理它们呢?我很困惑,是吧now@C_Beth这不是你的工作,GC会处理的你试着自己做这件事,这会导致额外的头痛。不能保证最终确定的方法是正确的called@PragnaniKinnera那么,当这些对象在其他任何地方都无法访问时,我该如何手动处理它们呢?我很困惑,是吧now@C_Beth这不是你的工作,GC会处理的。当你尝试自己做的时候,它会我会引起额外的头痛对了,谢谢;我不知道GC只有在需要时才会自动运行。好了,谢谢;我不知道GC只有在需要时才会自动运行。添加了
System.GC()
,它确实证明了当调用GC时,它会正常工作。谢谢你添加了System.GC()
,它确实证明了当调用GC时,它会正常工作。谢谢
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();
}
}