Javaにおけるゴミ回収メカニズム------詳細

3194 ワード

    C++     ,                。                ,                    。                  ,            ,        ,           。

ごみの回収を明示的に行うには主に以下の2つの欠点がある:1.プログラムは不要なメモリをタイムリーに回収することを忘れ、メモリの漏洩を招き、システムの性能を低下させる.2.プログラムはプログラムコアクラスライブラリのメモリを誤って回収し、システムがクラッシュする.C/C++プログラムとは異なり、Java言語ではプログラマが直接メモリ回収を制御する必要はなく、Javaプログラムのメモリ割り当てと回収はJREがバックグラウンドで自動的に行い、JREは使用されなくなったメモリの回収を担当する仕組みで、ゴミ回収メカニズムと呼ばれています.通常、JREは検出と制御のためにバックグラウンドスレッドを提供し、CPUが空きまたはメモリが不足している場合に自動的にゴミ回収を行いますが、プログラマはゴミ回収の時間や順序などを正確に制御できません.Javaのヒープメモリはランタイムデータエリアです.クラスのインスタンス(オブジェクト)を保存するために使用されるJava仮想マシンのスタックメモリには、実行中のアプリケーションによって作成されたすべてのオブジェクトが格納されています.これらのオブジェクトはプログラマがコードによって明示的に解放する必要はありません.一般的に、スタックメモリの回収はゴミ回収によって責任を負い、あるJVMは(Javaでバイトコードファイルの実行を説明しているのはjava仮想マシン、すなわちJVM)実現には、いずれもゴミ回収器によって管理されるスタックメモリがある.ゴミ回収は、参照されなくなったオブジェクトを自動的に解放し、特定のゴミ回収アルゴリズムに従ってメモリリソースの自動回収機能を実現する動的記憶管理技術である.C/C++では、オブジェクトが占有するメモリは自動的に解放され、プログラムがオブジェクトが占有するメモリを明示的に解放しない場合、オブジェクトが占有するメモリは他のオブジェクトに割り当てられず、プログラムが実行を終了するまでずっと占有されます.Javaでは、参照変数がオブジェクトに割り当てられたメモリを指していない場合、メモリはゴミになります.JVMのスーパースレッドはメモリ領域を自動的に解放します.ゴミ回収は、プログラムが不要になったオブジェクトが「ゴミ情報」であることを意味します.これらのメッセージのトロフィーが失われました.オブジェクトが参照されなくなった場合、メモリは占領されたスペースを回収し、その後の新しいオブジェクトで使用されるようにします.実際には、無駄なオブジェクトを解放するだけでなく、ゴミ回収もメモリ記録の破片を整理します.オブジェクトの作成とゴミ回収器がオブジェクトを廃棄するメモリ領域を解放するため、メモリが破片化されます.フラグメントはオブジェクトに割り当てられたメモリブロック間の空きメモリ領域であり、フラグメントアレンジは使用されたスタックメモリをスタックの一端に移動し、JVMはアレンジされたメモリを新しいオブジェクトに割り当てます.ごみ回収はメモリスペースを自動的に解放し、プログラミングの負担を軽減します.これにより、Java仮想マシンには2つの顕著な利点があります.1.ゴミ回収メカニズムはプログラミング効率を向上させることができる.ごみ回収メカニズムがない場合、難解なメモリ問題を解決するのに多くの時間がかかる可能性があります.Java言語でプログラミングする場合、ゴミ回収メカニズムによって時間を大幅に短縮することができる.ごみ回収メカニズム保護プログラムの完全性、ごみ回収はJava言語セキュリティポリシーの重要な部分である.ごみ回収の潜在的な欠点は、プログラムのパフォーマンスにオーバーヘッドが影響することです.Java仮想マシンは、プログラムで役立つオブジェクトを追跡する必要があります.どのオブジェクトが不要なオブジェクトであるかを決定し、最終的にこれらの不要なオブジェクトを解放することができます.このプロセスの通話料プロセッサの時間.次にごみアルゴリズムの不備性であり,以前は一部のごみ回収アルゴリズムではすべての廃棄メモリを100%収集することが保証されていなかった.もちろん、ゴミ回収アルゴリズムの改善や、ソフト・ハードウェアの効率の向上に伴い、これらの問題は解決できます.Java言語規範はJVMがどのごみ回収アルゴリズムを使用するかを明確に説明していないが、どのごみ回収アルゴリズムも一般的に2つの基本的なことをしなければならない:無駄なオブジェクトを発見する;不要なオブジェクトによって使用されたメモリ領域を回収し、プログラムによって再使用できるようにします.通常、ごみの回収は以下のいくつかの特徴を持っている:1.ごみ回収メカニズムの仕事の目標は不要なオブジェクトのメモリ空間を回収することであり、これらのメモリ空間はすべてJVMスタックのメモリの中のメモリ空間であり、ごみ回収はメモリ資源しか回収できず、他の物理資源、例えばデータベース接続、ハードディスクI/Oなどの資源に対してはどうしようもない.2.ゴミ回収メカニズムが使用されなくなったオブジェクトをより速く回収するために、そのオブジェクトの参照変数をnullに設定できます.このようにして、ゴミ回収機構が対象を回収できることを示唆する.3 .ごみ回収発生の予知不能性.異なるJVMは異なるゴミ回収メカニズムと異なるゴミ回収アルゴリズムを採用しているため、彼はタイミングで発生する可能性があり、CPUが空いているときに発生する可能性があり、元のゴミ回収と同じである可能性がある.プログラマはRuntimeオブジェクトのgc()またはSystemを呼び出すことができるが、メモリ消費が限界となるのを待つ場合に発生する.gc()などの方法でシステムによるごみ回収を提案するが,この呼び出しは提案にすぎず,ごみ回収メカニズムの実行を正確に制御することはできない.4.ゴミ回収の精度は主に二つの方面を含む:一つはゴミ回収メカニズムが生きている対象を正確にマークすることができる:二つ目はゴミ回収メカニズムが対象間の引用関係を正確に位置決めすることができる.前者はすべての廃棄対象を完全に回収する前提であり、そうしないとメモリが漏洩する可能性がある.後者は集計とレプリケーションアルゴリズムを実現するための必要条件であり、このような参照関係により、すべてのオブジェクトが信頼性の高い回収され、すべてのオブジェクトが再割り当てされ、メモリフラグメントの発生を効果的に低減することができる.5.現在のJVMには様々なゴミ回収が実現されており、それぞれの回収メカニズムはアルゴリズムの違いによって異なる可能性があり、ゴミ回収が開始されるとアプリケーションの実行を停止したり、ゴミ回収の実行時にアプリケーションのスレッドが許可されたり、同じ時間にゴミ回収マルチスレッドが実行されたりする.Javaプログラムを作成するとき、もう必要としないオブジェクトについては引用しないことが基本です.これらのオブジェクトへの参照を維持すると、ゴミ回収メカニズムは一時的にオブジェクトを回収しないため、システムメモリが少なくなります.システムの使用可能なメモリが少なくなると、ゴミ回収の実行頻度が高くなり、システムのパフォーマンスが低下します.