Я не могу воспроизвести это поведение. Я использую следующую программу:
import java.io._
import xml.XML
object XMLLoadHeap {
val filename = "test.xml"
def addFile() {
val is = new BufferedInputStream(new FileInputStream(filename))
val xml = XML.load(is)
is.close()
println(xml.label)
}
def createXMLFile() {
val out = new FileWriter(filename)
out.write("<foo>\n")
(1 to 100000) foreach (i => out.write(" <bar baz=\"boom\"/>\n"))
out.write("</foo>\n")
out.close()
}
def main(args:Array[String]) {
println("XMLLoadHeap")
createXMLFile()
(1 to args(0).toInt) foreach { i =>
println("processing " + i)
addFile()
}
}
}
Я запускаю его со следующими параметрами: -Xmx128m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc
, и похоже, что он может работать бесконечно.
Вы можете попытаться увидеть, делает ли это это при использовании только самого большого файла XML. Возможно, проблема не в обработке большого количества файлов, а в обработке самого большого файла. При тестировании здесь с фиктивным 200-мегабайтным XML-файлом на 64-битной машине я вижу, что мне нужно около 3G памяти. Если это так, возможно, вам придется использовать парсер. См. XMLEventReader .
Кроме этого, при условии, что вы не создаете дерево объектов, вы можете использовать -Xmx4G -XX:+HeapDumpOnOutOfMemoryError
и затем анализировать дамп кучи с помощью инструмента, подобного MAT . 4 ГБ должно быть достаточно для анализа самого большого файла XML, и к тому времени, когда вы получаете ошибку нехватки памяти, может быть достаточно объектов, выделенных, чтобы точно определить, какой объект препятствует GC. Скорее всего, это будет объект, удерживающий различные проанализированные объекты XML.