java - Web 应用程序中的静态变量是否会导致内存泄漏(以及 OutOfMemory)?
问题描述
静态变量以这种方式被垃圾收集:
静态变量由 ClassLoaders 引用的 Class 对象引用。所以,静态变量只有在加载了静态字段所在类的类加载器在java中被垃圾回收时才会被垃圾回收。
因此,假设有一个 Web 应用程序和 Tomcat 管理它。在特定应用程序中存在静态变量,这些变量会被多次主动重新部署。
由于类加载器在重新部署时没有被 GC,静态变量是否保留在元空间中?
解决方案
关键是:显然一个类在使用时不能被“垃圾收集”。
但随后事情变得特定于实现:当 tomcat 重新部署应用程序时,这是通过丢弃现有的类加载器来完成的。tomcat 尽其所能完全“忘记”那个旧的类加载器以及它加载的类是合乎逻辑的!
所以当那个类加载器变成垃圾时,它加载的所有东西都变成垃圾,也有资格被收集。
并引用他们的文档:
WebappX — 为部署在单个 Tomcat 实例中的每个 Web 应用程序创建一个类加载器。Web 应用程序的 /WEB-INF/classes 目录中的所有解压类和资源,以及 Web 应用程序的 /WEB-INF/lib 目录下的 JAR 文件中的类和资源,对这个 Web 应用程序可见,但不给其他人。
但事实证明,整个讨论有点复杂,我建议你从这里和那里开始阅读。
本质上,故事是这样的:重新部署应用程序会导致丢弃其类加载器,并创建一个新的类加载器。但是这里仍然有可能造成内存泄漏。
推荐阅读
- python - Pandas groupby 多列然后子图
- c - 试图尝试cs50中的可读性问题。无法计算字符串中的字母
- javascript - 创建一个函数 funcA,它接收一个数字数组并在 2 秒后返回它们的总和
- pine-script - 我不能每隔几个柱计算一个系列值,它是一个错误吗?
- android - marquee_forever 不适用于 Android 10
- django - 如何在模板中显示所有子对象?
- c# - 将整数写入 OPC UA 服务器 - “不同类型”错误
- scala - 方法 my_udf 有返回语句;需要结果类型
- reactjs - 使用 HTTP 请求反应路由器嵌套路由 v5
- c++ - 在 CMake 中为 CPLEX 传递链接器标志