1

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

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

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

如果是这种情况,有什么办法可以解决这个问题。

4

1 回答 1

1

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

解决方案是不使用单例。但是,这并不能真正解决您的问题,因为根据您的问题,您遇到的真正问题是哈希图不断增长。如果您将其用作某种形式的缓存,那么您还需要按时间或大小在缓存上设置某种到期时间,否则它将继续增长,直到您获得 OOM。

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

于 2013-10-16T21:36:17.880 回答