静态成员的生命周期是否与应用程序保持一致,而不管 HeavyClass 的实例发生了什么。
差不多,是的。请参阅 BevnQ 的答案。
如果静态将自身与未被垃圾收集的类加载器内存(permgen)对齐......
虽然类的静态框架(通常)在 permgen 中分配:
- permgen memory >>is<< 垃圾收集,并且
- 静态框架中的对象引用(例如,arraylist)未在 permgen 中分配。
然而,这些事实都没有真正改变任何东西......除非您的应用程序确实成功地处理了加载相关类的类加载器。
确保这样的对象仅在需要的基础上使用(并清理成员)的编程习惯是什么;假设我们必须有一个静态要在所有实例之间共享)
问题是知道何时不再需要这些成员。如果可以重新生成成员,则可以使用弱引用实现缓存。这是一个常见的解决方案,并且工作得相当好,尽管您可能希望限制缓存大小。(无限缓存会消耗大量内存,这些内存更适合用于其他用途。您不会获得 OOME,但最终会更频繁地运行 GC。)
否则,您将需要实现某种引用计数机制,并希望共享数据结构的所有“客户”都遵守规则……一直。这不是一个好的解决方案。
我的建议是弄清楚如何避免使用永久“根可访问”的静态或(更一般地)大型共享数据结构。