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

有没有办法避免在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/



 类似资料:
  • 问题内容: 该问题适用于曾经在Tomcat管理器中测试过“发现泄漏”按钮并获得如下结果的任何人: 以下Web应用程序已停止(重新加载,取消部署),但它们先前运行的类仍被加载到内存中,从而导致内存泄漏(使用探查器进行确认): / leaky-app-name 我假设这与您经常进行重新部署时经常遇到的“ Perm Gen space”错误有关。 因此,当我部署时在jconsole中看到的是加载的类从大

  • 我有一个PDF文件,里面有海量的xmp元数据,当我用itext7处理它的时候,程序卡在语句查看源代码,发现在Pdffile对象的构造函数中执行了open(null)方法,最后卡在了并且没有避免它的选项,xmp元数据对我来说毫无用处。 有了itextSharp,基于PDF/A上的删除XMP元数据,我可以得到一个没有元数据的pdf文件。 我试图创建PdfReader或PdfDocument的子类,试图

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

  • 有没有办法在Docker内部运行LXD?eg. 在使用ubuntu 16.04的主机上: 在容器中: LXD守护进程可以工作,但由于cgroups错误,我无法启动LXD容器。 我也尝试过:

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文

  • 我正在编写一个JavaFractal Explorer,分形计算是多线程完成的。以前,我只是创建了一堆线程(系统有多少处理器内核就有多少)并将它们保存在一个数组中,但这会导致一些问题,而且不是很优雅,现在我想切换到执行器。 我需要的功能是: 用户可以随时选择要放大的分形图像的新区域,因此应该可以随时取消计算,并立即重新插入新任务 我的问题是Java ExecutorService(我使用Execu

  • 好的,所以我有一个小问题,扫描器前进了一条额外的线。我有一个文件,其中有许多行包含整数,每行由一个空格分隔。文件中的某个地方有一行没有整数,只有单词“done”。当发现完成时,我们退出循环并打印出小于每行中每个给定整数的最大素数整数(如果整数已经是素数,则不对其进行任何处理)。我们一直这样做,直到“完成”为止。 我的问题:假设文件包含6行,第6行是完成这个词。我的输出将跳过第1、3和5行。它只会返

  • 本文向大家介绍避免 Android中Context引起的内存泄露,包括了避免 Android中Context引起的内存泄露的使用技巧和注意事项,需要的朋友参考一下 Context是我们在编写Android程序经常使用到的对象,意思为上下文对象。 常用的有Activity的Context还是有Application的Context。Activity用来展示活动界面,包含了很多的视图,而视图又含有图片