【问题标题】:Do constant static fields cause memory leak in an web application?常量静态字段会导致 Web 应用程序中的内存泄漏吗?
【发布时间】:2013-10-23 17:29:38
【问题描述】:

我知道静态字段会导致内存泄漏,因为它们不会被 GC。

但是当有一个web应用部署在一个容器中(比如Tomcat)时,每个应用都有自己的ClassLoader,可以取消部署。

我的问题是,垃圾收集器是否声明将要卸载的类的静态成员引用的对象?

最简单的情况是singleton(通过引用self的静态变量实现),如果取消部署应用会被GC吗?

【问题讨论】:

  • 据我所知,静态字段 GCed,如果类是GCed。
  • 好的,但是如果一个类被静态字段引用,它会被 GC 吗?例如在单例中......
  • 如果类被它自己的静态字段引用,那么这不会阻止收集。请记住,如果不命名类,就无法引用单例。命名类(在字符串之外)是一个参考。

标签: java memory-leaks garbage-collection


【解决方案1】:

这可能会回答你的问题:

当应用停止时,Tomcat(甚至在 6.0.24 之前)会使 加载的类的所有静态类变量的值 WebAppClassLoader。在某些情况下,它可能会修复类加载器泄漏(对于 例如,因为自定义 ThreadLocal 类,见上文),但即使 我们仍然有泄漏,它可能会减少丢失的内存量

您可以阅读更多here

干杯!!

【讨论】:

  • static final 字段呢?我相信这是关于非最终静态字段的,不是吗?
  • 提供的链接中的示例是一个final static 字节数组,它如何清理它?
猜你喜欢
  • 2023-04-09
  • 2010-10-13
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多