Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
充满Java finalize()调用的Java堆_Java_Jboss_Garbage Collection - Fatal编程技术网

充满Java finalize()调用的Java堆

充满Java finalize()调用的Java堆,java,jboss,garbage-collection,Java,Jboss,Garbage Collection,我的应用程序在两种环境中都可以正常工作,但在验收测试环境中存在内存泄漏。JVM堆转储显示堆中有98%的java.object.finalize()(如果我没记错的话,.GC日志说明GC越来越频繁地执行完整的GC,直到JVM内存不足-错误 这可能是什么原因造成的?应用程序在所有环境中都是相同的,但在问题环境中,操作系统和网络略有不同。Java在所有环境中都是相同的。这个输出甚至意味着什么,GC调用了Object Finalize()但由于某些原因,它没有完成?我正在使用JBoss EAP 5。可能

我的应用程序在两种环境中都可以正常工作,但在验收测试环境中存在内存泄漏。JVM堆转储显示堆中有98%的java.object.finalize()(如果我没记错的话,.GC日志说明GC越来越频繁地执行完整的GC,直到JVM内存不足-错误


这可能是什么原因造成的?应用程序在所有环境中都是相同的,但在问题环境中,操作系统和网络略有不同。Java在所有环境中都是相同的。这个输出甚至意味着什么,GC调用了Object Finalize()但由于某些原因,它没有完成?我正在使用JBoss EAP 5。

可能会创建需要完成的垃圾,其速度比完成垃圾的速度要快。当确定某个对象无法访问(即符合收集条件)时如果需要终结,则会将其添加到终结器队列,而不是立即收集。在终结器完成后的下一次GC上,可以收集该对象。换句话说,终结会延迟内存恢复

有一个线程执行所有finalize方法,默认情况下,它以与所有其他线程相同的优先级运行。如果有多个线程创建需要终结的垃圾,则它们生成垃圾的速度可能比一个终结器线程执行
finalize()的速度快
方法。此外,如果最终确定方法的速度不快,只会使问题变得更糟

总而言之,您可能有太多和/或太慢的
finalize()
方法要执行。这可能是因为在一个有问题的环境中,finalize方法比较慢?或者您有更多的处理能力,所以在那里创建垃圾的速度更快


我以前遇到过这个问题。为了缓解它,我提高了终结器线程的优先级。这样做的诀窍是在初始化过程中创建一块垃圾,覆盖
finalize()
并在终结过程中更改当前线程中的线程优先级。在这种情况下,更改终结器线程的优先级足以解决问题,但不能保证解决问题。

尝试使用jProfiler,这是一个查找漏洞的非常棒的工具,您将能够找到导致此问题的类。您是否重写了
finalize()
对于任何对象?我们没有在任何地方覆盖finalize()(听起来像是黑客?:)有问题的环境比没有问题的环境更强大。我们也不会覆盖finalize。我的解决方案肯定是一个黑客。根本原因是JVM中的设计缺陷。这个bug往往只在功能更强大的环境中表现出来,因为JVM完成任务的能力不会随着内核的添加而扩展,但是应用程序创建垃圾的能力会随着内核的添加而线性扩展。