【发布时间】:2013-07-09 07:41:15
【问题描述】:
我正在读取一些大型 XML 文件并将它们存储到数据库中。大约 800 mb。
它存储许多记录,然后终止并给出一个异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.IdentityHashMap.resize(Unknown Source)
at java.util.IdentityHashMap.put(Unknown Source)
使用内存分析器,我创建了 .hprof 文件,其中显示:
76,581 instances of "java.lang.String", loaded by "<system class loader>" occupy 1,04,34,45,504 (98.76%) bytes.
Keywords
java.lang.String
我有用于检索值的 setter 和 getter。我该如何解决这个问题。任何帮助将不胜感激。
我已经通过 JRE .ini 增加内存。但问题没有解决
编辑:我正在使用 scireumOpen 来读取 XML 文件。
我使用的示例代码:
public void readD() throws Exception {
XMLReader reader = new XMLReader();
reader.addHandler("node", new NodeHandler() {
@Override
public void process(StructuredNode node) {
try {
obj.setName(node
.queryString("name"));
save(obj);
} catch (XPathExpressionException xPathExpressionException) {
xPathExpressionException.printStackTrace();
} catch (Exception exception) {
exception.printStackTrace();
}
}
});
reader.parse(new FileInputStream(
"C:/Users/some_file.xml"));
}
public void save(Reader obj) {
try {
EntityTransaction entityTransaction = em.getTransaction();
entityTransaction.begin();
Entity e1=new Entity;
e1.setName(obj.getName());
em.persist(e1);
entityTransaction.commit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
【问题讨论】:
-
你如何读取这些 XML 文件?
-
您是否可以用 StringBuilder 替换所有字符串(在读取这些 XML 文件时)?如果是,那么你得到了解决方案
-
@freak 这并没有真正的帮助,因为一个 800M 大小的 XML 文件将占用至少 1.6G 的内存(每个字符 2 个字节)而不计算任何开销。甚至
StringBuilder也会在它的边界。 -
@freak,Uwe Plonus,The New Idiot 可以做什么,因为我已经将我的 jvm 或 jre 内存增加到 2048 M??
-
@Shiv 你不会做一些事情,比如把你解析的所有东西都放在一张地图中以供后续处理吗?你能显示一些代码吗?
标签: java string memory-leaks heap-memory heap-dump