我想知道以下代码在生命周期管理和内存管理方面的正确性:
org.w3c.dom.Document document = // some document
// Some long-running loop
for (;;) {
// This element has "document" as its owner. But it is never added as a child
// element into the document. It can be GC'ed at the end of the loop
Element abc = document.createElement("abc");
}
此类临时元素(或DocumentFragment
等)可能经常用于广泛的DOM操作。在Xerces中,这是Java的标准DOM实现,该元素包含对文档的引用,但文档不知道Element。这允许垃圾收集器在清除它们的范围时(即在循环结束时)清理这些元素。但是这在API中没有明确记录。另一方面,我没有看到DOM API中的任何操作允许“取消设置”abc
的所有者文档。
我的问题是:我是否正确地假设DOM文档可能永远不会引用它使用createXXX()
创建的节点,而不管实现如何?或者是否有任何实现上述内容可能会导致内存泄漏?
答案 0 :(得分:1)
也许您可以查看几个DOM实现源代码库并了解它们的行为方式并从中得出一些结论? 问题是您无法控制在应用程序运行时使用的特定DOM实现,或者您的应用程序用户是否可以更改实现,并且他们经常更改它?
但是如果没有在document.createXXX方法的javadoc中定义特定的契约,我恐怕没有确切的赌注确切的行为。因此,我认为绝对确定行为的唯一选择是控制DOM的实现并了解其行为......