Javaのガベージコレクションの仕上げ

ガベージコレクタと確定() 

 Javaのガベージコレクタは、占有無用オブジェクトの回復のための唯一の責任があるメモリリソースをあなたのオブジェクトが(すべての新しいオブジェクトがリソースを管理/きれいに簡単に、一箇所にヒープ資源に開放されている)新しいによって作成されていない場合でも、それがあれば、この特別なメモリのオブジェクトの解放を知ることができません。このような状況に対処するために、オブジェクトはファイナライズ()メソッドが付属しています。

  この原理を()メソッドを確定です:オブジェクトによって占有されていたメモリを解放するガベージコレクタの準備ができたら、それは最初に継承された/オーバーライドされたfialize()を呼び出し、およびメソッドを呼び出しますが、すぐに実行されていない回復したが、次回(より大きなメモリの時間を必要とJVMの回復動作が発生した場合には)、実際にオブジェクトによって占有されていたメモリを回復します。そのため、自分自身一般にはfialize()メソッドを書き換え、回復し、最後の瞬間に、いくつかのクリーンアップ作業を行うことが重要です。

Javaのガベージコレクション、次の特性:

図1に示すように、オブジェクトは、ごみではないかもしれません

   オブジェクトは、あなたは、コンピュータ画面上に表示されているように、特定の関数を作成します。画面から消去します特別扱いしない限り、そう、それはクリーンアップすることはできません。あなたは、プロセスのファイナライズで画面を消去しないのであれば()メソッド、ガベージコレクション、確定()が呼び出され、画面イメージが明確です。ご注意:唯一のJVMのガベージコレクタを(時間を実行するために多くのメモリが必要になると思う小さなオーバーヘッドが、それでもオーバーヘッドが実行されている)、回復アクションのほとんどは、ストレージ・スペースが不足の危機に瀕してその瞬間に起こっているので、 JVMのガベージコレクタを実行するように強制。プログラムが完了(または操作を中断)した場合は、すべてのこれらのリソースは、オペレーティングシステムに返されます。

2、ガベージコレクションは、デストラクタを意味するものではありません

  JavaとCがあまりにも関与するので、頻繁に対比するために使用ので、これは、コンセプトCです。単にオブジェクトが破棄される前に、デストラクタが実行されなければならないCのデストラクタと呼ばれるものがある置きます。ここでは、ガベージコレクションは、デストラクタを表すものではありません。確定()関数は、同様の、しかし等しくありません。

3、唯一のメモリ関連のガベージコレクション

  ここでは、ファイナライズ()真の目的を述べなければなりません。内部動作が行われるべきであり、方法及びメモリリコール、そうfialize()メソッドは、一般的な方法ではありません。あなたは、メンバーオブジェクトときにオブジェクトのプロパティが含まれていることを考える確定()あなたがそれらのオブジェクトをクリアするかどうかを明確にすべきでしょうか?それは間違っています。それは理解されなければならない:オブジェクトが作成されている場合に関係なく、ガベージコレクタは、オブジェクトによって占有されたすべてのメモリを解放するための責任を負うことになります。したがって、()を終了一般的にオブジェクトに割り当てられたストレージスペースを作成することを目的以外の手段によって処理されます。いくつかは、それは一口だと言うが、例としては知っているだろう。

  呼ばれることが多い遭遇キーワードネイティブ修飾法、追跡するためのJavaソースコード「ネイティブメソッドを。」内部コール(CがC ++ではない)方法は、これらのローカルメソッド、非Javaコードを使用する場合。これらの非コードは、記憶領域を割り当てる機能の()ファミリーのmalloc関数Cを使用してもよいです。あなたは無料()メソッドを呼び出すCない限り、そうでない場合は収納スペースが解放されません。だから、)(確定ネイティブな方法を使用して自由に呼び出すことができます。

  上記は、()の確定書き換えが推奨され、可能な限り小さなとして真実です。

第二に、ガベージコレクション

  fializeので())、その後、頻繁に(fializeを使用することを期待していないので、珍しい光景を使用してください。あなたは、自分のビジネスのクリーニングによると、他の洗浄方法を作成する必要があります。プログラムは、それを呼び出すオブジェクトの検証「終了条件」である。しかし、fializeは()という特徴を有しています。また、オブジェクトが死んで、マークされる、それを回収することができます。たとえば、次のオブジェクトの前に、開いているファイルを表すオブジェクトを回収するプログラマがファイルを閉じなければなりません。限り適切にオブジェクトの一部が洗浄されていなかったとして、あいまいなプログラムの不備があります。fialize()は、最終的なケースを検索するために使用することができます。

 

 
 

//オブジェクトを検出するために)(確定使い方
//が適切にクリーンアップされていませんが。

クラスブック{ 
  ブールチェックアウトした=偽; 
  ブック(ブールチェックアウト){ 
    チェックアウトし= チェックアウト。 }  無効チェックイン(){  チェックアウトし= falseを}ボイド保護ファイナライズ(){場合(チェックアウトし)のSystem.out.println( "エラー:チェックアウトを" )。//通常、あなたもこれをやる:// super.finalizeを(); //は基底クラスバージョンを呼び出し}}パブリッククラスTerminationCondition {公共の静的な無効メイン(文字列[]引数){帳小説=新しいブック(真)。//適切なクリーンアップ:novel.checkIn(); //、参照を削除してクリーンアップするのを忘れ:新しいブック(真の); //強制ガベージコレクション&ファイナライズ:System.gc(); }} / *出力:エラー:チェックアウト* ///:〜

 

この例の条件の終了は、次のとおりです。すべてのブックオブジェクトがガベージコレクションの前にチェックインとして扱われるべきです。しかし、メイン内部には、二本は、ファイナライズ()によって、この時間はチェックインされていない、あなたは、オブジェクトが破壊する前に、いくつかのきれいに対処しなかったことを知って明確にすることができます。さらに、にSystem.gc()を使用するコード;これは必須のガベージコレクションである)(ファイナライズBOOKをトリガするために機械を呼び起こす;もちろん、これも必須で想起されていない場合、プログラムは大量のメモリを実行するときは、ときに割り当てられています自動的に起動ガベージコレクタを強制的に、(あなたが繰り返さBOOKの多数を作成することができます)。BOOK親がある場合は継承し、あなたが(親クラスを確定トリガーする)、あなたは)(super.finalizeを使用することができます。呼び出します。

第三に、どのようにガベージコレクタを動作するように

  一般的な印象の中に、ヒープ内の新しいリソースを割り当てた後、すべて、スタックより速くすることができない、比較的遅くなります。しかし、実際には、JVMは、ガベージコレクタが明らかな効果で、オブジェクトの作成をスピードアップするために、このエリアに多くを行って最適化されています。その未使用のストレージスペースを割り当てることが助長ストレージ・スペースを解放するためにガベージコレクタ、より多くのごみ収集のメモリで人気のポイントは、理論的には、オブジェクトが速くなります作成する(まだ決定的があり、一般的なCとして、スタック上のオブジェクトを作成するために、他の言語に匹敵すると考えられます)。Cヒープは中庭、各メモリ空間の各チューブ内の各オブジェクトのようなものです。一定期間後にオブジェクトが破棄されます。これは、スペースを再利用する必要があります。いくつかのJVMでは、コンベアベルトのようなヒープは、新しいオブジェクトを割り当て、それが前方に1つのスペース移動します。これは、スペースの割り当ては、(高速アドレッシング)非常に高速であることを意味しています。スタック上に割り当てられているので、効率匹敵する速度CポインタをアドレッシングJavaは単に、ラインの割り当てられていない領域に移動しました。記録スペースは「添字」アドレスの側面、あるいはいくつかのオーバーヘッドが、オブジェクトが、Cのオーバーヘッドよりもヒープを見つける必要が前記はるかに小さいです。実際には、Javaヒープは、(フリップを除去し、仮想メモリ上に配置することが困難である場合、メモリは、ページングされる)、これは頻繁にメモリページングの原因となるように、正確にコンベアベルトのよう必ずしもありません。あなたは十分なオブジェクトを作成した後にページングが大きく、最終的にはパフォーマンスに影響を与える、とすることができ、メモリ資源の枯渇(大量の仮想メモリがいっぱいになっています)。

  ここでは、ガベージコレクタのデビューのターンのとき、ガベージコレクタの仕事、スペースを再利用しながら、しばらくヒープ内のオブジェクトのコンパクトな配置。このような「ヒープポインタが」簡単にコンベヤーベルト(Javaヒープ空間が高度に割り当てられている)の先頭に近づけることができ、ページフォルトを回避しようとします。ごみの回収期間を割り当てることができ、高速、無制限のスペース(?)原子炉モデルを達成するために対象となる並べ替えます。

以下は、ガベージコレクション(javaのより多くの)3つの一般的な設計手法であります:

1、参照カウント

  各オブジェクトは、カウントアプリケーションが含まれています。参照が割り当てられた範囲またはヌルの出る-1接続は+1、オブジェクトへの参照が場合があります。わかりましたので、オブジェクト参照の発見は、それがリリースに占めるスペースが(但し、0リリースに空間が存在することになる)、0である場合。オブジェクトが円形基準、即ち基準A Bであればここに欠陥がある、BはAを参照し、「オブジェクトを再利用することができるが、参照カウントが0ではありません」が登場。ガベージコレクタのため、非常に高価の各グループを参照するオブジェクトの位置。また、参照カウント管理のオーバーヘッドは大きくはありませんが、これはアプリケーションのライフサイクル全体で発生していきます。参照カウントは、一般的な方法のガベージコレクションを記述するために使用されるが、JVMのいずれかの種類に適用されていません。

2、ストップアンドコピー

  このアプローチはしている中断プログラム(バックグラウンドで実行されていないが、しかし、プログラム、ガベージコレクションを停止して)、そのように生きて現在のヒープからのオブジェクトのコピー別のヒープに、残りはゴミです。オブジェクトが新しい家(スタック)にコピーされる場合、これらのオブジェクトのいずれかの隣には、このように新たなスタックのコンパクトな配置を維持するであろう。なぜこれがオブジェクトのコンパクトな配置を行うことができ、その仮想マシンの前で投資回収JVMのゴミです。コピー処理は、新しいアドレスを指している必要があり、新たな支出だけでなく、オブジェクト上の古いポイントへのすべての参照を生成します。非参照ヒープから(ない新しいオブジェクトのうちの)が生じることが、これらは、新しいヒープにリダイレクトするとき、古いヒープを参照してくださいトラバース見つけることになります。

  このような回収方法、非効率的2は、ヒープを持っているし、2つの複製に転送するオブジェクトを積み重ね、そのためにまず、これは実際には2倍のメンテナンス空間理論です。例えば、いくつかのJVM練習、コピー動作がメモリのブロックで行われるヒープに割り当てられたメモリのいくつかの大きなブロック。プログラムが安定した後に実行されたときに第二に、発生した廃棄物は、それもゴミではないが、比較的小さいです。それがコピーされる。この時間は前後に無駄にしました。廃棄物を避けるために、JVMがチェックされ、新たな廃棄物が発生していない場合は、自動的に一つのモードに変換されます。

3、マークアンドスイープ

  Sunの仮想マシンの以前のバージョンはこれです。この考え方は、スタックおよび静的な記憶領域からで、すべての参照を介して、あなたはすべてのライブオブジェクトを見つけることができます。ライブオブジェクトを見つけるたびに、オブジェクトを与えるマークを、幸運を覚えています。すべてのタグが行われた後、クリーンアップが開始されます。クリーン、マークされていないオブジェクトがリリースされると、コピー動作は発生しません。この時間は、ヒープはビットCのように見えるので、あなたは、行のメモリ内のオブジェクトの残りをしたい場合、あなたは、オブジェクトの残りの部分をリフレッシュする必要があります。

  

要約:

  Sunは、ガベージコレクションのように見られている文書の優先度の低い結局、プログラムを停止する:なぜならストップ・アンド・コピーを参照すると、バックグラウンド・プロセス。ただし、以前のバージョンでは、JVMは、マークアンドスイープを使用しました。オブジェクトは、ガベージコレクタの効率を低下させる、非常に安定している場合、JVMを監視する方法によって回収両方今、それは、マークアンドスイープに切り替え。マークアンドスイープの効果が良くない場合は同様に、ジャンクヒープの断片化(無参照オブジェクト)の多くがあった、それがに切り替わりますストップアンドコピーときにストップアンドコピー使用、メモリユニットとして大きな「ブロック」に割り当てられるので、オブジェクトが大きい場合、それはブロック全体を占めます。プログラムの実行動作を停止するストップアンドコピー実行する前に、新しいブロック(ヒープ)にコピーされたすべてのライブオブジェクトが、今回は古いブロックが破棄され、ガベージコレクタは破棄することができますブロックは、リソースの柔軟な使用に新しいオブジェクトをコピーします。各ブロックは、それがまだ生きている場合は、それぞれの代数(回数)が記録されています。ブロックがどこかで参照されている場合は、カウントが増加します。ガベージコレクタは、最後の回復を終えた後、新たなアクションブロックを割り当てます。DUIは役に立ち短命のオブジェクト。投資回収期間は定期的に完全なゴミのクリーンアップアクションとなります----ラージオブジェクトは、まだコピーされていない、または小さなオブジェクトを含むこれらのブロックをコピーして仕上げています。

  JVMの速度を上げるために多くの追加の技術があります。たとえば、JIT(ジャストインタイム)コンパイラ技術。このプログラムは、マシンコードの費用の全部または一部を、プログラムの走行速度を変換するため、はるかに高速になります。必要がクラスをロードするとき、コンパイラは最初に対応するクラスファイルを見つけて、バイトコードの内容をメモリに(クラスが最初のオブジェクトを作成し、再ロードされ、その後に作成されていません)。この時、選択する2つの方法があります。一つは、マシンコードにすべてのJITコンパイラのコードを作ることです。しかし、制御不能なローディングが発生するので、プログラムのライフサイクル全体に散乱され、アップ追加するマシンコードがそれよりもはるかに小さい後に展開に時間がかかり、実行可能コードの長さを増加させる(バイトコードJITコンパイラ)、これは、このようにプログラムの速度を低下させる、メモリページングをもたらし得ます。第二は、コードが実行されることはありませんように(で輸入が、使用されていない)、必要なときだけそのJITコンパイルされたコードを意味し、遅延評価(怠け者evaluatio)である彼らは、JITコンパイルされません。JavaのHotSpotテクノロジは、JDKのコードは、いくつかの最適化を行うためのたびに実行されるので、実行数より多く、それは高速です、同様の方法を使用していますです。

 

おすすめ

転載: www.cnblogs.com/lb-alex/p/11112483.html