只想知道我是否有具有非静态映射的单例对象。为什么地图中的对象要进入空间而不是堆中。我可以从Visual VM中看到,在Map pergem空间中对象之间的连接不断增加。
我所知道的只是静态变量,并且类进入了pergem空间,其余所有对象都应该进入堆。
是否由于单例模式而导致单例对象是静态的,因此引用指向堆,但仍保留pergem中的大小?
如果是这样的话,该问题的解决方法是什么。
最佳答案
您的问题的答案是:是的。具体来说,在任何时候[1]直接或间接从静态变量引用对象时,都无法对该对象进行垃圾回收,并最终使其进入permgen。
解决方案是不使用单例。但是,这并不能真正解决您的问题,因为根据您的问题,您真正遇到的问题是哈希图不断增长。如果将其用作某种形式的缓存,则还需要按时间或大小在缓存上设置某种过期时间,否则它将持续增长,直到获得OOM。
[1]或多或少是对的,在某些类加载器技巧的存在下,情况可能并非如此。