当前位置: 首页 > 面试题库 >

有没有一种方法可以避免在Tomcat中取消部署内存泄漏?

权浩邈
2023-03-14
问题内容

该问题适用于曾经在Tomcat管理器中测试过“发现泄漏”按钮并获得如下结果的任何人:

以下Web应用程序已停止(重新加载,取消部署),但它们先前运行的类仍被加载到内存中,从而导致内存泄漏(使用探查器进行确认):
/ leaky-app-name

我假设这与您经常进行重新部署时经常遇到的“ Perm Gen space”错误有关。

因此,当我部署时在jconsole中看到的是加载的类从大约2k到5k。然后,您会认为取消部署应将其降为2k,但仍为5k。

我还尝试使用以下JVM选项:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled

我的确看到使用的Perm Gen的空间有很小的下降,但是没有达到我的预期,加载的类数也没有下降。

那么,有没有一种方法可以配置Tomcat或设计您的应用程序以在取消部署时更好地卸载呢?还是在进行一些主要的调试会话后重新启动服务器

Tomcat版本输出:

服务器版本:Apache Tomcat / 6.0.29
服务器内置:2010年7月19日1458
服务器编号:6.0.0.29
操作系统名称:Windows 7
操作系统版本:6.1
体系结构:x86
JVM版本:1.6.0_18-b07
JVM供应商:Sun Microsystems Inc.

更新:

多亏了celias的回答,我决定做一些进一步的挖掘,并且我想我要确定应归咎于CXF,Spring和JAXB的罪魁祸首。

在学习了如何对Java应用程序进行概要分析之后,我将概要分析器指向了Tomcat,并进行了一些堆转储和快照以查看对象和类在内存中的外观。我发现在取消部署后,我的CXF
/
JAXB(wsdl2java)生成的类中使用的XML模式中的一些枚举仍然存在。根据我的堆转储,看起来对象已绑定到Map。免责声明:我承认,使用Java进行性能分析和跟踪对象的调用树仍然有些困难。

我还要提到的是,我什至没有调用服务,只是部署然后取消部署。对象本身似乎是通过Spring在部署时启动的反射来加载的。我相信我遵循在Spring中设置CXF服务的约定。因此,我不确定100%是否是Spring
/ CXF,JAXB或反射的错误。

附带说明一下:所涉及的应用程序是使用Spring /
CXF的Web服务,而XML恰好是一个相当复杂的架构(NIEM的扩展)。


问题答案:

如果要确保不引起泄漏,则必须执行以下操作:

  • 确保您的Web应用程序不使用Web容器共享库中的任何Java类。如果您有任何共享库,请确保在这些库中没有对对象的强引用
  • 避免使用静态变量,尤其是在诸如HashTable,Sets之类的java对象上。如果需要,请确保调用remove来释放带有地图,列表的对象。

这里也是对的ThreadLocal和MemoryLeaks的好文章-
http://blog.arendsen.net/index.php/2005/02/22/threadlocals-and-memory-leaks-
revisited/



 类似资料:
  • 问题内容: 所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下: 在倒数第二行中,从不释放而是返回,是否会导致最终的内存泄漏?反正有解决这个问题的方法吗? 还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“ errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的

  • WebAppClassLoader clearThreadLocalMap 严重:web应用程序[]创建了一个ThreadLocal,其键类型为[com.sun.xml.bind.v2.runtime.Coordinator$1],值类型为[com.sun.xml.bind.v2.runtime.Coordinator[]],但在web应用程序停止时未能删除它。这很有可能造成内存泄漏。 它显示了三

  • Go的范围可以在地图和切片上迭代,但我想知道是否有一种方法可以在一系列数字上迭代,比如: 或者有没有一种方法来表示Go中的整数范围,就像Ruby对类范围所做的那样?

  • 问题内容: 有没有一种方法可以在Java中随机获取HashMap的值? 问题答案: 这有效: 如果您希望随机值不是类型,只需在最后一行添加强制类型转换即可。因此,如果声明为: 最后一行可以是: 下面的代码 无效 ,总是返回s 数组,不能将其强制转换为。

  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。