问题描述
我们的生产服务器出现了 OOM,因为 permgen 已满。使用jmap -permstat
查看permgen区域,我们发现com.sun.xml.ws.client.WSSServiceDelegatingLoader
加载了很多类。加载的类是 com.sun.proxy.$ProxyXXX
,其中 XXX
是一个 int 序列。
最终,JVM 出现了 OOM,full gc 无法回收任何永久内存。 奇怪的是,如果我在 VisualVM 中单击 System GC,类将被卸载并且 permgen 的使用率下降。
我们的 JDK 版本是 1.7.0.80,我们添加了 CMSClassUnloadingEnabled
。
-XX:+ExplicitGCInvokesConcurrent
-XX:+UseConcmarkSweepGC
-XX:CMSInitiatingOccupancyFraction=60
-XX:+UseParNewGC
-XX:+CMSParalledlRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSFullGCsBeforeCompaction=0
-XX:+CMSCLassUnloadingEnabled
-XX:MaxTenuringThreshold=18
-XX:+UseCMSInitialtingOccupancyOnly
-XX:SurvivorRatio=4
-XX:ParallecGCThreads=16
我们的代码已经运行了很长时间。最近的操作是 WebLogic 补丁。这真的让我很困惑。有人能帮我解决这个问题吗,非常感谢!
解决方法
这是一个已知错误 https://github.com/javaee/metro-jax-ws/issues/1161
每次创建 JAX-WS 客户端时,例如,使用捆绑在 Weblogic Server 12.1.3 中的库 JAX-WS RI 2.2
$ dpkg -s libboost-dev | grep Version
Version: 1.65.1.0ubuntu1
客户端代理类正在加载到类加载器中:
com.sun.xml.ws.client.WSServiceDelegate$DelegatingLoader#1
解决方案/变通办法: 替换解决此错误的 JAX-WS 客户端。