Java內(nèi)存回收和常用算法
1.什么是垃圾?(Java中)
(1)一個對象沒有任何引用指向這個對象
(2)幾個對象之間互相循環(huán)引用,但是沒有引用指向這個循環(huán),那這個幾個對象屬于一堆垃圾
總結(jié)一句話:沒有任何引用指向的一個對象或者多個對象
2.如何定位垃圾?
(1)reference count(引用計數(shù)):
對于對象進(jìn)行一個引用的標(biāo)記,有兩個引用它的就標(biāo)記為2,沒有引用它的就標(biāo)記為0,但是這種對于循環(huán)的引用的垃圾是無法回收的,這樣就會發(fā)生內(nèi)存泄漏
(2)Root Searching(根可達(dá)算法):
根據(jù)根對象一步一步去找引用的對象,最終沒有找到的都被認(rèn)為是垃圾

根對象包括:線程棧變量,靜態(tài)變量,常量池,JNI指針
以下是java中的原話:

3.常見的垃圾回收算法
Mark-Sweep(標(biāo)記清除)
Coping(拷貝)
Mark-Compact(標(biāo)記壓縮)
(1)Mark-Sweep——缺點(diǎn):位置不連續(xù),產(chǎn)生碎片

(2)Coping——缺點(diǎn):沒有碎片,但是浪費(fèi)空間

(3)Mark-Compact——沒有碎片,也不浪費(fèi)空間,但是效率較低,比copy略低
有用的部分都壓縮到最前面,空著的部分放在最后面,不碎片化,也不浪費(fèi)空間

4.JVM內(nèi)存分代模型(用于分代垃圾回收算法)
1.部分垃圾回收器使用的模型
2.新生代+老年代+永久代(1.7)/元數(shù)據(jù)區(qū)(1.8)Metaspace
(1)永久代和元數(shù)據(jù)區(qū)都是用來裝class對象的
(2)永久代必須指定大小限制,元數(shù)據(jù)是可以設(shè)置,也可以不設(shè)置,無上限(受限于物理內(nèi)存)
(3)jdk1.7版本的字符串常量是存在永久代的,1.8版本的時候是存在堆里
(4)MethodArea(方法區(qū))是一種邏輯概念,在jdk1.7版本上對應(yīng)的是永久代,在jdk1.8上對應(yīng)的是元數(shù)據(jù)區(qū)
new-young:存活對象少,使用copy算法,效率高
old:垃圾少,一般使用mark-compact,g1使用copy
在java1.7中還有permanent算法
3.堆內(nèi)存邏輯分區(qū)

new一個對象,直接去找伊甸區(qū),如果new的對象太大,伊甸區(qū)裝不下,直接進(jìn)入老年代
YGC使用拷貝算法,FGC使用標(biāo)記壓縮算法,YGC雖然無法避免但是效率較高,FGC效率較低
(1)新生代=Eden + 2個suvivor區(qū)
YGC回收之后,大多數(shù)的對象(90%)會被回收,活著的進(jìn)入s0再次YGC,活著的對象eden + s0 -> s1再次YGC,eden + s1 -> s0年齡足夠 -> 老年代 (老版的垃圾回收器:15歲,15歲即回收15次,為什么是15次呢,因為在一個對象的頭部有4位來代表它的年齡,這個4位代表的最大數(shù)就是15, CMS垃圾回收器:6歲)s區(qū)裝不下 -> 老年代
(2)老年代
頑固分子老年代滿了FGC Full GC
(3)GC Tuning (GC調(diào)優(yōu),假設(shè)使用的是Generation算法)
盡量減少FGCMinorGC = YGCMajorGC = FGC
5.Java到目前為止產(chǎn)生的10種垃圾回收器

垃圾回收器組合:
最早的jdk垃圾回收器的組合: Serial + Serial Old
常見的垃圾回收器組合Parallel Scavenge + Parallel Old
(1)Serial垃圾回收器

(2)Parallel Scavenge 年輕代 并行回收

(3)ParNew 年輕代 配合CMS的并行回收

(4)SerialOld

(5)ParallelOld

(6)Concurrent Mark Sweep(CMS) 老年代,并發(fā)的, 垃圾回收和應(yīng)用程序同時運(yùn)行,降低STW的時間(200ms)

(7)G1(10ms)


(8)ZGC (1ms) PK C++
(9)Shenandoah
(10)Eplison
這是一個空的GC,本身并沒有做任何事情,只是用來調(diào)試jdk的,jdk11才有
jdk1.8 默認(rèn)的垃圾回收:Parallel Scavenge + Parallel Old
6.GC概念

7.總結(jié),內(nèi)存分配流程圖

8.JVM調(diào)優(yōu)工具
arthas
Java VisualVM
jmap命令

9.GC調(diào)優(yōu)日志詳解

