java - 如何提高 FinalizerThread 在 GC 中收集对象的优先级

标签 java linux jvm linux-kernel

我已使用探查器监视我的 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/

相关文章:

c - GCC 4.6.3 Linux -O3 启用优化列表与应用于代码差异。优化顺序是否影响代码编译?

linux - 关于文件查找位置的问题

java - 如何为不在设备或模拟器上的 Android 运行单元测试?

linux - Jira 的 JVM 版本错误

java - 如何从 Android 中的 POJO 类获取项目?

java - 循环遍历一个 int 数组并在其中使用模数

java - jackson :如果属性(property)丢失怎么办?

c++ - 如何确保boost安装成功?

java - 为什么 static final 在每次迭代中都比 new 慢

java - 字符串加号运算符的线程安全,包括优化