原創 java金融 java金融 3月9日java
1.引用計數法算法
不能解決對象循環依賴的問題。所以通常不用這種。多線程
2.可達性分析算法。併發
GCRoots 不可達時 對象死,採用這個。ide
1.標記清除算法線程
1.標記、清除階段效率不高。對象
2.標記清除以後會產生大量不連續的碎片,致使分配較大的對象時候,沒法找到足夠的連續內存。內存
2.複製算法ci
1.兩塊相同的內存空間,一塊使用,一塊空閒,致使空間浪費。不存在碎片問題。字符串
3.記整理算法
1.標記過程與"標記清除算法"同樣,整理過程是讓全部存活對象都往一端移動,而後直接清理掉邊界之外的內存。
4.分代收集算法。
把對象進行分代,新生代和來年代。
總結
新生代通常用複製算法,老年代通常用標記整理或者標記清除算法。
CMS在老年代的整個過程分爲4個步驟:
1.初始標記stop the word 僅僅標記GC Roots能直接關聯到的對象,速度很快
2.併發標記進行GCRoots Tracing的過程(判斷對象是否仍在使用中)和用戶線程一塊兒工做。3 .從新標記stop the word 修正併發標記階段因用戶程序繼續運行而致使標記發生變更的那一部分標記記錄。此階段比初始標記階段稍長,但遠比並發標記階段的時間短。
4.併發清除 和用戶線程一塊兒工做。
內存組成:Eden、 Survivor、 Old、 Humongous
內存變化:字符串內部池,已經在JDK7中從永久代中移除,JDK1.7中,存儲在永久代的部分數據就已經轉移到了JavaHeap或者是NativeHeap。但永久代仍存在於JDK1.7中,並沒徹底移除,譬如符號引用(Symbols)轉移到了native heap;字面量(internedstrings)轉移到了javaheap;類的靜態變量(classstatics)轉移到了java heap持久代也移動到了普通的堆內存空間中,改成元空間 。
大對象的分配
1 TLAB(Thread Local Allocation Buffer)線程本地分配緩衝區
2 Eden區中分配
3 Humongous區分配
GC模式
G1提供了兩種Young GC和Mixed GC,兩種都是Stop The World(STW)