ガベージコレクション(ガベージコレクション)は、世代別コレクションアルゴリズムのアイデアを採用し、若い世代を頻繁に収集します。古い世代はあまり収集せず、基本的に永続的な世代は移動しません。
リサイクル地域により、若年世代のマイナーGc用と、新世代を随時伴う旧世代のメジャーGc用の2種類に分けられます。
ガベージとは、スタック参照オブジェクトによって指されていないヒープメモリ空間など、使用されなくなったメモリ内の空間を指します。
廃棄物の分類:
⑴強い参照(StrongReferenceは)[]スパムではないです常见的普通对象引用,就算出现了OOM也不会对该对象进行回收
。
⑵ソフト参照(SoftReference)[ごみ]はあってもよいです:需要SoftReference类实现,内存空间不足了,垃圾回收器就会回收它
。
⑶弱参照(弱い参照) 需要WeakReference类实现,只要GC,对象就被回收
[ごみ] 。
⑷仮想基準虚引用主要用来跟踪对象被垃圾回收器回收的活动
(PhantomReference) 。
⑴参照カウント:存在“循环依赖”问题,弃用
;
⑵列挙ルート到達可能性解析方法を実行します通过一些被称为垃圾回收根(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时(即从 GC Roots 节点到该节点不可达),则证明该对象是不可用的
。
ルート是一组必须活跃的引用
GC: 。
GC Rootとして使用できるオブジェクトには、次の4種類があります:
① 栈(栈帧中的本地变量表)中引用的对象
;
② 方法区中类静态属性引用的对象
;
③ 方法区中常量引用的对象
;
④ 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
;
マイナーGC:Eden領域がいっぱいであるか、新しく作成されたオブジェクトのサイズがEdenの残りのスペースよりも大きい;
メジャーGC:旧世代のスペース不足、永続世代のスペース不足、マイナーgcの昇格失敗、表示呼び出しSystem.gc();
注:
昇格の失敗は、マイナーgcプロセス中に、生存者の残りのスペースが現在使用中のエデンと生存者のオブジェクトを収容するのに十分ではないことです。収容できないオブジェクトのみ、古い世代(昇格)に移動できます。それがいっぱいになると、それ以上のオブジェクトを収容できなくなり、通常は完全なgcが付随するため、プロモーションが失敗します。この状況では通常、若い世代のサイズを増やし、新しい世代のオブジェクトを若い世代の間にできるだけクリーンアップする必要があります。
コピーアルゴリズム(マイナーGCで使用されるアルゴリズム):
GCルートから始めて、トレースを通じてEdenおよびFrom領域から生き残っているオブジェクトを見つけ、To領域にコピーします。GCが完了した後、FromおよびToはIDを交換し、次のメモリ割り当てはTo領域から開始されます。生き残ったオブジェクトがマイナーGCを受けるたびに、経過時間は1ずつ増加し、特定のしきい値(デフォルトは15)に達すると、古いオブジェクトになります。このオブジェクトは-XX:MaxTenuringThreadsholdで構成できます。
Mark-sweep(Major GCで使用されるアルゴリズム):
ヒープ内の使用可能なスペースがなくなると、プログラム全体(ワールドストップ)がマーキングとクリーニングのために一時停止されます。
マーク:GCルートからスキャンを開始し、残っているオブジェクト(GCルート到達可能オブジェクト)をマークします;
クリア:ヒープ全体をトラバースし、マークされていないオブジェクトをクリアします。
Mark-Compression(Major GCで使用されるアルゴリズム):
マーク:GCルートからスキャンを開始し、残っているオブジェクト(GCルート到達可能オブジェクト)を
マークします。圧縮:ヒープ全体をトラバースし、マークされたオブジェクトを一端に移動し、境界を超えてメモリを直接クリアします。
Mark-Sweep-Compression(Major GCで使用されるアルゴリズム):
- Mark-SwapとMark-Compactの組み合わせ。
- Mark-Swapと一致し、複数のGCの後にCompect。
要約:
若い世代のマイナーGCはコピーアルゴリズムを使用し、
古い世代のメジャーGCはマークスイープおよびマークスイープ圧縮アルゴリズムを使用します。
メモリ効率:コピーアルゴリズム>マーククリア>マーク圧縮;
メモリ均一性:コピーアルゴリズム=マーク圧縮>マーククリア;
メモリ使用率:マーククリア=マーク圧縮>コピーアルゴリズム;