iteye_16970 2013-04-09 20:36
浏览 410
已采纳

Java 内存泄漏问题

因为系统有内存泄露问题,导致频繁的Full GC,用jmap将内存使用情况dump下来,然后通过mat分析了一下,发现是由于缓存map和更新该map的线程池导致的,截图见附件,下面这个是涉及到的类,研究了好几天这个问题,现在终于定位到具体的代码,耐于经验有限,想请教一下大家都是怎么处理系统中缓存数据的,有闲暇时间的帮看下下面的代码应该如何修改。。

还有个问题就是,定时更新run()里的程序总是不会立即执行,scheduleAtFixedRate的第二个参数设为0也不管用,只有这次执行完,下次再走这儿时cacheMap里才有上次的数据。所以只好在外面再执行一遍,总觉得这么写很奇怪

[code="java"]
public class CachedDataManager extends DataManagerDecorator {

private static ScheduledExecutorService pool;
private long timeLimited;//缓存中数据更新间隔时间 60s
private int poolSize;//线程池大小,20
private static int cacheSize;
public static Map cacheMap;// = new HashMap();

public Object getResult(final String methodName, final Map parameterMap) {

if (cacheMap == null) {
  synchronized (CachedDataManager.class) {
    if (cacheMap == null) {
      cacheMap = new ConcurrentLinkedHashMap.Builder()
             .maximumWeightedCapacity(cacheSize).build();
   }
 }
}

// 根据HashCode生成缓存map的key
final String mapKey = new KeyCreater(methodName, parameterMap)
                   .getHashCode();

// 缓存中没有该条数据则放入有定时更新策略的线程池
if (!cacheMap.containsKey(mapKey)) {

  if (pool == null) {
     pool = Executors.newScheduledThreadPool(poolSize);
  }
  pool.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {

      Object obj = dataManager.getResult(methodName, parameterMap);
      cacheMap.put(mapKey, obj);

     }
   }, 0, timeLimited, TimeUnit.SECONDS);
 } else if (cacheMap.get(mapKey) != null) {
   return cacheMap.get(mapKey);
 }
            //因为上面的不会立即执行,所以第一次查询执行这里
  Object obj = dataManager.getResult(methodName, parameterMap);
  cacheMap.put(mapKey, obj);

  return cacheMap.get(mapKey);
  }

}

[/code]

  • 写回答

3条回答 默认 最新

  • a1000005aa 2013-04-11 09:37
    关注

    看你的截图,有153个对象在每隔60秒调用一次缓存更新,也就是说有153个Key.

    你的线程池只有25个,可能就排到delayQueue上去了,解决方案就是增加线程池的大小,而且你这个线程根据key只会增加不会减少。

    所以想要彻底解决问题,需要重新设计缓存的方案.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办