2016-10-17 21 views
2

Googleのメソッドを参照してクラスローダーのリークを解決する方法はありますが、クラスローダーのリークは何ですか?クラスローダのリークは何ですか?

Person person = new Person()人物クラスをロードすると、Personクラスはloader.Personクラスオブジェクトによってロードされます。メタスペース(java 8以前は永続化されます)オブジェクト)はアプリケーションのどこにも使用されません。メモリリークと見なされますか?

答えて

0

クラスローダーを作成しない場合は、クラスローダーのリークが発生しません。

時間の経過とともに複数のクラスローダーを作成し、古いクラスローダーのすべてのクラスがガベージコレクションされると予想される場合、クラスローダーのリークが発生します。この種の最も一般的なシナリオは、コンテナ内のWebアプリケーションをリロードすることです。

クラスローダーのガベージコレクションは、コード内で参照を保持していなくてもインスタンスが参照されるという明白な方法がないため、難題です。たとえば、ThreadLocalsを使用する場合です。

+0

私のポストのシナリオは、クラスローダーのリークの例ではありませんか? –

+0

いいえ、クラスローダーのリークではありません –

+0

「この種の最も一般的なシナリオはコンテナ内のWebアプリケーションをリロードしています...」私はあなたが再起動しても(リロードして再起動することは同じですか? )TomcatのようなWebサーバーの、時にはWebサーバーが以前にロードされたクラスローダーを解放することができません。それは...ですか ?また、 'あなたは複数のクラスローダーを作成していますか? 'ということは何を意味するのですか?私はクラスローダーを明示的に作成している開発者は見たことがありません(常にjvmまたはwebserverによって行われます)。実際には、クラスローダのリークが可能です。ここで詳細を教えていただけますか? –

1

アプリケーション・サーバー内でアプリケーションを再ロードまたは再デプロイするとクラス・ローダー・リークが発生することがありますが、サーバー全体を再始動するときには発生しません。アプリケーションサーバーでアプリケーションを再起動するたびに、 Tomcatの場合、アプリケーションのクラスをロードするために新しいクラスローダーが作成されます。同時に、古いクラスローダはもはや使用されません。古いクラスローダーへの参照はすべて削除されているので、ガベージコレクションのために利用できるようになっています。古いクラスローダーへの参照がすべて削除されていない場合は、ガベージコレクションできず、クラスローダーのリークが発生します。

クラスローダーのリークの原因としては、1つのアプリケーションサーバー内の複数のアプリケーション間で共有ライブラリを使用することがよくあります。たとえばそのようなライブラリは、Webアプリケーションのクラスローダーへの静的参照を保持しています。このクラスローダーは、アプリケーションが停止した後もガベージコレクションできません。

関連する問題