2011-07-12 12 views
5

可能性の重複:
Creating a memory leak with JavaJavaアプリケーションではメモリリークはまったくありませんか?

あり、Javaの "ガベージコレクタ" ですが、これはメモリリークがJavaアプリケーションには全く存在しないことを意味するのでしょうか?もしそうでなければ、どうやって彼らが起こるのでしょうか?

JavaSEを使用するアプリケーションのシナリオにはもっと興味があります。

+0

Javaでメモリリークを作成する方法については、スレッド[ここ](http://stackoverflow.com/q/6470651/3009)があります。 – highlycaffeinated

答えて

14

メモリリークはまだJavaでは存在しません。彼らはちょうど "異種"です。バックに

Wiki: Memory Leak

(この文脈において又は漏れ)コンピュータサイエンスにおけるメモリリーク、コンピュータプログラムがメモリを消費するが、それを解放することができないときに発生する[メモリ]オペレーティングシステム。ジャワの場合

未使用/不要オブジェクトが再生の対象からなることがない場合には(通常)です。たとえば、オブジェクトはグローバルリストに隠され、は決してオブジェクトが後でアクセスされない場合でも、を削除することはありません。この場合、JVMはオブジェクト/メモリを解放しません。は決してであっても、オブジェクトの後に必要になる可能性があるため、できません。

(さておき、例えば直接割り当てられたByteBufferなどのいくつかのオブジェクトは、またによりファイナライザとメモリ圧力の性質に適時に再利用されないことがあり、メモリ「JVMヒープのうち、」消費するように)

Javaの場合、「メモリリーク」は意味のある問題であり、「どのような状況でも解放できない」という問題はあまりありません。もちろん、バグのあるJNI/JNAコードでは、すべてのベットはオフになります;-)

ハッピーコーディング。

+2

フォローアップとして、ガベージコレクタは、未使用のメモリを常に再利用することはできません。特定のメモリが再び使用されないかどうかを検出できるGCを構築することは不可能であるため、ほとんどのGCはメモリが**到達可能かどうかを代理として使用します。 – templatetypedef

+0

迅速な応答pstのためにありがとう。あなたが言及した問題は正しかったですが、(悪い)プログラミング慣行が原因です「本当に」レクラメーションの対象となるオブジェクトがいくつかあるとします.JVMによって確実に回収されるでしょうか?確かに? – Bhushan

+1

@ 10101010再利用可能なオブジェクト、根から強く届かないオブジェクト、**はある時点で再利用されます**、はい。しかし、ファイナライザ内の "ネイティブ"メモリを解放するオブジェクトの場合、( "ネイティブ")メモリが十分速くリリースされない可能性があります。 [時期尚早] OOM。 –

1

Javaでのメモリリークは非常に可能です。 Here is a good article which has an example using core java。基本的には、ガベージコレクタがオブジェクトを再要求できないときにJavaでメモリリークが発生するのは、オブジェクト自体がもはや使用されなくても解放しない参照がアプリ​​ケーションに保持されるからです。 Javaでメモリリークを作成する最も簡単な方法は、アプリケーションに何かの参照を保持させ、それを使用しないようにすることです。

この例では、未使用のオブジェクトは静的なListであり、そのリストに追加すると最終的にJVMのメモリが不足します。静的コレクションは、典型的には長生きし、変更可能であるため、「リーク」のかなり一般的なソースです。

2

メモリリークの定義方法によって異なります。

メモリルートによって参照されなくなったメモリを割り当てたことを具体的に意味する場合は、ガベージコレクタはそれらのすべてを最終的にクリーンアップします。

一般的に、メモリフットプリントが縛られずに成長することを意味するなら、それは簡単に可能です。静的フィールドによって参照され、常に追加されているコレクションを持っているだけです。

1

これまでにいくつかの良い回答があります。私はこれらの投稿を再作成したくないので、この件に関してはほとんどの人がJNI経由のネイティブコードの漏洩であるとは思わないことを付け加えます。 JNI経由で動作するネイティブコードは、JVMのヒープスペースを使用してメモリを割り当てます。したがって、アプリケーションでJNI経由で実行されているリークのあるネイティブコードを使用すると、アプリケーションにリークが発生します。

1

liveが1つ以上あるオブジェクトは、ガベージコレクションされません。したがって、変数(ヒープ内またはスタック内の静的なもの)がオブジェクトを参照する限り、そのオブジェクトは引き続き再利用不可能なメモリ空間を占有します。

密閉されたリソース(ソケット、JDBC接続など)と絶えず増大する静的コレクションは、よく知られているリークプロデューサの一部です。