正确的Java 8设置以进行类卸载(Metaspace清理)/ CXF问题

4

我正在我的应用程序中创建动态CXF客户端。

以下是客户端创建的代码片段:

JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient("wsdl/hello.wsdl");

现在,当我使用这些参数设置测试应用程序时:
java -Djava.io.tmpdir=/tmp/cxf -XX:MetaspaceSize=12m -XX:MaxMetaspaceSize=24m -XX:MaxMetaspaceFreeRatio=80 -XX:MinMetaspaceFreeRatio=40 -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=sums=200 -XX:+ParallelRefProcEnabled -XX:+AggressiveOpts -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/hdump.hprof -XshowSettings -jar classloader-leak.jar

当我在循环中执行客户端创建时,我遇到了java.lang.OutOfMemoryError: Metaspace异常。我不知道为什么类没有被卸载/ metaspace没有被清理。如果有人能帮助我,这里是我的测试项目链接:https://github.com/bilak/classloader-leak。只需构建(mvn clean package)并像我一样使用命令行执行即可。我正在使用JDK8u77。

你为什么不能将自己的ClassLoader传递给JaxWsDynamicClientFactory.createClient()并在完成后销毁它呢? - Stackee007
1个回答

2

我认为我在CXF中找到了问题所在。问题是在JaxWsDynamicClientFactory.createClient()内创建的URLClassLoader从未被销毁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接