GCとは何ですか?なぜ我々はそれを使用しようとしています

GC(ガベージコレクション)は、主要な言語の最愛の人だけでなく、非常にホットな話題でコンピュータサイエンスの分野です。最古のは、JVMでこのアルゴリズムを見て、そして後にも、JSのスクリプト言語でもGCを持っていることを発見しました。純粋にJVM上で、その後、GCアルゴリズムは絶えず改善し、成熟しています。最も初期のシリアル - パラレル・ゴードン・スループットから、高いレイテンシはCMS(並行マークスイープ)を解決するために進化してきた、断片化の問題を解決するために、我々はG1を開発しました。

なぜ我々は、GCに必要なのですか


初期のプログラミング言語では、プログラムは、維持するために、スタック・フレーム(スタック・フレーム)で実行されないので、ダイナミックアロケーションよりもはるかに高速である静的割り当て戦略の使用が、それは非常にユーザーフレンドリーな欠点がする必要がある持っていますコンパイル時にデータ構造のサイズのために必要な手順を決定します。

1958年、アルゴル-58言語最初に提案ブロック構造(ブロック構造)、ブロック構造化言語動的ポリシーを達成するために必要に応じて割り当てられたメモリ内のアプリケーション・スタック・フレームを介し。プロシージャが呼び出されると、フレーム(フレーム)は、スタックの一番上にプッシュされ、通話の終了をポップ。スタックアロケーション戦略はプログラマに自由の偉大度を与え、ローカル変数は、再帰のための基礎を提供する別の呼び出し元のプロセスで異なる値を持っています。しかし、LIFO(後入れ先出しは 、LIFO) スタックは、スタックフレームのライフサイクルは、呼び出し元を超えることができない制限が、各フレームのための固定サイズのスタックなので、戻り値はプロセスでコンパイルされなければなりません期間を決定しました。だから、新しいメモリ管理スキームの誕生-ヒープ(ヒープ)の管理。

今すぐコンピュータVSマシンをチューリング


現代のコンピュータについてのチューリングマシン、本質的​​な違いは、限られた資源が、それは将来的にリソースを使用して終了したことで、我々は(リリース)をリリースする必要があります。

GCも使用することができるすべてのリソースを解放


GCは常に不注意なプログラマに用意されている、人材マニュアルリリースは、その後、私はあなたがリソースを解放する必要があるたびに、すべてのGCアルゴリズムを呼び出すことができます間違って行くのは簡単ですか!まあ、これは一度、すべてのではありません。

そしてない、GCは、それは、その不確実性の大部分で使用されているGC(ソケット/ファイルハンドル)には使用することはありませんが、同じように適用できない場面が適用されます。あなたはそれが回収されるとき、あなたが知らないGCを呼び出す場合でも、それは終わりで回収されることはありません、これはGC(霧、GCは大きなサブ速歩あり、まだ信頼できるものではありません

我々は近いが/破壊呼び出し、資源の回復が同じでないことが示された場合でも、リソースが百パーセントまで解放されます

なぜGCそれを使用することができ、メモリに、二つの理由から、最初はそれが持っているということである排他的(もちろん、あなたもの一意性を呼び出すことができます)プログラムを実行するためにOSごとのメモリを割り当てユニークであり、それは独立して、2つの非干渉迅速、私はあなたには影響がありません少し遅れて回復です。ことである第二の点のメモリが十分ある日常使用のためのプログラムメモリフットプリントが高すぎる見ていない、私は後で来ることはありませんが、私はGCで収集メカニズムを作ること自由に感じ、OutOfMenmoryを回復しました。

これは、組み込み機器、または手動解除リソースより良いのいくつかのリソースの相対的な不足のための2つの点によって見ることができます。(ラズベリーパイは含みません)

GCとは何ですか


GC自然が不要になったヒープオブジェクト(ヒープ)の回復のために、自動メモリ管理である(使用)。

実際には、我々は、メモリが共通のスタックに分割されます知っていて、それぞれの領域をヒープ。スタックは、ローカル変数の中にあった、機能が回復の終了後に呼び出されます、これは一定のプロセスれないので、GC。アプリケーションプログラム自体によって動的にデータを共有するために、複数の機能にまたがって使用空間でのヒープ、我々はGCの利点を取る必要があり、この時

2つのコアで構成GC

  • 物体認識、実際には、多くの場合、オブジェクトが生きているかどうかを判断すると言われて、ライブオブジェクトとごみ
  • コレクションアルゴリズムリサイクルする方法を、リサイクル、

それはまあはず


始まる物体認識オブジェクトはライブオブジェクトやゴミを判断され、その下に始まりました

あなたは彼が死んでいたことを考えることができたときに参照されるJava、オブジェクト内のすべてのオブジェクトが参照されなくなったときに、実質的に実施例中のヒープ(ヒープ)に格納されていない、ゴミと見なさ

  1. 参照カウント(PythonやPHPは、このような方法で使用されています)

オブジェクトが無効になったときに、基準カウンタがインクリメントされる被写体(物体プラス第1カウンタ)、参照カウンタは、障害は、参照、参照番号0を低減します。

これは効率が比較的高い、PVのOSプリミティブの内部のような多くが、実装は非常に単純です。しかし、欠点は、問題は、オブジェクト間のループを解決することは困難であることは明らかです。

OB.instance = OA;栗2つのオブジェクトOA OB、OA.instance = OBが存在する場合、それは回収されないので、それらの両方は、カウンタをもたらすは0ではない、お互いを参照します

  1. 到達可能性分析(トレース)

これは、これらのオブジェクトは、到達可能な(到達)と呼ばれるままにすることができ、(トレース)トレース参照することができ、すべてのオブジェクトを検索するか、ルートオブジェクトからスタートする方法として最も広く使用されている近代的な言語であります自然の中のオブジェクトは、ごみがリサイクルされると考え、到達不能オブジェクトです。

さて、あなたはどのように見えるかである、このルートオブジェクトを言うの?
  • Java仮想マシン・スタック(ローカル変数テーブルのスタックフレーム)の参照オブジェクト
  • ネイティブメソッドスタック参照オブジェクト
  • 一定の基準物体領域の方法
  • 領域によって参照されるメソッド静的プロパティクラスオブジェクト

オブジェクトはヒープ内のオブジェクトによって参照されている、彼らがルーツではない、ので、それは循環参照に問題が発生することはありません。

引用文


オブジェクトが生存し、関連する「引用」しているかどうかを決定します。定義のJavaの参照は非常に伝統的である、以前のJDK 1.2では、1つのオブジェクトのみが参照または二つの状態が参照されていない、我々は、このクラスのオブジェクトを記述するために願っています:メモリ空間も十分、メモリに保持されている場合は、メモリ場合手後のガベージコレクションの間にスペースはまだ非常にタイトで、あなたはこれらのオブジェクトを破棄することができます。多くのシステム・キャッシング機能は、このシナリオに沿ったものです。

JDK 1.2、Javaのコンセプトが展開された参考文献の後、参照は以下の4つに分かれています。異なる参照タイプは、主に異なるオブジェクトの到達可能性状態反射reachableの影響とガベージコレクションを。

強い参照(強い参照)

同様の「オブジェクトOBJ =新しいオブジェクト() 」 このような基準の、強力な参照は、限り強い参照があるように、ガベージコレクタは、参照されるオブジェクトを回復することはありません。私たちがしている場合は、強い参照の維持に間違ったような、静的変数を割り当てると、そのオブジェクトは時間の非常に長い期間で回収されることはありません、それがメモリリークを持っています。

ソフト参照(ソフト参照)

ソフト参照オブジェクトがJVMのみソフト参照オブジェクトのポインティングを回復することを試みるために、メモリ不足とみなさ場合にのみ収集され、いくつかのゴミを除外することができるように比較的強い参照は、いくつかの弱体化が挙げられます。JVMは、ソフト参照オブジェクト指向をクリーンアップ、OutOfMemoryErrorをスローする前にそれを保証します。ソフト参照は通常のに使用されているメモリに敏感なキャッシュを実装し、空きメモリがある場合、あなたは一時的にキャッシュを保持することができ、メモリが低いときにきれいに、これキャッシュメモリのうち、実行されませんを使用して同時に確保すること。

弱参照(弱い参照)

弱参照の強度は、軟らかい基準より弱い数。JVMのガベージコレクションは、ときにかかわらずかどうか、十分なメモリの、回復するだけ弱いオブジェクト参照に関連付けられています。

仮想基準(ファントム参照)

ゴーストやファントム参照が引用としても知られている仮想基準は、それは最も弱い参照関係の一種。オブジェクトが参照された仮想プレゼンスを持っているかどうか、それは、その生存を傷つけることはありません。それは単に、たとえば、通常のいわゆる死後のクリーンアップメカニズムを作るために使用され、後に完成されたオブジェクト、特定の物事を行うための仕組みを確保するための方法を提供します。

実際には、引用されたソフト、弱、およびファントム参照が弱参照と呼ぶことができます

オブジェクトへのマナー弱参照は、弱参照オブジェクトがGCに回収される保護しません。オブジェクトが回収された場合、弱参照は、安全値(通常はNULL)を説明します。

あなたがこのウィキを見ることができ、我々は弱参照循環参照を解決する方法について話を参照サイクルの対処します

参照


おすすめ

転載: www.cnblogs.com/QuixoteY/p/11303247.html