Java Out Of Memory历险记
前面一段时间开发的Master-Slave框架,最近进行了修改,也找到了一个使用场景,但是部署侯发现了一个严重的问题,Slave端狂报Out Of Memory异常,我就感觉到纳闷了,百思不得其解,就想到利用jprofiler来查查问题的所在。
这一张是Slave端的问题解决之前的内存情况:
很明显前4位内存耗子,考虑到代码,定位在Command类生成太多了,然后去查找到底哪里可以产生这么多的Command类,这相当容易定位了。
最终定位是这块代码:
- @Override
-
public void run() {
-
try{
-
while(runningFlag){
-
Command command = commandProvider.produce();
-
if(command != null) {
-
netWorkClient.send(command);
-
}
-
}
-
}catch(Exception e) {
-
e.printStackTrace();
-
stop();
-
}
-
}
这是一个线程,不停的生存Command,并发送给Master, 由于CommandProvider实现类里对生成Command没有限制,我当时是这样想的由CommandProvider实现类里对生成Command的速度进行限制,但是做的时候,并没。
思考了侯,还是由Slave来限制Command的生成速度靠谱一些。
简单的加了一行代码,线程睡眠一段时间,效果相当的好,当然这只是简单的实现,可能还需要更好的解决方案。
- @Override
-
public void run() {
-
try{
-
while(runningFlag){
-
Command command = commandProvider.produce();
-
Thread.currentThread().sleep(10000);
-
if(command != null) {
-
netWorkClient.send(command);
-
}
-
}
-
}catch(Exception e) {
-
e.printStackTrace();
-
stop();
-
}
-
}
简单的处理了一下,jprofiler展示的Slave端内存使用正常了
感慨,写了这么多年的代码,终于用上了jprofiler了,这个对查找Out Of Memory还真好使。
阅读(1144) | 评论(1) | 转发(0) |