回答

收藏

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

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

这个问题适用于 Tomcat 任何测试过发现泄漏按钮并得到以下结果的人:
: T& m1 H! A) X) s9 [以下 Web 应用程序已停止(重新加载、取消部署),但其之前的类别仍在内存中加载,导致内存泄漏(使用分析师确认):
; C& k0 [* L0 j0 d  n/leaky-app-name
; ]/ O* Z2 }$ a7 U3 P( n
我假设这与频繁重新部署时经常遇到的永久空间错误有关。
# b& [( i: O( A, c所以我在部署的时候是 jconsole 我看到的是我加载的类从 2左右k 到 5k。然后你会认为取消部署应该降回 2k,但它们仍然保持在 5k。
( M; L, c- d" I& D# j# m0 M. u我也试着用以下 JVM 选项:
; t$ P- e# H* q' O5 Z- I-XX: CMSClassUnloadingEnabled -XX: UseConcMarkSweepGC -XX: CMSPermGenSweepingEnabled我确实看到了 Perm Gen 使用的空间量很小,但不是我预期的,加载的类数也没有下降。
, i  U3 C3 V1 j1 C5 S# d有没有办法配置  Tomcat 或者在取消部署时设计您的应用程序以更好地卸载?或者我们是否坚持在一些主要的调试会议后重新启动服务器?
7 j1 ?" E( q1 t9 _# Z5 iTomcat 版本输出:
: G# D8 w& D9 D# R& yServer version: Apache Tomcat/6.0.295 Y; |' S1 i. Q. f" X  l# j0 M$ o
Server built: July 19 2010 1458
- u+ n6 r3 o: C9 G2 d9 b( JServer number: 6.0.0.29
$ j) h7 l) ]& F* |6 A! C! o8 [! C) mOS Name: Windows 78 v! q, S" y  l6 ]- ^
OS Version: 6.13 G; ^4 Z6 Q! [+ f8 V) ^/ I$ }
Architecture: x86
4 x' z' x+ _, O' R& J/ C3 ]JVM Version: 1.6.0_18-b070 d# Q: M  u7 s0 U) _. a) F
JVM Vendor: Sun Microsystems Inc.
4 o" N' C9 }+ f' D$ t
更新:6 N1 x2 F& J6 o6 I3 ^3 I
多亏了 celias 的回答,我决定做更多的挖掘工作,我想因为 CXF、Spring 和 JAXB,我在我的应用程序中确定了罪魁祸首。
. o( L, f% @9 o& E5 }我学会了如何分析 Java 应用程序后,我将分析器指向 Tomcat 并进行了一些堆存储和快照,以查看内存中的对象和类。我在我的 中发现了它CXF/JAXB (wsdl2java) 在生成类中使用 XML 模式中的一些枚举在取消部署后仍然存在。根据我的堆存储,对象似乎被绑定到地图上。免责声明:我承认我的调用树是 Java 可能有挑战性,有些奇怪。
3 ~4 ]+ @2 ~. U% ?7 t另外,我应该提到我没有调用服务,只是部署,然后取消部署。对象本身似乎是通过部署从 Spring 发起的反射加载。我相信我遵循了 Spring 中设置 CXF 服务协议。所以我不能确定这是 100% Spring/CXF、JAXB 还是反射错误。
5 b' s/ A0 @3 N0 D& k附带说明:讨论的应用程序是使用 Spring/CXF 的 Web 服务, XML 恰好是一个相当复杂的模式(NIEM的扩展)。! F( c( d% r* ~' ^6 c) b) e" N& M
                                                                ! ^, z2 M% x5 y( a1 z, G/ R) C, S
    解决方案:                                                               
0 i, T1 Z9 R8 ~0 I/ T                                                                如果您想确保不会导致泄漏,您必须执行以下操作:
2 ?# z. J( Y0 D' j! j确保您的 Web 不使用 应用程序Web 容器共享库中的任何 Java 类。如果您有任何共享库,请确保没有强烈引用这些库中的对象2 b% F" O' I( L% V, [1 ], `7 A  s
避免使用静态变量,特别是在 HashTable、Sets 等 java 对象。如有必要,请确保调用 remove 释放具有映射和列表的对象…
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则