怎么使java里面不再有tomcat_java-有没有办法避免Tomcat中取消部署内存泄漏?

该问题适用于曾经在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的扩展)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值