【问题标题】:Does static variables in web applications lead to memory leak (and OutOfMemory in perspective)?Web 应用程序中的静态变量是否会导致内存泄漏(以及 OutOfMemory)?
【发布时间】:2023-04-09 18:31:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 感谢您的快速回归。

标签: java tomcat web-applications memory-leaks garbage-collection


【解决方案1】:

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

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

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

并引用他们的documentation

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

但事实证明,整个讨论有点复杂,我建议你开始阅读herethere

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

【讨论】:

  • 您确定 Tomcat 不使用同一个类加载器来加载多个 Web 应用程序吗? (我不知道顺便说一句...)
  • 当然,我确信在 Tomcat 中也可以。但是最近我在面试中被问到我是否在网络应用程序中使用静态变量,以及在多次重新部署 LOL 时是否遇到过内存不足错误。我说不)))但我现在很感兴趣......
  • 你链接到Reloading Java Classes 201: How do ClassLoader leaks happen?。那篇文章很好地解释了这个问题,但它是在 8 年前写的。你知道给出的解释是否仍然有效吗?我想我可以通过运行代码自己找出答案,但我想我会先选择惰性选项...
  • @skomisa 我知道。你看,这个答案并没有获得很多观点或支持。我看到这篇文章很老了,但是快速搜索并没有发现太多更新的信息。如前所述:这是相当成熟的技术,不再是炒作。人们只是使用它,它有效,没有更多的大讨论......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多