2009-8-28 13:18:24 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError: Java heap space需要解析一个bin文件时出现了,这个异常。找了很多的解决方法都是要修改tomcat或jdk的虚拟内存之类的。但是根本解决不了问题。也有很多朋友遇到类似的问题,但大多的提出的解决方法都是修改虚拟内存之类的。可能是有的是有效的。我以前遇到过。修改了就可以了。 但这次是在一个jsp页面中读取一个文件时出现的这个异常信息。最后看到一个帖子写的好像是不能一下读取太多的内容到页面上。谁给推荐个好的解决方法呢??先谢谢了

解决方案 »

  1.   

    java.lang.OutOfMemoryError: Java heap space 
    这个肯定是内存不足,增大TOMCAT的虚拟内存在TOMCAT中查看下面的信息:
    JVM
    Free memory: 23.75 MB Total memory: 59.58 MB Max memory: 63.56 MB
      

  2.   

    1.增大虚拟内存;
    2.优化代码,确实是不能读取太多的数据到页面上,不仅减慢速度,还增加负担。我的项目中一个页面本来要访问6次数据库,也就是和数据库建立6次连接,后来优化了代码,全部一次性读到List中,共享List中的数据。
      

  3.   

    下面的是读取内容的方法,异常出先在红色的地方。
    跟踪的原因是Set内容的时候,Set获取的内容不对。
     
    private void readBinMMBodyMultiPartRelated() {
        int n=0;
        int c_headerLen=0,c_dataLen=0;
        String c_type="",c_id="";
        byte [] c_buf;
        int nEntries = m_In[m_i++];    while (n<nEntries) {
          c_headerLen=readUintvar();
          c_dataLen=readUintvar();
          int freeze_i=m_i;
          c_type=readContentTypeValue();
          int c_typeLen=m_i-freeze_i;      c_id="A"+n;
          if (c_headerLen-c_typeLen>0) {
            if ((decodeByte(m_In[m_i])==HFN_CONTENT_LOCATION) ||
               (decodeByte(m_In[m_i])==HFN_CONTENT_ID) ) {
                m_i++;
        c_id=readTextString();
            }
          }      /**
           * Add time 2009-8-27 20:37:54
           * by YDF
           */
          int num = 8;
          System.out.println(m_i);
          m_i+=num;
          MMBinContent bmmc=new MMBinContent();
          bmmc.setType(c_type);
          bmmc.setContentId(c_id);
          bmmc.setContent(m_In,m_i,c_dataLen);

          m_Message.addBinContent(bmmc);
          m_i+=c_dataLen;
          num+=8;
          n++;
        }
      }
      

  4.   

    这里是具体实现的方法m_Message.addBinContent(bmmc); 
    public void setContent(byte buf[], int off, int len)
    {
    m_iLength = len;
    m_byteArray = new ByteArrayOutputStream(len);
    m_byteArray.write(buf, off, len);
    }
      

  5.   

    O(∩_∩)O谢谢 大家的帮忙 又换成这个异常了java.lang.IndexOutOfBoundsException
    at java.io.ByteArrayOutputStream.write(Unknown Source)
    at com.waytide.bindecoder.MMBinContent.setContent(MMBinContent.java:87)
    at com.waytide.bindecoder.MMDecoder.readBinMMBodyMultiPartRelated(MMDecoder.java:299)出错的原因是要三次调用这个方法setContent
    第三次掉用的时候出现的异常
    往数组里写的内容太多了 。
    再次O(∩_∩)O谢谢 各位了。