Java哈希映射和内存泄漏

Java哈希映射和内存泄漏,java,memory-leaks,hashmap,Java,Memory Leaks,Hashmap,我有一个控制台Java应用程序,它需要来自数据库的一些数据。由于应用程序一直在运行,每30秒运行一次,为了降低数据库的压力,我对数据使用了某种缓存 因为数据库中并没有大量需要的数据,所以我使用singleton Hashmap作为缓存。我的缓存类如下所示: public class Cache extends Hashmap<Integer, Hashmap<Integer, ArrayList<String>> { //some code } 公共类缓存扩展Ha

我有一个控制台Java应用程序,它需要来自数据库的一些数据。由于应用程序一直在运行,每30秒运行一次,为了降低数据库的压力,我对数据使用了某种缓存

因为数据库中并没有大量需要的数据,所以我使用singleton Hashmap作为缓存。我的缓存类如下所示:

public class Cache extends Hashmap<Integer, Hashmap<Integer, ArrayList<String>> {
//some code
}

公共类缓存扩展Hashmap您可以这样做,但我建议更好的替代方法是替换它。如果有多个线程,这将更有效

public class Cache {
     private Map<Integer, Map<Integer, List<String>>> map;

     public Cache(args) {
     }

     public synchronized Map<Integer, Map<Integer, List<String>>> getMap() {
          return map;
     }

     // called by a thread every 30 seconds.
     public void updateCache() {
          Map<Integer, Map<Integer, List<String>>> newMap = ...
          // build new map, can take seconds.

          // quickly swap in the new map.
          synchronzied(this) {
              map = newMap;
          }
     }
}
公共类缓存{
私人地图;
公共缓存(args){
}
公共同步映射getMap(){
返回图;
}
//每30秒由线程调用一次。
公共void updateCache(){
Map newMap=。。。
//创建新地图,可能需要几秒钟。
//快速交换新地图。
同步化(本){
map=newMap;
}
}
}

这是线程安全的,并且影响最小。

本文对您很有帮助

而且,HassMap不是线程安全的。
如果您想使用singleton HashMap,最好使用ConcurrentHashMap。

简短回答:Yes clear()非常适合。长答案(看起来是重复的):它释放了映射中的键/值对象,但保留了备份数组/表。听起来像是内存泄漏。您是否确保所有与db相关的对象都不会引用hashmaps中的项。。。e、 g.
ResultSet
,ETCI构建新映射时创建的映射a
ConcurrentHashMap
?似乎需要确保这个线程的安全。只有在阅读和写作时,才需要ConcurrentMap。在这种情况下,它只是写入,而在同步块之后,它只是读取。不需要更多的锁/线程安全性。啊,我看到您只在从数据库构建映射时写入映射,然后将其包装在一个
不可修改的映射中。但是,您是否没有遇到内存泄漏问题?如果用户将
getMap()
返回的引用分配给某个变量,那么在
updateCache
之后它将不会得到GCed。您不应该有任何
getMap()
方法。根据封装原则,您希望使用映射隐藏确切的实现。缓存类应该有一些
get(Integer key)
方法来访问数据。@Xean+1,尽管它可能是
getList(int-key1,int-key2)
或者甚至是列表元素的访问者。