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 上面临的另一件事是,它在 Linux 2.6 上运行良好(没有 OOM 错误) .18-128.el5PAE (i386)。

这是因为 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/

相关文章:

linux - 将文件解压缩到新文件夹中

java - 由于权限错误无法启动 jstatd

java - ConcurrentGCThread中Java VM的随机崩溃

file - JVM 属性 -Dfile.encoding=UTF8 还是 UTF-8?

java - 从远程Python脚本返回值

java - 建模游戏难度

linux - 如何设计Web应用程序以监视Web浏览器中的服务器状态

java - 如何从 Java 中的动态源生成对象流?

java - 泛型方法返回 'nothing'但不能返回null时返回什么?

c - Pthread C同步