我试图从大量的xmls创建一个对象树.但是,当我在大约2000 xml文件(范围从100KB到200MB)上运行以下代码时(注意我已经注释掉了创建对象树的代码),我获得了8-9GB的大内存占用.我希望在下面的示例中内存占用量最小,因为代码不会保留任何引用,它只会创建Elem并将其抛弃.运行完整GC后,堆内存保持不变.
def addDir(dir: File) {
dir.listFiles.filter(file => file.getName.endsWith("xml.gz")).foreach { gzipFile =>
addGzipFile(gzipFile)
}
}
def addGzipFile(gzipFile: File) {
val is = new BufferedInputStream(new GZIPInputStream(new FileInputStream(gzipFile)))
val xml = XML.load(is)
// parse xml and create object tree
is.close()
}
Run Code Online (Sandbox Code Playgroud)
我的JVM选项是:-server -d64 -Xmx16G -Xss16M -XX:+ DoEscapeAnalysis -XX:+ UseCompressedOops
而jmap -histo的输出看起来像这样
num #instances #bytes class name ---------------------------------------------- 1: 67501390 1620033360 scala.collection.immutable.$colon$colon 2: 37249187 1254400536 [C 3: 37287806 1193209792 java.lang.String 4: 37200976 595215616 scala.xml.Text 5: 18600485 595215520 scala.xml.Elem 6: 3420921 82102104 scala.Tuple2 7: …
我有
class Address(elem: scala.xml.Elem){
val attr1 = (elem \ "attr1") text
...
}
Run Code Online (Sandbox Code Playgroud)
我不希望elem成为Address的成员,因为我在内存中创建了数百万个这样的对象,因此将占用空间保持在最小.什么是scala方法来实现这一目标?谢谢.