记CXF中的一次Non-Heap内存泄露

最近遇到一个WebService内存泄露的问题。使用jconsole连接后发现非堆内存和loaded classes在每次执行full GC后都会增长。classes增长的非常有规律,每次增加5000个左右。

因为CXF中使用了JAXB,怀疑是JAXB被多次实例化造成的。然后使用MAT,查找Duplicate Classes,不过MAT显示没有Duplicate Classes。

没办法,改用JVM参数追踪
* -XX:+TraceClassLoading
* -XX:+TraceClassUnloading
在trace日志中确认就是WebService相关的那些classes被多次加载了

剩下的问题就是调查哪里的JAXB被重复实例化了。跟踪发现CXF使用一个CacheMap来存储构造过的WebService类。

private static final Map<Set<Class<?>>, CachedContextAndSchemas> JAXBCONTEXT_CACHE 
    = new CacheMap<Set<Class<?>>, CachedContextAndSchemas>();

........

    synchronized (JAXBCONTEXT_CACHE) {
        cachedContextAndSchemas = JAXBCONTEXT_CACHE.get(classes);
    }
    if (cachedContextAndSchemas == null) {
        JAXBContext ctx = JAXBContext.newInstance(classes.toArray(new Class[classes.size()]), map);
        cachedContextAndSchemas = new CachedContextAndSchemas(ctx);
        synchronized (JAXBCONTEXT_CACHE) {
            JAXBCONTEXT_CACHE.put(classes, cachedContextAndSchemas);
        }
    }

CacheMap中的key是weak references,value是strong references。所以GC时候会回收对应的key,但是schema仍存留在内存中。一旦在cache中没有发现key,就会重新实例化!!

解决方法也很简单,JAXBCONTEXT_CACHE使用HashMap就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以在你的pom文件添加以下依赖配置: ``` <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-bindings-soap</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-bindings-xml</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-databinding-jaxb</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-simple</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-ws-addr</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-ws-policy</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-wsdl</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.3</version> </dependency> <dependency> <groupId>xml-resolver</groupId> <artifactId>xml-resolver</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.ws.xmlschema</groupId> <artifactId>xmlschema-core</artifactId> <version>2.2.5</version> </dependency> </dependencies> ``` 请注意,这些依赖的版本可能会随着时间的推移而更新。建议在使用这些依赖时,查阅官方文档以获取最新版本信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值