java 內(nèi)存區(qū)域劃分
方法區(qū):
1 主要儲存被虛擬機加載的類的信息钟鸵,常量晚伙,靜態(tài)變量拾弃,以及及時編輯器編譯后的代碼等數(shù)據(jù)
2 * 被線程共享
3 方法區(qū)里有一個 運行常量池 , 大部分用于存放靜態(tài)編譯產(chǎn)生的字面量和符號引用丽旅,運行時的常量也可能放在這個常量池里。
虛擬機棧:
1 為Java 方法服務纺棺,方法在執(zhí)行的時候會創(chuàng)建一個棧幀榄笙,用于存儲 局部變量表,操作數(shù)棧五辽,動態(tài)鏈接與方法出口燈办斑,
2 棧為線程私有,生命周期與線程相同杆逗。
3. 局部變量表里存儲的是基本數(shù)據(jù)類型乡翅、returnAddress類型(指向一條字節(jié)碼指令的地址)和對象引用,這個對象引用有可能是指向?qū)ο笃鹗嫉刂返囊?/p>
? 個指針罪郊,也有可能是代表對象的句柄或者與對象相關(guān)聯(lián)的位置蠕蚜。局部變量所需的內(nèi)存空間在編譯器間確定
4.操作數(shù)棧的作用主要用來存儲運算結(jié)果以及運算的操作數(shù),它不同于局部變量表通過索引來訪問悔橄,而是壓棧和出棧的方式
5.每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用靶累,持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接.動態(tài)鏈接就是將常量池中的符
號引用在運行期轉(zhuǎn)化為直接引用。
本地方法棧:跟虛擬機棧差不多癣疟,主要是為Native方法服務挣柬。
程序計數(shù)器:唯一一個不發(fā)生GC的地方 改變計數(shù)值執(zhí)行字節(jié)碼命令,分支睛挚,循環(huán)邪蛔,跳轉(zhuǎn),異常處理
,線程恢復等扎狱,我感覺跟引用計數(shù)法有些像侧到。
堆:對象的創(chuàng)建勃教,一個回收常在這里發(fā)生。
判斷GC對象
1 引用計數(shù)法
引用計數(shù)法就是給對象設置一個計數(shù)器 每當有一個地方引用這個對象 就將計數(shù)器加一匠抗,引用失效時故源,計數(shù)器就減一。
問題:循環(huán)引用汞贸,造成對象回收不掉绳军。
2 可達性分析
從一個Gc Root 對象向下搜索,如果一個對象到GcRoot沒有任何引用鏈相連著蛙,則說明此對象不可用删铃。
GcRoot 對象
棧中的對象(基本)
方法區(qū)類靜態(tài)屬性引用的對象
方法區(qū)常量池引用的對象。
本地方法棧引用的對象
理解上面的 四個 需要對內(nèi)存區(qū)域進行了解以及熟知踏堡。
滿足上述條件后不一定會回收猎唁,還要經(jīng)歷兩次標記的過程。
第一次標記 是否有必要執(zhí)行 finealize()方法顷蟆,當對象沒有覆蓋finealize()方法或者已經(jīng)被虛擬機調(diào)用過诫隅,那么就認為沒有必要,
如果有必要執(zhí)行 finealize()方法帐偎,那么會將這個對象放在 F-Queue的隊列中逐纬,虛擬機觸發(fā)一個線程去執(zhí)行,優(yōu)先級底的線程削樊,
此時Gc會對此對象進行第二次標記豁生,在第二次標記之前,如果這個對象有新的引用漫贞,該對象被移除‘即將回收‘隊列甸箱,如果沒有,則等待回收迅脐。
Java 垃圾回收算法
1 標記-清除
標記回收的對象芍殖,然后統(tǒng)一回收。
優(yōu)點:簡單
缺點:
1 效率低谴蔑,標記跟清除都效率低
2 導致大量的不連續(xù)的內(nèi)存碎片豌骏,導致程序分配較大的對象,沒有充足的內(nèi)存提前進行一次GC(內(nèi)存抖動)
2 復制算法
將內(nèi)存分為兩個相等的兩部分隐锭,每次使用一塊窃躲,當要使用完了,將還存活的對象復制到第二塊內(nèi)存板上钦睡,
然后清除第一塊內(nèi)存框舔,然后在把存活的對象復制回來。(缺點:會浪費內(nèi)存)
改進:
內(nèi)存區(qū)域進行了重新劃分, 8:1:1
較大的那塊 叫 Eden區(qū)刘绣,剩下叫 Survior區(qū)
每次優(yōu)先使用Eden區(qū),弱Eden區(qū)滿挣输,講對象復制到第二塊內(nèi)存纬凤,然后清除Eden區(qū)
如果存活的對象太多,以至于Survior不夠撩嚼,會將這些對象通過分配擔保機制
復制到老年代中(Java 堆)停士。
3 標記-整理
區(qū)分 標記-清除,為了解決標記—清除 產(chǎn)生大量內(nèi)存塊碎片的問題完丽。
當對象存活率較高的時候恋技,也解決了復制算法的效率問題。
前兩個算法的合集吧 在清除無用對象的時候講對象移到另一端逻族,然后清除掉邊界以外的對象蜻底,這樣就不會產(chǎn)
零碎的內(nèi)存碎片了。
4 分代回收
根據(jù)對象的生命周期聘鳞,將堆分為新生代跟老年代薄辅,(永久代),新生代對象生命周期存活的短(感覺這塊是標記)
每次都會有大量的對象死去抠璃,采用復制算法站楚,老年代對象存活時間長,所以可以考慮 標記-清除搏嗡,或者標記—整理窿春。