Я задаюсь вопросом о правильности следующего кода с точки зрения управления жизненным циклом и управления памятью, который вытекает из него:
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()
, независимо от реализации?Или есть какая-то реализация, где вышеперечисленное может привести к утечке памяти?