解决方案 »

  1.   

    这段代码本身没看出来什么问题,如果最终导致OOM的话,恐怕得在这段代码中的被调函数找找了。或者用jvisualvm.exe跟踪下看看对象数量是哪些无法释放吧。
      

  2.   

    可能是对象没释放掉  
    我前几天做一个解析E  文件的东西 结果  运行过后  程序不推出   必须强制 system。exit
      

  3.   

    逻辑上没有问题,但是你的batchList是在每次循环末尾清掉的,这个时候如果内存稀缺,GC会启动,内存就不会有问题。
    但可能存在这种情况,你的某一次循环内,batchList.clear()方法被调用前,内存已经不够了,比如有几个超大的Article对象,这个时候Article对象都是有引用的,GC启动了也无法清掉,这个时候会报内存溢出。
      

  4.   

    看了下ArrayList最大存储内容好像是4G,是不是你的batchList内容存储的太大了
      

  5.   

    List<Word> artWords = getWords(art.getId()); 这句把List<Word> artWords 放到for循环外面吧,不然每循环一次,相当于多new一个对象
      

  6.   

    你能不能不要什么都放在循环里做啊。一个一个for按顺序来好吗
      

  7.   

    list = commonDao.queryForList("Article.getArticlePage", article); 
    这个list用完后最好设成null,以便gc回收。
    Article a = new Article();
    这个a的创建最好要放到所有循环的外面,用完后设成null。
      

  8.   


    关于list 对象 设为空,之前都试过,没什么效果
      

  9.   

    artWords.clear().我把循环改成500也不行你统计下,最大的500行数据的总大小,跟你的内存比较下。平均每1000条占3M
    那就不是这个问题啊,内存那个循环,每次artWords用完了,artWords.clear()一下试试。
      

  10.   

    用监控发现是jdbc内部操作占用大量内存
      

  11.   

    用list全装着? 建议你换64位系统,上64位jdk,用8G的内存, 设置jvm的Xmx参数看看
      

  12.   

    每当 batchList 里面元素达到一定数量时,比如说1000条。你就要处理一次,然后再clear
      

  13.   

    调整一下jdbc connection的fetchSize参数
      

  14.   

    附上异常信息
    2013-7-2 11:21:21 org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet SpringMVC threw exception
    java.lang.OutOfMemoryError: Java heap space
    at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2764)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9348)
    at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:211)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.logicalcobwebs.proxool.ProxyStatement.invoke(ProxyStatement.java:100)
    at org.logicalcobwebs.proxool.ProxyStatement.intercept(ProxyStatement.java:57)
    at $java.sql.PreparedStatement$$EnhancerByProxool$$13fa0d1f.executeBatch(<generated>)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor$Batch.executeBatch(SqlExecutor.java:611)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeBatch(SqlExecutor.java:118)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.executeBatch(SqlMapExecutorDelegate.java:759)
    at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.executeBatch(SqlMapSessionImpl.java:184)
    at com.founder.ec.base.dao.impl.BaseDaoImpl$2.doInSqlMapClient(BaseDaoImpl.java:234)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:200)
    at com.founder.ec.base.dao.impl.BaseDaoImpl.batchUpdate(BaseDaoImpl.java:228)
    at com.founder.ec.seo.service.impl.WordServiceImpl.batchUpdate(WordServiceImpl.java:550)
    at com.founder.ec.seo.service.impl.WordServiceImpl$$FastClassByCGLIB$$30ed5a4b.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)
    at com.founder.ec.common.aop.MethodAOP.doLog(MethodAOP.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspect
      

  15.   

    通过排除法,问题已找到,是ibatis 频繁读取数据库的问题,换成jdbc就好了