我有个工程,tomcat5.0.28 spring hibernate struts ;10几个用户服务器一起访问,过会就会出错,
java.lang.OutOfMemoryError
我设置了大内存1024,也会出错,所以我在本机做个测试:
public ActionForward test(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
List list = new ArrayList();
for(int i=0;i<500;i++){
list = getCodeService().list();
}
MessageUtils.addMessage(request, list.size()+"!!!");
return mapping.findForward("error");
}getCodeService().list() 是:
protected List list() {
ContextInfo.recoverQuery();
DetachedCriteria dc = DetachedCriteria.forClass(TXjCodetype.class).addOrder(Order.asc("typeOrder"));
return this.hibernateTemplate.findByCriteria(dc);
}DetachedCriteria dc = DetachedCriteria.forClass(TXjCodetype.class).addOrder(Order.asc("typeOrder"));
查询数据库得到list 100条左右,我打开三个ie 轮流不停的刷新,大约20秒,就出下面的错误了,我觉得调大内存不是办法!
请教有什么好办法吗?错误:
classpath=/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/classes/;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/FCKeditor-2.3.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/acegi-security-1.0.0.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/activation.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/ant.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/antlr-2.7.6rc1.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/asm-attrs.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/asm.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/axis.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/barbecue-1.5-beta1.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/bsh-2.0b4.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/cglib-nodep-2.1_3.jar;/D:/qwareEclipse/WebQingHai/product/dist/target/WEB-INF/lib/coheg-security-1
    cp=D:\qwareEclipse\tomcat-5.0.28\bin\bootstrap.jar
    cp=D:\qwareEclipse\WebQingHai\product\dist\target\WEB-INF\classes
    cp=D:\qwareEclipse\WebQingHai\product\dist\target\WEB-INF\lib\FCKeditor-2.3.jar
    cp=D:\qwareEclipse\WebQingHai\product\dist\target\WEB-INF\lib\acegi-security-1.0.0.jar
    cp=D:\qwareEclipse\WebQingHai\product\dist\target\WEB-INF\lib\activation.jar
    cp=D:\qwareEclipse\WebQingHai\product\dist\target\WEB-INF\lib\ant.jar
    .....................很多包。。
    work dir=D:\qwareEclipse\tomcat-5.0.28\work\Catalina\localhost\patrol
    extension dir=C:\Program Files\Java\j2re1.4.2\lib\ext
    srcDir=D:\qwareEclipse\tomcat-5.0.28\work\Catalina\localhost\patrol
    include=org/apache/jsp/jsp/patrol/specialty/specialty_005fentry_jsp.java  [Security] ERROR [http-80-Processor13] Compiler.generateClass | Error compiling file: /D:/qwareEclipse/tomcat-5.0.28/work/Catalina/localhost/patrol//org/apache/jsp/jsp/patrol/specialty\specialty_005fentry_jsp.java     [javac] Compiling 1 source fileThe system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryErrorThe system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError

解决方案 »

  1.   

    Tomcat下的DataSource也有问题的,我曾经因为它也遭遇过OutOfMemory!
      

  2.   

    lz你的机器什么配置?看一下你下面的代码:for(int i=0;i <500;i++){ 
    list = getCodeService().list(); 

    你每次次取 100 条循环500次,10几个用户一起刷20秒,如果机器配置不好的话肯定会内存溢出,gc又不是马上去清理。这样的刷法,如果是普通的用户机器,肯定会内存溢出的。
      

  3.   

    LS说的有道理,LZ你这样写代码,TOMCAT一定会罢工滴
      

  4.   

    for(int i=0;i <500;i++){ 
    list = getCodeService().list(); 
    } 不知道你这里的for循环加了是什么意思,从逻辑上讲完全没啥意义。
    是为了测试负载么?
      

  5.   

    对只是一个测试,
    今天放在weblogic集群上了,可以负载,应该不会内存溢出了吧;
    总觉得hibernate配置没有优化好,查询一个表,看后台刷了sql语句很多次查询,
    我一个表里有很多外键
            <many-to-one name="txjCodetype" class="com.coheg.patrol.code.domain.TXjCodetype" fetch="select" not-found="ignore">
                <column name="TYPE_ID" length="32" />
            </many-to-one>这样的很多个,我看查询一个需要很多语句啊
      

  6.   

    还发现一个奇怪的问题: <class name="com.GT" table="GT">
    .........
    映射文件中有两个外键
    <many-to-one name="gta" class="com.A"  update="false" insert="false" fetch="select" not-found="ignore">
    <column name="GT_A" length="32" />
    </many-to-one><many-to-one name="gtb" class="com.B"  update="false" insert="false" fetch="select" not-found="ignore">
    <column name="GT_B" length="32" />
    </many-to-one>list 查询 gt 得到100条记录,我看控制台下面就打印有101次查询
    select .....  from  gt  (1次)
    select .....  from  gta (100次)为什么啊,  gta和gtb一样的啊,谁遇到过这样的问题?