首页 > 解决方案 > Web 应用程序中的静态变量是否会导致内存泄漏(以及 OutOfMemory)?

问题描述

静态变量以这种方式被垃圾收集:

静态变量由 ClassLoaders 引用的 Class 对象引用。所以,静态变量只有在加载了静态字段所在类的类加载器在java中被垃圾回收时才会被垃圾回收。

因此,假设有一个 Web 应用程序和 Tomcat 管理它。在特定应用程序中存在静态变量,这些变量会被多次主动重新部署。

由于类加载器在重新部署时没有被 GC,静态变量是否保留在元空间中?

标签: javatomcatweb-applicationsmemory-leaksgarbage-collection

解决方案


关键是:显然一个类在使用时不能被“垃圾收集”。

但随后事情变得特定于实现:当 tomcat 重新部署应用程序时,这是通过丢弃现有的类加载器来完成的。tomcat 尽其所能完全“忘记”那个旧的类加载器以及它加载的类是合乎逻辑的!

所以当那个类加载器变成垃圾时,它加载的所有东西都变成垃圾,也有资格被收集。

并引用他们的文档

WebappX — 为部署在单个 Tomcat 实例中的每个 Web 应用程序创建一个类加载器。Web 应用程序的 /WEB-INF/classes 目录中的所有解压类和资源,以及 Web 应用程序的 /WEB-INF/lib 目录下的 JAR 文件中的类和资源,对这个 Web 应用程序可见,但不给其他人。

但事实证明,整个讨论有点复杂,我建议你从这里那里开始阅读。

本质上,故事是这样的:重新部署应用程序会导致丢弃其类加载器,并创建一个新的类加载器。但是这里仍然有可能造成内存泄漏。


推荐阅读