此问题如下:
在公司程序中,有可能web服务器的内存小了,出现java.lang.OutOfMemoryError
本人检查了程序,有以下几行认为会有不妥当,请大家给个建议:
方法:private void genExcelReport(Document doc, String reportName,
      File templateDir, String templateName, String saveDir, String fileName)
      throws Exception {....
XMLOutputter xmlOut = new XMLOutputter();
String xml = xmlOut.outputString(doc); --本人认为这个有点问题
reader = new StringReader(xml);
....}
这里的doc是一个很大的对象,大概有10的样子吧,所以这个xml对象应该也有
10 m左右,我想把它改成StringBuffer,或者StringBuilder有没有更好些,
如:
StringBuffer xml=xmlOut.outputString(doc); 
reader = new StringReader(xml.toString);

解决方案 »

  1.   

    用 StringBuilder 或者 StringBuffer 说不定在 8M 就内存溢出了!10M 的对象全放在内存中很容易溢出的,具体要看你这是做什么的再进行优化。
      

  2.   

    这么大的 XML,不应用 DOM 进行解析,建议采用 SAX 进行解析。
      

  3.   


    对,长XML文件,不建议直接用 String 来解析。
      

  4.   

    我们项目用的是Jdom,
    // Generate XML document
     Document doc = genXMLDoc(list); 这个list是从数据库读出来的,大小2200左右,list存放是一个属性比较多的对象(InsuranceEWLogBO ),大概25个属性,都是String类型
    public class InsuranceEWLogBO {
      ....
      private String dealerName;  private String dealerNameEn;  private String status;  private String brand;  private String model;
     ....}我是把数据读出的数据,解析成xml文件,然后在生产excel文件。
    如果换成sax解析的话,好像成本太高,所以的解析都要改变。
    现在问下,下面那个好点
    1.
    StringBuffer xml=xmlOut.outputString(doc); 
    reader = new StringReader(xml.toString); 
    2.
    String xml = xmlOut.outputString(doc); --本人认为这个有点问题 
    reader = new StringReader(xml); 
    1比2好么?
      

  5.   

    我觉得不应该啊,我只是把生成的xml都出来,放到一个String里??
      

  6.   

    xml 大了,就得压缩传输。压缩后就小了,10兆的xml压缩完估计能少很多。
      

  7.   

    自己在本机上写了个程序测试了下
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    public class TestBigString {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    TestBigString tb  = new TestBigString();
      try{
          String str=tb.fileReader("d:\\test.txt"); 
           if(str==null||!str.equals("")){
            System.out.println("Get string is right");
           }
           else
            System.out.println("error is happen!");
      }catch(Exception e){
      e.printStackTrace();
      }
    }
    public String fileReader(String filePath) {
        StringBuffer sb = new StringBuffer();
        File file = new File(filePath);
        try {
          FileReader fr = new FileReader(file);//创建FileReader对象,用来读取字符流
          BufferedReader br = new BufferedReader(fr); //缓冲指定文件的输入       while (br.ready()) {
            sb.append(br.readLine()+"\n");
          }       br.close();
          br.close();
          fr.close();     } catch (IOException e) {
          e.printStackTrace();
        }
        return sb.toString();
      }
    }
    test.txt这个文件70m的时候,没有啥问题,
    140m的时候就报了io错误,但是也没有java.lang.OutOfMemoryError 
    Get string is right
    java.io.IOException: Data error (cyclic redundancy check)
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder$CharsetSD.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at TestBigString.fileReader(TestBigString.java:34)
    at TestBigString.main(TestBigString.java:16)
    在eclipse--run的时候加入了VM argument: -Xms32m -Xmx800m
      

  8.   

    经过我自己的测试,140m的文件刚才也正确的读取出来,所以自己还是人,String类型可以接受10m的对象,或者更大,刚才我试的是140m,看来应该是web服务器的问题,我们公司用的是weblogic,去改改weblogic的参数试试看。
      

  9.   

    一个xml文件有这么大,我感觉功能设计的就有问题了,看看是否能拆分成多个 xml来传。