I.はじめに
しばらく前に、一般的に約書き込みの準備ができて、関連するナレッジベースの一定の理解を持って、この本の「Java仮想マシンの深い理解」を見てJVM
、これは第二で、家族のブログ。このブログはちょうどについて話をするJVM
ガベージコレクションアルゴリズムに使用。
第二に、テキスト
2.1ガベージコレクションとは何ですか
正式なプレゼンテーションガベージコレクションアルゴリズムの前に、まず何がガベージコレクションであるということです。ここではゴミは主に、もはや、使用し続けた当然のことながら、このような使用のクラスや定数のもはやとして、他のがあるかもしれませんが、次のアルゴリズムは、コレクションの対象をご紹介しますので、主に、オブジェクトを参照するオブジェクトを参照しません。ガベージコレクションが意味されるように:メモリオブジェクトが使用されていない(またはクラスや定数)をクリア、メモリ領域を解放。
JVM
前記5つの部分に分割されたメモリ・モデル、ヒープメモリの唯一の目的は、オブジェクトを格納することは、オブジェクトは、基本的に格納されているヒープメモリの。スタックは、ガベージコレクションを容易にするために、メモリは、一般に2つの部分に分割されます。
- 新世代:オブジェクトの短いライフサイクルを格納するために使用されます。この短い生存時間のメモリオブジェクトの一部なので、頻繁にガベージコレクション、および一般的には、各リサイクルは大量のスペースを解放することができるので、
- オールド・イヤー:オブジェクトの長いライフサイクルを格納するために使用されます。新世代は、長いオブジェクトは、一般的に長いオブジェクトのライフサイクルを格納し、その領域でのガベージコレクションの頻度この1つは起こるので、ここで、(もちろん、唯一のオブジェクトは、このメソッドを歳入っていない)、ここで移行され生き残りました少ないスペースをリリースし、下げます。
以下の議論が開始されJVM
、ガベージコレクションのアルゴリズムを。
2.2スパムの識別方法
最初のステップは、(我々は例えば、主に対象にここにいる)、つまり、オブジェクトを使用することはできませんガベージコレクションのゴミを見つけることです。オブジェクトがどのような状況下で使用することはできませんか?非常に単純な、オブジェクトへの参照、当然、我々は例えば、それを使用することはできません、次のコードを見て:
public static void main(String[] args) throws InterruptedException {
Object a = new Object();
a = null;
}
上記のコードは、私は、オブジェクトと使用変数の作成a
このオブジェクトを指すようにしますが、その後、私はターンnull
に割り当てられa
、それは何でしょうか?見つけるのは難しいことではありませんが、我々はこのオブジェクトを使用することができなかった、と私たちは任意の変数でオブジェクトを呼び出すことができなかったので、それは、失われているが、それはメモリ内にまだあります。この場合、オブジェクトによって占有メモリは資源の無駄である、我々はそれをクリアすることにしたいです。そこで、我々は、オブジェクトがそれへの複数の参照されていないとき、あなたは彼がゴミの標的であることを考えることができる、と考えることができます。
(1)参照カウント
参照カウントは、参照することによりオブジェクトを識別するために不要です。新しい変数の参照オブジェクト、オブジェクト参照番号1を加えた場合我々は、オブジェクトへの各参照の数を記録し、参照の失敗、参照番号マイナス1、およびオブジェクトの参照数0の場合それはゴミをリサイクルすることができます。ここでは、これらのメンバ変数は、他のオブジェクトへのゴミの参照をオブジェクト場合、失敗した場合に参照することをごみは、それが自然だとき、オブジェクトが解放されることに注意しなければなりません。
このアルゴリズムは単純で、高い効率が、しかし、それが主流に使用されていないJava
ことが大きな欠点を持っているので、仮想マシン-解決することは困難である循環参照の問題を。以下のコードで循環参照、見た目は何ですか。
public class Main {
private Object obj;
public static void main(String[] args) {
Main m1 = new Main();
Main m2 = new Main();
// 循环引用
m1.obj = m2;
m2.obj = m1;
m1 = null;
m2 = null;
}
}
上記のコードは、2つのオブジェクトを作成m1
し、m2
その性質を有していますobj
。そして、指摘し、そして尖った。円形の基準となる基準複数の環を形成します。使用の参照カウントアルゴリズムのこのガベージコレクタは、最後のことは、上記のコードに問題であり、そして2つのオブジェクトが相互に参照するので、それらは、その結果、二つのオブジェクトを指していない、もはや使用することができるが、nullに設定されていますその参照カウントがされていない、ガベージコレクタは、彼らに役に立たないオブジェクトを識別しません。それがあるため、この問題の存在であり、ガベージコレクタは、基本的に、このアルゴリズムを使用しないでください。m1
obj
m2
m2
obj
m1
m1
m2
0
Java
(2)到達可能性分析
到達可能性分析は、Java
ガベージコレクションの差別無用オブジェクトの主な方法。この方法のステップは、ルートオブジェクト、使用から開始しない、ということであるDFS
、またはBFS
、アルゴリズムの再帰的基準に沿って横断し、オブジェクトに横断することができない、オブジェクトがもはや使用され、それはゴミ収集することができます。私たちが直接使用できるよう、いわゆるルートは、参照型の変数であります:
- メソッドのパラメータまたはローカル変数。
- 静的メンバーまたはクラスの静的メンバ。
- コード内の定数。
参照カウントに対するこの方法の効率は比較的複雑で、かつ効率の低いが、循環参照の問題を解決され、それはJava
主に、ガベージコレクションに使用される方法。
リリース2.3を拒否する方法
ごみのリリースでは、不要なオブジェクトを削除し、それらによって占有されていたメモリ領域を解放、継続的な使用を容易にするためのことをいいます。これは、以下の3つの方法を紹介します。
- マーク - スイープアルゴリズム。
- レプリケーションアルゴリズム。
- マーク - 照合アルゴリズム。
3つのアルゴリズムは、最良の結果を再生するために使用して、特定の状況に応じて。ここでは一つ一つを紹介します。
(1)マーク - スイープアルゴリズム(マークスイープ)
マーク - スイープは、より多くのその原理は非常に簡単ですので、それは、最も基本的である理由を最も基本的な種類、上記3つのアルゴリズムを超えています。イタリアの名前が示唆する、このアルゴリズムは、2つのステップに分けられる:(1)マーカー;(2)がクリア。
- マーク:マークは、到達可能性解析アルゴリズムは、オブジェクトを通過する前に言った、全ての到達不能オブジェクトがスパム、回復待ちとしてマークされます使用して、我々は到達可能性解析上の言ったことを意味し;
- クリア:この手順は非常に簡単で、ごみの直接のリリースは、共有メモリ空間オブジェクト。
このアルゴリズムは、2つの問題があります。
- 低効率、マーキングおよびこの2つのステップの隙間があるため、全メモリ空間は、オブジェクトごとのリリースメモリによって占有スキャンする必要性が比較的低い効率、低クリアランス効率です。
- このアルゴリズムのゴミを使用した後、それはメモリの断片化の多くの原因となります、それは残りのより多くのメモリが、再度、ガベージコレクションをトリガー、割り当てることができない大空間オブジェクトが得られていない大規模な連続した領域を、表示されることがあります。
2つの比較チャートにより、このアルゴリズムの効果で見てみましょう。ガベージコレクションは、メモリの断片化の多くを引き起こした後、我々は、下の画像で見ることができます。
(2)複製アルゴリズム(コピー)
レプリケーションのアルゴリズム - 低効率とメモリの断片化の問題を解決するためには、新しいアルゴリズムが示唆されました。アルゴリズムの原理は、メモリは、等しいサイズの2つの領域、ストレージオブジェクト予約に分割されます。ターゲットエリアを保管するときは作品のために確保された領域にすべてまだ生きてオブジェクトをコピーして、地域の現在使用中のすべてのメモリの解放を指示するためのスペースの一部を割り当てることができません。その結果、オブジェクトは、予約領域にまだ生きている、とゴミオブジェクトがリリースされています。一方、それが使用される前にスペースがクリアされ、新たに予約領域となり、予約領域が使用される前のスペースとなり、二つのスペースを使用するため、サイクルました。
我々は先に述べたように、ヒープメモリは古いものと新しい世代のに分かれています。新世代では、毎回のガベージコレクションは、オブジェクトを大量にリリースすることができ、わずか数は、また、コピーがあまりにも時間がかかることはないだろうということを意味し、予約領域にコピーするオブジェクトのそのほんの一部を生き残ります。加えて、放出部分の効率よりもすべてのメモリを使用されている空間の直接放出は、はるかに高くなければなりません。同時に、オブジェクトが、別の領域にコピーされていないきれいに配置されているので、何のメモリの断片化は、単により多くのスペースを割り当てることができます。スイープアルゴリズム - だから、アルゴリズムの効率はマークよりもはるかに高いコピーします。以下は、チャートのプレゼンテーションコピーアルゴリズムです:
しかし、問題はここにあり、メモリ領域アルゴリズムレプリケーションが2等分され、それはまた、それぞれが半分のスペースがあることを意味し使用することができない、それはあまりにも無駄になります。空間の分割、いくつかの改善をする必要があるため、そう。IBM
研究ショー98%
生存期間オブジェクトは非常に短いので、複製のためのスペースの半分を保持する必要はありません。実用的な実装では、空間は、三つの領域、より大きなに分割されEden
た空間、ならびに2つの小さなSurvivor
スペース。新しいオブジェクトのためのスペースを割り当てるときは、まずすべてのが割り当てられるEden
場合は、空白Eden
スペースはもはやスペースが割り当てられたときに、ガベージコレクションをトリガしません、この時間は、なりますEden
れる空間でのライブオブジェクトをコピーSurvivor
スペース、その後、空にEden
スペース。ときにEden
再びトリガガベージコレクションにスペースを割り当てることができないことに起因する、それがされる空間的Eden
空間でのライブオブジェクト、そしてそれはにコピーされた最後の時間Survivor
空間でのライブオブジェクトの別の部分にコピーされSurvivor
た空間、そしてその後Eden
に1つずつと、Survivor
空に。すなわち、交互2つの使って、あるSurvivor
任意の天然の生存にオブジェクトを格納するためのスペース、ガベージコレクタ。特定の実装では、これら3つのトランスポート・スペースの比率がある8:1:1
だけ言うことですつまり、10%
スペースを使用することはできません。
図から分かるように、このアルゴリズムは、効率が非常に高いオブジェクトの寿命のほとんどであり、短いですが、ライフサイクルのオブジェクトのほとんどは、非常に長い、もはや適用され、ある場合には、一般的に唯一の新しい世代で使用されたアルゴリズムそう。一定時間のガベージコレクションの後に、生き残るために多数のオブジェクトが残っている場合は、この時間:ここでは、我々は上記のメモリは3つのブロックに、このように分割されたときに言うために使用する場合、問題がある可能性があり、問題を考慮する必要がありますSurvivor
どのように行うためにこれらのオブジェクトを格納するためのスペースの不足?私たちは別の保証を行うためのスペースを持っている必要があり、これが発生したときに、この時間は、これらのオブジェクトは、スペースが呼び出されることを、別の空間に配置され、セキュリティのスペース。我々は銀行融資に行くとして、保証人の必要性は、人々がローンを返済できない場合、保証人が返済しました。上記のアルゴリズムは、新しい世代に使用されている、いわゆる保証スペースは、実際には、古い時代です。高齢者のアルゴリズムに代わって保証を提供しますが、ほとんどの場合、Survivor
需要を満たすことができます。
(3)マーク - 仕上げ(マーク・コンパクト)
オブジェクトの古い時代は、一般的に生存時間よりも長くなっているとして、それは古い時代に上記のコピーを使用して、ガベージコレクションのアルゴリズムには適していません。そして、それは古い時代の特性に応じて、提案マークされた-照合アルゴリズム、注意を払うここを見ては、連結ではなく、最初のアルゴリズムは明らか。このアルゴリズムはまた、2つのステップにマークし、仕上げ、最初のステップをマークし、アルゴリズムは同じであり、キーは仕上げ工程で分割されています。これらのオブジェクトは、すべてのメモリは、この部分に属していないオフに直接次いで整然と配置され、互いに向かって移動し、まで、いわゆる仕上げは、一方の側に移動するオブジェクトのメモリにまだ生きています。マーク-利益の並べ替えは、メモリの断片化の問題を解決することです。以下は、アルゴリズムのプレゼンテーションチャートであります:
(4)世代コレクションアルゴリズム
世代別コレクションアルゴリズムは、新しいアイデアではなく、上記の3つのアルゴリズムを使用します。また先に述べたように、ガベージコレクションの便宜のために、ヒープメモリは、一般的に分割して新世代と旧年二つの部分に。
- 新世代のために、これはエリア対象の生存時間が短くなり、ガベージコレクタは、メモリの大部分を再利用することができますたびに、それは、使用複製アルゴリズムに適したアルゴリズムの保証として、旧宇宙の年間;
- 古い時間のために、毎回のガベージコレクタは唯一のそれぞれが重複の多くを実行する必要があります、複製アルゴリズムを使用する、スペースの小さな一部を解除することができますが、今回は
Survivor
大きなスペース、使用複製アルゴリズムにそれほど適していないので、古い年の必要性一般的には、マークの使用-スイープやマーク-照合アルゴリズム。
第三に、要約
顔にはJVM
、より詳細な説明を行うためのガベージコレクションアルゴリズム、私はこのブログの記事は、このより深い理解の一環だろう読んだ後と考えています。しかし、最終的な分析では、上記の理論の内容だけでは、その後、私は約何かを言うために、ブログを書きますJVM
と、オブジェクトを割り当て、解放する方法を具体的にJVM
ブログのタイトルIIIのシリーズ。
第四に、参照
- 「Java仮想マシンの深い理解」