当前位置: 首页 > 知识库问答 >
问题:

常量静态字段会导致Web应用程序中的内存泄漏吗?

卓学智
2023-03-14

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

但是,当有一个 Web 应用程序部署在容器(例如 Tomcat)中时,每个应用程序都有自己的 ClassLoader,并且可以取消部署。

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

最简单的情况是单例(由引用自身的静态变量实现),如果应用程序被取消部署,它会被GCed吗?

共有1个答案

袁羽
2023-03-14

这可能会回答您的问题:

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

你可以在这里阅读更多

干杯!!

 类似资料:
  • 静态变量以这样的方式进行垃圾收集: 静态变量由类对象引用,类对象由类加载器引用。所以,静态变量只是在加载了静态字段所在的类的类加载器在java中被垃圾收集时才被垃圾收集。 因此,假设一个web应用程序和Tomcat管理它。在一个特定的应用程序中存在静态变量,该应用程序被多次主动重新部署。 静态变量是否保留在元空间中,因为类加载器在重新部署时尚未进行GC处理?

  • 我有一个运行在Tomcat7上的Java web应用程序出现内存泄漏。在负载下(使用JConsole确定),应用程序的平均内存使用量随时间线性增加。在内存使用达到稳定期后,性能会显著下降。响应时间从大约100ms到[300ms,2500ms],所以这实际上导致了真正的问题。 使用VisualVM,我看到至少一半的内存被字符数组(即char[])使用,而且大多数字符串(每个实例的数量大致相同,为30

  • 我有一些和等,但是我没有设置。你觉得会是那样吗? 你有什么想法或建议吗? PS:该应用程序在Ubuntu机器上运行 多谢.

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 我正在调试一个我在Tomcat应用程序中多年来遇到的问题——由于Webapp类加载器无法通过气相色谱重新启动应用程序时导致的内存泄漏。我用JProfiler对堆进行了快照,似乎至少我的一些静态变量没有被释放。 某些类有一个静态 final 成员,该成员在首次加载类时初始化,并且因为它是 final,所以我无法在应用程序关闭时将其设置为 null。 静态最终变量是Tomcat中的反模式,还是我错过了

  • 问题内容: 如果我的应用程序具有太多的静态变量或方法,则按照定义,它们将存储在堆中。如果我错了请指正我 1)这些变量会在应用程序关闭之前一直在堆上吗? 2)他们随时可以用于GC吗?如果不能,那是内存泄漏吗? 问题答案: 静态方法只是方法,它们不存储在堆中,只是不使用“ this”参数。 静态变量充当GC的“根”。结果,除非您将它们显式设置为null,否则它们将一直存在,只要程序处于活动状态,那么它