Java中DOM节点的正确生命周期是什么?

时间:2012-01-22 09:38:14

标签: java xml dom memory-management lifecycle

我想知道以下代码在生命周期管理和内存管理方面的正确性:

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()创建的节点,而不管实现如何?或者是否有任何实现上述内容可能会导致内存泄漏?

1 个答案:

答案 0 :(得分:1)

也许您可以查看几个DOM实现源代码库并了解它们的行为方式并从中得出一些结论? 问题是您无法控制在应用程序运行时使用的特定DOM实现,或者您的应用程序用户是否可以更改实现,并且他们经常更改它?

但是如果没有在document.createXXX方法的javadoc中定义特定的契约,我恐怕没有确切的赌注确切的行为。因此,我认为绝对确定行为的唯一选择是控制DOM的实现并了解其行为......