2016-03-30 8 views
4

私のアプリケーションで動的CXFクライアントを作成しています。クラスアンロード用の正しいJava 8セットアップ(メタスペースクリーンアップ)/ cxfの問題

これはクライアント作成のコードスニペットです:これで私は、セットアップのテストアプリケーションが

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 

を偶然に、ループ内のクライアントの作成を実行したとき

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

今、私は、javaを取得しています。 lang.OutOfMemoryError:メタスペース例外。なぜ私はクラスがアンロードされていない/メタスペースがクリーンアップされているのかわかりません。誰かが私を助けることができる場合hereは私のテストプロジェクトです。私が行ったように(mvn clean package)それをビルドしてコマンドラインで実行してください。

私はJDK8u77を使用しています。

+0

自分の 'ClassLoader'を' JaxWsDynamicClientFactory.createClient() 'に渡せず、終了したらそれを破壊する理由は何ですか? – Stackee007

答えて

2

CXFに問題が見つかりました。問題は、JaxWsDynamicClientFactory.createClient()の内部で作成されたURLClassLoaderは決して破棄されないということです。