推奨されるJava 自動仕分けのメモリは、 ソリューションの自動化されたオブジェクトとリサイクルのオブジェクトのメモリを割り当てるメモリを 、これらの2つの問題をも目的としているJavaのヒープメモリモデル、メモリの損失やその他の問題に効果的なソリューション。
1.メモリカテゴリー:
新生代:
エデンメモリ | 新しいオブジェクトの保存場所 |
survivor0 | メモリがいっぱいになるとエデンはsurvivor0コピースペース、回復GC一度エデンメモリ空間に生き残ったオブジェクトになります |
survivor1 | エデンとsurvivor0メモリが一杯になったとき、それは存続オブジェクトが、survivor1スペースにコピーエデンsurvivor0が回収されているであろう、survivor0は、同じ機能のsurvivor1を実行します。 |
古い年:
新生代には三つのゾーン、フルタイムがあることが、新しい世代、完全にいっぱいの新しい世代に分かれていると、彼らは歳に保存されているすべてのオブジェクトの新しい世代に生き残るために、長い生存期間を格納したオブジェクト、minorGC 1回発生
あるいは、そのようないくつかの長さの文字列など、いくつかの大規模なオブジェクト、
永久世代:
いくつかの定数、finalキーワード修正されたオブジェクト、または変数を格納します
しかし、永久に代わっは、元のスペースを置き換え、jdk1.7後にキャンセルされました
次元空間:
永久的な役割を持つ次元空間が好きなことではなく、ローカルメモリに格納され、ローカルメモリは限られています
2.オブジェクトが判定アルゴリズムを生き延び:
1.参照カウントアルゴリズム:
、オブジェクトを再利用することができるかどうかを決定する別の参照フラグがある場合にフラグを追加するには+1、または-1オブジェクトの参照の数によって決定されるであろう。
参照カウントコレクタがすぐに実装することができ、いくつかのプログラムが良い適応性を持つように長い時間がかかるが、彼は致命的な欠陥を持っていることは、彼は2つのオブジェクト間の相互参照の事件を解決することができないということです
2.到達可能性解析アルゴリズム:
オブジェクト参照チェーンアップオブジェクトを再利用することができるかどうかを決定するかどうかを判定することによって、プログラムがオブジェクトの一連のマップなどのすべての参照関係は、ノードの先頭から、出発点として、「GCのルーツ」と呼ばれるであろう検索は、検索基準経路トラバース鎖(参照鎖)と呼ばれています。
GCRootと物体との間のチェーンリンクへの参照が存在しない場合、オブジェクトが回収されます。
3.GCコレクションアルゴリズム:
1.マーククリアランス方法
クリアフラグタグは二つの部分と明確さに分割し、アルゴリズムがルートセットをスキャンし、ライブオブジェクトをマーキングし、ルートセットがスキャンされる物体は再び回復し、非標識。
短所:
1.時間:あまりにも多くの時間がかかり、非効率的。
2.スペース:クリアスペースほとんど不連続小さなスペース、あなたは大きなスペースオブジェクトを開きたい場合は、それはminorGc中に必要です
2.アルゴリズムをコピーします。
新世代で使用されるアルゴリズム、オブジェクトの短い生存期間の新世代、及びオブジェクトは存続の小さな割合を占めているが、それが複製アルゴリズムの新世代の開発に取り組んでいます。
エデンメモリスペースが満杯になると、エデンメモリライブオブジェクトが行きsurvivor0メモリ空間にコピーし、その後、すべての空のスペースエデンメモリ、その後、エデンスペースの後、survivor0エデンスペースとメモリ空間は、すべてのフルを格納する場合と、すべての完全な場合には、メモリ空間の時代に、古いオブジェクトの生存期間となりますので、survivor0生存空間は、survivor1メモリ空間にコピーされたオブジェクト。
3.マーク照合アルゴリズム
このアルゴリズムは、同様のマークスイープアルゴリズムであるが、それはクリアしたときに、再度、明確なスペースアルゴリズムをマーキングの問題を解決するために、残りのスペースをラインアップしますスペースを再編成します。
4.世代コレクションアルゴリズム
各世代のために異なっている主なアルゴリズムは、独自のGCアルゴリズムを持っている、主な用途の新世代は、アルゴリズムをコピーすることで、昔の主な記号が明確と照合アルゴリズムのサインです。
2種類のガベージコレクション:
♦ minorGC: monorGCは非常に頻繁になりますので、リサイクルの新世代、とは、オブジェクトの新しい世代の短い生存期間のために、古い時代には影響を与えないので、アルゴリズムの高効率化が速いここで使用しました。
♣ FullGC:新世代と旧時代を含む全メモリ領域の回復うちキャリー、それは完全な回復が必要になりますので、もっと時間が必要で、我々は複数の使用fullGCを避ける必要があり、完全なGCの原因は、次のとおり歳充填されて、永久ジェネレーション(パーマ)が満たされているとSystem.gc()
明示的のように呼び出されます。
第四に、メモリの割り当てと回復の戦略
-
对象优先在Eden分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC。现在的商业虚拟机一般都采用复制算法来回收新生代,将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。 当进行垃圾回收时,将Eden和Survivor中还存活的对象一次性地复制到另外一块Survivor空间上,最后处理掉Eden和刚才的Survivor空间。(HotSpot虚拟机默认Eden和Survivor的大小比例是8:1)当Survivor空间不够用时,需要依赖老年代进行分配担保。
-
大对象直接进入老年代。所谓的大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组。
-
长期存活的对象将进入老年代。当对象在新生代中经历过一定次数(默认为15)的Minor GC后,就会被晋升到老年代中。
-
动态对象年龄判定。为了更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。