当前位置: 首页 > Java > 正文

java内存持续上涨问题解决

1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

最近在对项目做性能测试,发现的问题是:在LoadRunner压力测试过程中,内存持续上涨,接口调用返回速度越来越慢,最终内存溢出。

检查代码过程中,发现有以下一段代码:

while(true){
      List<Map<String,Long>> list=new ArrayList<Map<String,Long>>(1024);
      //批量从queue获取对象到list。
      //queue=ArrayBlockingQueue
      //queue.drainTo(list)
      把list交给线程池处理,做一些处理。
}

怀疑在循环过程中,不停new list对象,而list在线程处理后,gc未及时回收,导致内存逐渐上涨。
刚开始把list放在外面。这样的好处是每次只生成一个对象。并在thread处理结束后把list元素清除,并置为null。测试后,问题依旧。

//thread
list.clear();
list=null;

最后解决方法:把list放置在弱引用中,使用完成后及时清除并置为null,这样gc就能及时回收。

WeakReference<List<Map<String,Long>>> weakReference=new WeakReference<List<Map<String,Long>>>(list);
 
//thread 用
weakReference.get();获取到list
用完之后:
list.clear();
list=null;
weakReference.clear();
weakReference=null;

在测试过程中发现redis的hincy(key,field,value)性能还是很不错的,基本都做0毫秒之内返回。符合我们的预期。

本文固定链接: http://www.chepoo.com/java-memory-rising-problem-solving.html | IT技术精华网

【上一篇】
【下一篇】

java内存持续上涨问题解决:等您坐沙发呢!

发表评论