Per Gem单例模式的内存不足

时间:2013-10-16 17:49:41

标签: java performance out-of-memory

只想知道我是否有具有非静态地图的单例对象。为什么地图中的对象将进入pergem空间而不是堆中。我可以从Visual VM中看到Map Pergem空间中的对象间隔正在增加。

我所知道的只是静态变量,类在pergem空间中,所有对象应该进入堆。

这是因为单例模式,其中单例对象是静态的,因此引用指向堆但仍然具有pergem中的保留大小?

如果是这种情况,对这个问题的补救措施是什么。

1 个答案:

答案 0 :(得分:1)

你的问题的答案是:是的。具体来说,任何时候[1]你直接或间接地从一个静态变量引用一个对象,那么该对象就不能被垃圾收集,并最终会进入permgen。

解决方案是不使用单身人士。但是,这并不能真正解决您的问题,因为基于您的问题,您遇到的真正问题是hashmap不断增长。如果您使用它作为某种形式的缓存,那么您还需要在缓存上设置某种过期,无论是按时间还是大小,否则它将继续增长,直到您获得OOM。

[1]或多或少是真的,在某些类加载器技巧的存在下可能不是这样。

相关问题