100分求解dom4j装载30M左右XML文件
内存溢出代码如下,我是用的sax为什么也会内存溢出?是不是哪里内存没释放,请高手帮忙看看
import java.io.*;
import
java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
public class ReadAndInsert {
public static void main(String args[])
{
SAXReader sax = new SAXReader();
sax.addHandler( "/DATA/user01 ", new UserHandler());
try {
sax.read(new File( "c:/exp/friend.xml "));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static class UserHandler implements ElementHandler
{
Element e = null;
public void onStart(ElementPath path) {
e = path.getCurrent();
path.addHandler( "USERID ", new NameHandler());
path.addHandler( "FNAME ", new NameHandler());
path.addHandler( "ORGID ", new NameHandler());
path.addHandler( "ORGNAME ", new NameHandler());
path.addHandler( "FROMORG ", new NameHandler());
System.out.println(path.getPath()+ "*************************** ");
//System.out.println(e.getName()+ ": "+e.getText());
}
public void onEnd(ElementPath path) {
path.removeHandler( "USERID ");
path.removeHandler( "FNAME ");
path.removeHandler( "ORGID ");
path.removeHandler( "ORGNAME ");
path.removeHandler( "FROMORG ");
}
}
public static class NameHandler implements ElementHandler
{
Element e = null;
public void onStart(ElementPath path) {
System.out.println(path.getPath());
}
public void onEnd(ElementPath path) {
e = path.getCurrent();
System.out.println(e.getName()+ ": "+e.getText());
}
}
}
------解决方案--------------------如果更换了API还是不行的话,我想可能只用调整JVM内存了
------解决方案--------------------首先关掉所有的System.out.println()
这个对性能影响很大.
------解决方案--------------------你的web容器是什么 修改一下Xms最大内存 我用jdom读30M以上xml都没问题
------解决方案--------------------曾经用jaxp 定义的标准sax解析过大xml, 对内存基本上没有影响。
从楼主遇到的问题来看dom4j的sax并非真正按流的方式解析,而且你outofmemeory的文件大小和内存大小基本也是成比例的。 正好符合dom解析时内存的消耗量,大概是1:10,1M xml文件到用dom解析到内存中是10m左右。
------解决方案--------------------加大真实内存,我写了一个上传程序,在本地512MB时报内存溢出,把代码上传到2G的服务器,就没事了......
------解决方案--------------------我前些天也遇到到了这样的问题,我是直接用的dom 也抽取网页的信息,在读取1个多G的文件时跑到一半内存有问题报的错就是LZ说的哪个.
我的解决方法是,先设置OutOfMemory的异常断点,看出错时jvm里的堆栈情况.在抛出异常的地方顺藤摸瓜.另外,包括我在内的很多人会觉得,字符量不大时String类或容器不会有问题,实际上一个不会有问题,多个则会很占用内存,建议还是从优化程序的设计入手.解决根本问题.
那时我的错是两个地方希望对lz有些帮助:
1.有和全局的List在整个抽取中不被释放,
2.日志文件不是批次写入,而时所有都结束后一次写入,无论总文件有多大.
我再次说明,单个的也许不是问题就好比我们一顿饭多次点没