Каков правильный жизненный цикл узла DOM в Java? - PullRequest
3 голосов
/ 22 января 2012

Я задаюсь вопросом о правильности следующего кода с точки зрения управления жизненным циклом и управления памятью, который вытекает из него:

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, которая является стандартной реализацией DOM в Java, элемент содержит ссылку на документ, но документ не знает об элементе.Это позволяет сборщику мусора очистить эти элементы, когда их область очищена (т.е. в конце цикла).Но это явно не задокументировано как таковое в API.С другой стороны, я не вижу никаких операций в DOM API, позволяющих «сбросить» документ владельца abc.

Мой вопрос таков: правильно ли я полагаю, что документ DOM может никогда не сохранять ссылки на узлы, которые он создает с createXXX(), независимо от реализации?Или есть какая-то реализация, где вышеперечисленное может привести к утечке памяти?

1 Ответ

1 голос
/ 22 января 2012

Возможно, вы могли бы взглянуть на исходную базу нескольких реализаций DOM, посмотреть, как они себя ведут, и сделать из этого некоторые выводы? Является ли проблемой то, что вы не можете контролировать конкретную реализацию DOM, используемую во время выполнения вашего приложения, или тот факт, что пользователи вашего приложения могут изменить реализацию, и они часто меняют ее?

Но если в javadoc методов document.createXXX не определен конкретный контракт, я боюсь, что не будет точной ставки на точное поведение. Таким образом, единственная опция, которую я вижу, чтобы быть абсолютно уверенной в том, что такое поведение, это контролировать реализацию DOM и знать его поведение ...

...