国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

理解Java_GC:時機、對象、行為、算法

2019-11-06 07:00:59
字體:
供稿:網(wǎng)友

1.GC執(zhí)行的時機

GC將堆里的對象分為新生代,老年代,持久代。新生代有一個Eden區(qū),兩個survivor區(qū)。新生成的對象直接放在Eden區(qū),Eden區(qū)滿了就放進survivor1,當(dāng)survivor1滿了就會出發(fā)一次Minor GC:將存活的對象放入survivor2,然后清空Eden和survivor1,再將survivor區(qū)的交換,保證survivor2為空。當(dāng)survivor2不足以存放Eden和survivor1的存活對象時,就會放入老年區(qū)。較大的對象和長期存活的對象直接進入老年區(qū)。當(dāng)即將進入老年區(qū)的對象超過老年區(qū)剩余大小時,觸發(fā)一次full GC。 頻率上說,Minor GC較頻繁,full GC不頻繁。 持久代會存放一些靜態(tài)值和方法。

2.對象

其實就是對什么對象進行回收。比較標(biāo)準(zhǔn)的回答是:從root搜索不到,而且經(jīng)過第一次標(biāo)記、清理后,仍然沒有復(fù)活的對象。 gc roots: 1. 虛擬機棧中的引用的對象 2. 方法區(qū)中靜態(tài)屬性引用的對象,常量引用的對象 3. 本地方法棧中JNI(即一般說的Native方法)引用的對象。

3.行為

新生代:復(fù)制清理。 老年代:標(biāo)記-清除、標(biāo)記-壓縮

4.算法

1° 引用計數(shù)(早期策略)

堆中每個對象都有一個計數(shù)變量,每當(dāng)有引用指向該對象時,變量加1,每當(dāng)一個引用超出生命周期或指向其他對象時,變量減一。當(dāng)為0時,會被認(rèn)為是垃圾。 - 優(yōu)點:簡單,效率高 - 缺點:無法識別互相引用但不能從外部訪問的對象。

2°標(biāo)記-清除

從root開始掃描,對存活的對象進行標(biāo)記,再掃描整個空間的對象,對沒有標(biāo)記的對象進行回收. - 缺點:會造成內(nèi)存碎片。

3°標(biāo)記-壓縮

在標(biāo)記-清除后,將所有對象向空閑區(qū)移動,并更新指針。成本更高了。 - 優(yōu)點:解決了內(nèi)存碎片 - 缺點:增加句柄,成本高

4°復(fù)制清理

將內(nèi)存空間分為對象面和空閑面。當(dāng)對象面滿了,就將存活的對象復(fù)制到空閑面。然后清除對象面。如果按照1:1的比例分配空間,那太浪費了。如果對象生存期都非常短,那可以減少空閑區(qū)空間,可以節(jié)省空間。如主流的虛擬機上新生代Eden:Survivor1:Survivor2=8:1:1。 - 優(yōu)點:解決了內(nèi)存碎片和增加句柄的問題。 - 缺點:對于生存期長的對象,浪費空間。

這是我看了網(wǎng)上一些大神的博客和一些學(xué)長的理解后,自己整理的我自己關(guān)于java gc的大致認(rèn)識。希望可以解決你的一些小困惑。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 金溪县| 新昌县| 乌海市| 玛多县| 金寨县| 安龙县| 荣昌县| 文安县| 平塘县| 江永县| 张家口市| 南岸区| 汉源县| 越西县| 青龙| 辽宁省| 巫山县| 若尔盖县| 北票市| 宿迁市| 安陆市| 通山县| 新安县| 金坛市| 长乐市| 金寨县| 古田县| 开远市| 光泽县| 清丰县| 盐城市| 高尔夫| 德阳市| 永城市| 垦利县| 安达市| 泗水县| 尼勒克县| 丁青县| 米易县| 原阳县|