最后一个幼稚的问题,java.lang.OutOfMemoryError能不能指望jboss自己恢复呢
========================================
你可以在代码可能抛出OutOfMemoryError的位置使用try catch获得这个OutOfMemoryError错误,并进行处理,通过一些策略来降低应用服务的压力;这样就软性的化解了这个错误也不会把应用挂掉

解决方案 »

  1.   

    一个显示15条记录的普通jsp页面在本机访问时居然要等4-5秒
    ======================================================
    分页是读取数据时作的即只取15条数据,还是全部取出后再选择15条记录?
    这个地方及容易导致内存溢出,或者系统压力过大;觉得应该是在这个地方出现的问题
      

  2.   

    to  crazycy(代言人):
    我想处理OutOfMemoryError 异常不是一件容易的事,首先我现在很难发现到底是哪里的代码导致了该异常,因为调试的时候一切正常,只是在压力测试时偶尔抛出来,然后就只能重启jboss。其次,就算找到了,一旦发生了OutOfMemoryError异常程序能不能处理呢?好象不能处理。我看了很多这方面的帖子,大概都是说怎么避免,就算catch到了系统能不能恢复我还不知道。所以我觉得如果jboss能够提供一个自己恢复的机制就太好了。
    显示15条记录我是先得到全部记录的一个collection然后选择15条记录。我也觉得这不是个好办法,可是我用CMP实现持久,EJB-QL语法太笨了,根本没办法实现灵活的查询,更别说调用存储过程什么的了。反正目前还没想到好的解决办法,只好这样用了。如果大家有好分页办法欢迎开源 :)
    另外,我觉得这不应该是造成内存泄露的原因,一个包含10000条记录的collection应该比一个包含10000条记录的ResultSet小的多吧,何况我clear得比谁都勤快,问题不应该在这里才对啊。
      

  3.   

    问题出现在你说的
    ===============
    显示15条记录我是先得到全部记录的一个collection然后选择15条记录
    ================
    中,你说呢?压力测试中多线程的处理速度很快的,内存占用是hoho的;包含10000条记录的Collention和包含10000条记录的ResultSet谁占用的内存多先不说,但是占用内存是很多的;如果在一个很小的时间段,10个线程每个都取到了10000条记录,在你从10000条记录中选择15条的时间,其他的线程也取到10000条,这个很正常吧?那现在的JVM(Tomcat默认128 或者 256根据安装时内存大小定义的),很容易被耗光的;你说呢?
      

  4.   

    EJB-QL语法
    =========
    这个也是我的盲点,但是应该能用where条件吧?就是这个函数的参数有个from to两个参数,并且作为where条件 就可以解决了取大量数据的问题;不知道对于EJB-QL语法是否可行;建议验证
      

  5.   

    OutOfMerroyError错误的处理难在处理的策略上,呵呵,楼主说的是;不过如果避开了这个大数据量的提取,我想就不会处理了
      

  6.   

    说来说去造成内存泄露的 crazycy(代言人)是觉得在于分页,我也觉得分页处理占用了太多内存。不过用EJB-QL我真没想到什么好办法。如果不用CMP,就好办的多。比如有ID依次从1-105的100条记录,其中61-65的ID不存在,分页每页10条。我现在要取第7页的10条记录,也就是75-85。如果不用CMP,自己写SQL语句,很容易实现:从第70条记录,往后取10条就OK,或者写个存储过程。这个很容易实现。可是用CMP只能是指定ID:FROM XXX TO XXX 条记录,因为事先无法知道第7页的是第75-85条记录,所以很难这样实现分页。只好全部取出来放进一个collection再实现分页。否则能怎么办?