日期:2014-05-18  浏览次数:20859 次

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.日志文件不是批次写入,而时所有都结束后一次写入,无论总文件有多大.
我再次说明,单个的也许不是问题就好比我们一顿饭多次点没