回答

收藏

有没有办法避免Tomcat中的未部署内存泄漏?

技术问答 技术问答 239 人阅读 | 0 人回复 | 2023-09-12

这个问题适用于 Tomcat 任何测试过发现泄漏按钮并得到以下结果的人:- a" a2 s/ \2 [4 M3 O
以下 Web 应用程序已停止(重新加载、取消部署),但其之前的类别仍在内存中加载,导致内存泄漏(使用分析师确认):
# t4 |2 S, w. `8 U$ V/leaky-app-name
( ?7 h' [0 f0 a3 s% V3 n
我假设这与频繁重新部署时经常遇到的永久空间错误有关。  Z  I; B5 T9 Y: |( c
所以我在部署的时候是 jconsole 我看到的是我加载的类从 2左右k 到 5k。然后你会认为取消部署应该降回 2k,但它们仍然保持在 5k。& ^, G/ j; L7 I+ a+ A. `7 p8 [/ v
我也试着用以下 JVM 选项:
$ b- S/ n) `+ o-XX: CMSClassUnloadingEnabled -XX: UseConcMarkSweepGC -XX: CMSPermGenSweepingEnabled我确实看到了 Perm Gen 使用的空间量很小,但不是我预期的,加载的类数也没有下降。: T' ?8 h- F$ B5 k; i" u% q
有没有办法配置  Tomcat 或者在取消部署时设计您的应用程序以更好地卸载?或者我们是否坚持在一些主要的调试会议后重新启动服务器?
" j' y2 U, B0 pTomcat 版本输出:9 U: W2 U) T# s6 n
Server version: Apache Tomcat/6.0.29
& r) q; f/ H8 Q2 P5 `% Q1 gServer built: July 19 2010 1458
9 |5 p' J8 i8 o9 {& q: dServer number: 6.0.0.292 R' C% ?6 y- ~
OS Name: Windows 7
  ]8 {4 D7 x0 \) QOS Version: 6.1
+ L! @; |8 _. }3 R: }5 C' s# oArchitecture: x86
& i$ I" |, x& Y. m( j; z, AJVM Version: 1.6.0_18-b079 {# ^2 a+ c) d
JVM Vendor: Sun Microsystems Inc.
2 U5 v1 V( }* O
更新:8 t$ \7 i8 M, V% Z  O
多亏了 celias 的回答,我决定做更多的挖掘工作,我想因为 CXF、Spring 和 JAXB,我在我的应用程序中确定了罪魁祸首。
) H& V; K/ N% o( R. ]! `2 ]9 J! B- ?9 B我学会了如何分析 Java 应用程序后,我将分析器指向 Tomcat 并进行了一些堆存储和快照,以查看内存中的对象和类。我在我的 中发现了它CXF/JAXB (wsdl2java) 在生成类中使用 XML 模式中的一些枚举在取消部署后仍然存在。根据我的堆存储,对象似乎被绑定到地图上。免责声明:我承认我的调用树是 Java 可能有挑战性,有些奇怪。
7 |: r; o+ i1 B1 N4 t2 T另外,我应该提到我没有调用服务,只是部署,然后取消部署。对象本身似乎是通过部署从 Spring 发起的反射加载。我相信我遵循了 Spring 中设置 CXF 服务协议。所以我不能确定这是 100% Spring/CXF、JAXB 还是反射错误。$ W0 N5 \6 H4 S% {, M
附带说明:讨论的应用程序是使用 Spring/CXF 的 Web 服务, XML 恰好是一个相当复杂的模式(NIEM的扩展)。# y% w- f7 o; |2 ^9 D
                                                               
5 Y- G8 Q' d$ T4 p6 m8 o3 }    解决方案:                                                               
' X4 ]% R- M% e) S0 k                                                                如果您想确保不会导致泄漏,您必须执行以下操作:
9 k0 c$ }1 s4 \确保您的 Web 不使用 应用程序Web 容器共享库中的任何 Java 类。如果您有任何共享库,请确保没有强烈引用这些库中的对象- X1 h1 |% R( w$ N/ L5 X
避免使用静态变量,特别是在 HashTable、Sets 等 java 对象。如有必要,请确保调用 remove 释放具有映射和列表的对象…
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则