如何增加FinalizerThread在GC中收集对象的优先级

use*_*580 5 java linux jvm linux-kernel

我用profiler监视我的java应用程序以了解内存泄漏.而且我上课了几乎80%的内存

java.lang.ref.Finalizer
Run Code Online (Sandbox Code Playgroud)

然后我谷歌上面的课程,发现了很棒的文章 http://www.fasterj.com/articles/finalizer1.shtml

现在任何人都可以建议我如何增加FinalizerThread的优先级来收集GC中的那些对象.

我在Linux上使用内核版本Linux 2.6.9-5.ELsmp(i386)Linux 2.6.18-194.17.4.el5(i386)时遇到此问题还有一件事,但它在Linux 2.6上工作正常(没有OOM错误).18-128.el5PAE(i386).

这个问题是因为Linux Kernels吗?是否有任何JVM变量来改善FinalizerThread的优先级?

Thanx提前.

Pet*_*rey 3

要从字面上回答这个问题,你可以这样做。然而,如下所述,这可能毫无意义,特别是因为线程已经具有高优先级。

for(Thread t: Thread.getAllStackTraces().keySet())
    if (t.getName().equals("Finalizer")) {
        System.out.println(t);
        t.setPriority(Thread.MAX_PRIORITY);
        System.out.println(t);
    }
Run Code Online (Sandbox Code Playgroud)

印刷

Thread[Finalizer,8,system]
Thread[Finalizer,10,system]
Run Code Online (Sandbox Code Playgroud)

除非您使用 100% 或接近 100% 的所有核心,否则优先级并不重要,因为即使是最低优先级也会获得所需的 CPU 数量。

注意:在 Linux 上,除非您是 root,否则它将忽略提高的优先级。

相反,您应该减少终结器所做的工作。理想情况下,它不应该有任何事情可做。终结器中高负载的原因之一是创建了本应关闭但正在被丢弃的资源。(让终结器关闭资源)

简而言之,您应该尝试确定哪些资源正在被最终确定,并确保它们在调用 Finalize() 时不需要执行任何操作,理想情况下根本不要使用此方法。

在旧版本的 Linux 内核上,资源关闭时间可能会稍长一些。我会检查硬件是否相同,因为这可能意味着清理资源需要更长的时间。(但真正的解决方法是确保不需要这样做)