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作为默认操作。