エントリから放棄までの退屈なJavaEE(4)ガベージコレクションメカニズム(ガベージコレクション)

目次

1.ガベージコレクションの原理とアルゴリズム

1.メモリ管理

2.ガベージコレクションプロセス

3.ガベージコレクション関連のアルゴリズム

2.ユニバーサル世代ガベージコレクションメカニズム

1.若い世代

2.古い世代

3.永続的な世代

4.3つのGC

3.JVMチューニングとフルGC

4.その他のポイント

5.開発時にメモリリークを引き起こす可能性のある操作_ガベージコレクションの知識の概要

1.役に立たないオブジェクトをたくさん作成する

2.静的コレクションの使用

3.さまざまな接続オブジェクト(I0ストリームオブジェクト、データベース接続オブジェクト、ネットワーク接続オブジェクト)が閉じられていない

4.リスナーの使用


Javaは、C ++プログラムの最も厄介なメモリ管理の問題を解決するガベージコレクションメカニズムを導入しました。Javaプログラマーは、メモリー管理の代わりにビジネスロジックにより多くのエネルギーを投入できるため、開発効率が大幅に向上します。

1.ガベージコレクションのプロセスは、一般的に2つのステップに分かれていますが、どの2つのステップですか。

回答:(1)ガベージを見つける方法(2)リサイクル
2.ガベージコレクションの2つの一般的なアルゴリズムは何ですか?

回答:参照カウント法、参照到達可能法(ルート検索アルゴリズム)
3。ヒープメモリは、若い世代、古い世代、永続的な世代に分けられます。ガベージコレクターは、マイナーGC、メジャーGC、FulIGCに分けられます。これら3つのガベージコレクターはどの領域に対応していますか?

回答:マイナーGCは若い世代に対応し、メジャーGCは古い世代に対応し、FulIGCはすべてに対応します。
4. JVMを調整するプロセスでは、作業の大部分はフルGCの調整です。この文は正しいですか?

回答。
5. System.gc()の役割は何ですか?

回答:ガベージコレクションスレッドを開始することをお勧めします。

 

1.ガベージコレクションの原理とアルゴリズム

1.メモリ管理

Javaのメモリ管理は、オブジェクトスペースの割り当てと解放を含む、ヒープ内のオブジェクトの管理という大部分を指します。
オブジェクトスペースの割り当て:newキーワードを使用してオブジェクトを作成します。
オブジェクトスペースの解放:オブジェクトにnullを割り当てます。ガベージコレクタは、すべての「到達不能」オブジェクトのメモリスペースを再利用する責任があります。

2.ガベージコレクションプロセス

あらゆる種類のガベージコレクションアルゴリズムは、一般に2つの基本的なことを行う必要があり
ます。1。役に立たないオブジェクトを見つける
2.役に立たないオブジェクトによって占められているメモリスペースを再利用する。

ガベージコレクションメカニズムは、「役に立たないオブジェクト」をリサイクルできることを保証します。役に立たないオブジェクトとは、オブジェクトを参照する変数がないことを意味します。Javaのガベージコレクターは、関連するアルゴリズムを介して役に立たないオブジェクトを見つけ、それらをクリーンアップして整理します。

3.ガベージコレクション関連のアルゴリズム

1.参照カウントメソッド
ヒープ内の各オブジェクトは、参照カウンターに対応します。このオブジェクトへの参照がある場合、参照カウンターは1増加し、オブジェクトへの参照が無効になる(参照がnullになる)と、参照カウンターが1減少します。最後に、オブジェクトの参照計算機の値が0の場合、Javaガベージコレクターはそのオブジェクトを役に立たないオブジェクトと見なしてリサイクルします。利点はアルゴリズムが単純なことですが、欠点は「循環的に参照される役に立たないオブジェクト」を識別できないことです。

2.参照到達可能性メソッド(ルート検索アルゴリズム)
プログラムは、すべての参照関係をグラフとして扱い、ノードGC ROOTから開始して、対応する参照ノードを探し、このノードを見つけた後、このノードの参照ノードを探し続けます。参照されているすべてのノードが検索された後、残りのノードは参照されていないノード、つまり役に立たないノードと見なされます。

2.ユニバーサル世代ガベージコレクションメカニズム

世代別ガベージコレクションメカニズムは、さまざまなオブジェクトのライフサイクルが異なるという事実に基づいています。したがって、
ライフサイクルが異なるオブジェクトはリサイクル効率を向上させるために異なるリサイクルアルゴリズムを採用できます。オブジェクトは、若い世代、古い世代、永続的な世代の3つの状態に分けられます。同時に、ヒープのさまざまな領域にさまざまな状態のオブジェクトを配置します。
JVMは、ヒープメモリをEden、Survivor、およびTenured / Oldスペースに分割します。(エデン、サバイバーは若い世代に属し、テニュア/オールドは古い世代に属します)

1.若い世代

新しく生成されたすべてのオブジェクトは、最初にエデンエリアに配置されます。若い世代の目標は、ライフサイクルの短いオブジェクトをできるだけ早く収集することです。これはマイナーGCに対応します。マイナーGCが若い世代のメモリをクリーンアップするたびに、アルゴリズムはより効率的なコピーアルゴリズムを使用します。頻繁な操作ですが、メモリスペースを浪費します。「若い世代」の領域がオブジェクトでいっぱいになると、オブジェクトは古い世代の領域に格納されます。

2.古い世代

若い世代でN(デフォルトは15)のガベージコレクションを生き残ったオブジェクトは、古い世代に配置されます。したがって、旧世代に格納されているオブジェクトは寿命の長いオブジェクトと見なすことができます。古い世代のオブジェクトはますます増えています。若い世代の領域と古い世代の領域を包括的にクリーンアップするには、メジャーGCとフルGC(完全回復)を開始する必要があります。

3.永続的な世代

Javaクラス、メソッドなどの静的ファイルを格納するために使用されます。永続的な生成は、ガベージコレクションに大きな影響を与えません。JDK7は、以前は「メソッド領域」の実装でした。JDK8の後に「永続的な生成」はありません。代わりに、メタスペースメタデータスペースとヒープを使用してください。

4.3つのGC

マイナーGC:
若い世代の領域をクリーンアップするために使用されます。エデンエリアがいっぱいになると、マイナーGCがトリガーされます。不要なオブジェクトをクリーンアップし、有用なオブジェクトを「Survivor1」および「Survivor2」領域にコピーします。
メジャーGC:
古い世代の領域をクリーンアップするために使用されます。
フルGC:
若い地域と古い地域をクリーンアップするために使用されます。コストが高く、システムのパフォーマンスに影響を与えます。

3.JVMチューニングとフルGC

JVMを調整するプロセスでは、作業の大部分はフルGCの調整です。完全なGCは、次の理由で発生する可能性があり
ます。1。終身世代がいっぱいです

2.パーマ(パーマ)がいっぱいです

3. System.gc()が明示的に呼び出されます

4.最後のGC後のヒープのドメイン割り当て戦略の動的な変更

4.その他のポイント

1.プログラマーには、ガベージコレクターを呼び出す権利がありません。
2.プログラマーはSystem.gc()を呼び出すことができます。このメソッドは、JVMに通知するためだけのものであり、ガベージコレクターを実行するためのものではありません。できるだけ使用しないようにしてください。フルGCの開始を申請しますが、これはコストがかかり、システムパフォーマンスに影響します。
3. finalizeメソッドは、Javaがプログラマーに提供するメソッドであり、オブジェクトまたはリソースを解放しますが、それらの使用はできるだけ少なくします。

5.開発時にメモリリークを引き起こす可能性のある操作_ガベージコレクションの知識の概要

実際の開発では、システムがクラッシュすることがよくあります。以下の操作では、これらの使用シナリオに注意する必要があります。

次の4つの状況でメモリリークを引き起こす可能性が最も高いシナリオ:

1.役に立たないオブジェクトをたくさん作成する

たとえば、連結された文字列が多数必要な場合は、StringBuilderの代わりにStringを使用します。

例えば:

String str= "";
for (inti= 0;i < 10000; i++) {

    str += i;//相当于产生了10000个String对象
}

2.静的コレクションの使用

HashMap、Vector、Listなどを使用すると、メモリリークが発生しやすくなります。これらの静的変数のライフサイクルはアプリケーションと一致しており、すべてのオブジェクトを解放できるわけではありません。

3.さまざまな接続オブジェクト(I0ストリームオブジェクト、データベース接続オブジェクト、ネットワーク接続オブジェクト)が閉じられていない

IOストリームオブジェクト、データベース接続オブジェクト、ネットワーク接続オブジェクトなどの接続オブジェクトは物理接続であり、ハードディスクまたはネットワークに接続されています。使用しないときは閉じる必要があります。

4.リスナーの使用

オブジェクトが解放されたとき、対応するリスナーは削除されませんでした

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/weixin_44593822/article/details/115309941