只想知道我是否有具有非静态地图的单例对象。为什么地图中的对象将进入pergem空间而不是堆中。我可以从Visual VM中看到Map Pergem空间中的对象间隔正在增加。
我所知道的只是静态变量,类在pergem空间中,所有对象应该进入堆。
这是因为单例模式,其中单例对象是静态的,因此引用指向堆但仍然具有pergem中的保留大小?
如果是这种情况,对这个问题的补救措施是什么。
答案 0 :(得分:1)
你的问题的答案是:是的。具体来说,任何时候[1]你直接或间接地从一个静态变量引用一个对象,那么该对象就不能被垃圾收集,并最终会进入permgen。
解决方案是不使用单身人士。但是,这并不能真正解决您的问题,因为基于您的问题,您遇到的真正问题是hashmap不断增长。如果您使用它作为某种形式的缓存,那么您还需要在缓存上设置某种过期,无论是按时间还是大小,否则它将继续增长,直到您获得OOM。
[1]或多或少是真的,在某些类加载器技巧的存在下可能不是这样。