Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83127
  • 博文数量: 9
  • 博客积分: 1529
  • 博客等级: 上尉
  • 技术积分: 113
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-16 02:14
文章分类

全部博文(9)

文章存档

2011年(5)

2010年(4)

我的朋友

分类: Java

2011-07-09 23:25:14

Java Out Of Memory历险记


          前面一段时间开发的Master-Slave框架,最近进行了修改,也找到了一个使用场景,但是部署侯发现了一个严重的问题,Slave端狂报Out Of Memory异常,我就感觉到纳闷了,百思不得其解,就想到利用jprofiler来查查问题的所在。
         
          这一张是Slave端的问题解决之前的内存情况:
        
       很明显前4位内存耗子,考虑到代码,定位在Command类生成太多了,然后去查找到底哪里可以产生这么多的Command类,这相当容易定位了。
 
        最终定位是这块代码:
  1. @Override
  2.     public void run() {
  3.         try{
  4.             while(runningFlag){
  5.                 Command command = commandProvider.produce();
  6.                 if(command != null) {
  7.                     netWorkClient.send(command);
  8.                 }
  9.             }
  10.         }catch(Exception e) {
  11.             e.printStackTrace();
  12.             stop();
  13.         }
  14.     }
       这是一个线程,不停的生存Command,并发送给Master, 由于CommandProvider实现类里对生成Command没有限制,我当时是这样想的由CommandProvider实现类里对生成Command的速度进行限制,但是做的时候,并没。

        思考了侯,还是由Slave来限制Command的生成速度靠谱一些。
简单的加了一行代码,线程睡眠一段时间,效果相当的好,当然这只是简单的实现,可能还需要更好的解决方案。
  1. @Override
  2.     public void run() {
  3.         try{
  4.             while(runningFlag){
  5.                 Command command = commandProvider.produce();
  6.                 Thread.currentThread().sleep(10000);
  7.                 if(command != null) {
  8.                     netWorkClient.send(command);
  9.                 }
  10.             }
  11.         }catch(Exception e) {
  12.             e.printStackTrace();
  13.             stop();
  14.         }
  15.     }

      简单的处理了一下,jprofiler展示的Slave端内存使用正常了



     感慨,写了这么多年的代码,终于用上了jprofiler了,这个对查找Out Of Memory还真好使。
阅读(1081) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

tianbianfei2011-07-12 16:19:01

牛人,俺刚从java转android,请教高手一个问题:大家快来参与讨论吧:http://doumiw.com/market/community/t!showTopic.do?topicId=24