Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 为什么GC不清除对话框引用?_Java_User Interface_Swing_Garbage Collection - Fatal编程技术网

Java 为什么GC不清除对话框引用?

Java 为什么GC不清除对话框引用?,java,user-interface,swing,garbage-collection,Java,User Interface,Swing,Garbage Collection,我有一个对话。每次我创建并处理它时,它都会保留在内存中 这似乎是某个地方的内存泄漏,但我想不出来。 你有什么想法吗?有关更多信息,请参见堆转储的屏幕截图 提前谢谢 您确定要处理您的对话框吗?JDialog的标准是HIDE_ON_CLOSE。如果您尚未将defaultCloseOperation更改为DISPOSE ON\u CLOSE,则可能会有所帮助。如果我正确理解您的屏幕截图,则所有引用都很弱,因此最终它将获得GCd。但没有人能保证它什么时候会出现GCd;通常情况下,这不会立即发生。您可以尝

我有一个对话。每次我创建并处理它时,它都会保留在内存中

这似乎是某个地方的内存泄漏,但我想不出来。 你有什么想法吗?有关更多信息,请参见堆转储的屏幕截图

提前谢谢


您确定要处理您的对话框吗?JDialog的标准是HIDE_ON_CLOSE。如果您尚未将defaultCloseOperation更改为DISPOSE ON\u CLOSE,则可能会有所帮助。

如果我正确理解您的屏幕截图,则所有引用都很弱,因此最终它将获得GCd。但没有人能保证它什么时候会出现GCd;通常情况下,这不会立即发生。您可以尝试通过运行垃圾收集器(
System.GC()
)来加速GC,但仍然无法保证它是否会收集所有垃圾。

只要您持有对此窗口的引用,垃圾收集就不会将其删除。您确定不仅要处理它(这将只释放与窗口相关联的资源,而不是窗口本身),还要清除所有引用吗?

这取决于您的对象将在哪一代堆中由次要GC进行垃圾收集。为了确保所有非强引用对象都是GCed,您必须运行完整的GC,实现这一点的方法是引发outofmemory错误。。。您可以使用以下代码执行此操作:

try {
        List<byte[]> list = new ArrayList<byte[]>();
        while (true) {
            list.add(new byte[1024]);
        }
    } catch (OutOfMemoryError oome) {
        // full GC should have run here...
    }
试试看{
列表=新的ArrayList();
while(true){
添加(新字节[1024]);
}
}捕获(OutOfMemoryError oome){
//完全GC应该在这里运行。。。
}

您确定GC已实际运行吗?使用
java-verbose:gc etc
启动应用程序,每次执行gc时,VM都会将状态报告转储到控制台。关于。

其他人关于
System.gc()
的建议是正确的。或者,您可以使用实现JVM工具接口方法的工具(如NetBeans profiler)检查程序堆。

这取决于您在此对话框中使用的内容,以及您是否链接到此对话框的某个位置。没有更多的细节很难说。根据堆转储,没有这样的引用。我想我等得够久了。在很长一段时间内没有任何变化。我还通过调用System.GC()强制GC进行收集(注意,即使System.GC()也只是一个“建议”;虽然它确实运行垃圾收集器,但收集器仍会执行它喜欢的操作。原则上,没有办法强制它收集所有可以收集的内容。可以尝试的一件事是将大量内存用于其他内容;也许这会使收集器更积极地删除不必要的内容。我清除了wi中的所有引用ndow当我处理窗口时。那么你的问题是什么意思?你在问为什么GC没有清除对话框引用。什么引用?分配给对话框的内存仍在使用。我问为什么,如果对象上没有引用。下一次垃圾回收是否运行以回收内存?直到那时内存才被释放。她说e是GC活动和堆大小的图形。在前5分钟创建并释放了100个对话框。在接下来的10分钟后,它们仍然在内存中。是的。我确信我使用DISPOSE\u ON\u CLOSE作为默认操作。