我已使用探查器监视我的 Java 应用程序以了解内存泄漏。我得到的类(class)占用了将近 80% 的内存
java.lang.ref.Finalizer
然后我用谷歌搜索上面的类(class),发现了很棒的文章 http://www.fasterj.com/articles/finalizer1.shtml
现在有人可以建议我如何提高 FinalizerThread 的优先级以在 GC 中收集这些对象。
还有一件事我在内核版本 Linux 2.6.9-5.ELsmp (i386) 和 Linux 2.6.18-194.17.4.el5 (i386) ) 但它在 Linux 2.6.18-128.el5PAE (i386) 上运行良好(没有 OOM 错误)。
这个问题是因为 Linux 内核吗? 有没有什么JVM变量可以提高FinalizerThread的优先级?
提前致谢。
最佳答案
要从字面上回答问题,您可以这样做。然而,如下所述,它可能毫无意义,尤其是因为线程已经具有高优先级。
for(Thread t: Thread.getAllStackTraces().keySet())
if (t.getName().equals("Finalizer")) {
System.out.println(t);
t.setPriority(Thread.MAX_PRIORITY);
System.out.println(t);
}
打印
Thread[Finalizer,8,system]
Thread[Finalizer,10,system]
除非您使用 100% 或接近它的所有内核,否则优先级并不重要,因为即使是最低优先级也会获得尽可能多的 CPU。
注意:在 Linux 上,它将忽略提升的优先级,除非您是 root。
相反,您应该减少终结器所做的工作。理想情况下,它不应该有任何关系。终结器中高负载的一个原因是创建了应该关闭但被丢弃的资源。 (让终结器改为关闭资源)
简而言之,您应该尝试确定哪些资源正在被终结,并确保它们在调用 finalize() 时不需要做任何事情,理想情况下根本不要使用此方法。
在旧版本的 Linux 内核上,资源可能需要稍长的时间才能关闭。我会检查硬件是否相同,因为这可能意味着清理资源需要更长的时间。 (但真正的解决办法是确保它不需要这样做)
关于java - 如何提高 FinalizerThread 在 GC 中收集对象的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093382/