jvm

筆者最近學習jvm 的內(nèi)存模型,這里根據(jù)下面幾個模塊來做個總結(jié):

1.jvm的內(nèi)存模型

2.jvm gc原理

jvm的內(nèi)存模型

?jvm 的內(nèi)存模型實現(xiàn)很復雜渐扮,但是工作中經(jīng)常接觸的可大體分為如圖所示:


jvm內(nèi)存模型

1.程序計數(shù)器:當前線程所執(zhí)行字節(jié)碼的行號指示器外构,它是線程私有的,占jvm的一小塊內(nèi)存,不會發(fā)生oom

2.虛擬機棧:它是描述線程調(diào)用方法的一個內(nèi)存模型顶别,它是由一個個棧幀組成,線程每調(diào)用一個方法形成一個棧幀拒啰,棧幀又由局部變量驯绎,操作數(shù)棧,動態(tài)鏈接谋旦,方法返回等信息組成剩失。線程執(zhí)行方法的過程意味著棧幀入棧和出棧的過程,它是線程私有的册着。由于棧的長度在jvm默認是動態(tài)增長的拴孤,所以一般情況下當擴容時內(nèi)存不足會發(fā)生oom

3.本地方法棧:和虛擬機棧相似,虛擬機棧是為虛擬機執(zhí)行Java方法提供服務指蚜,而本地方法棧是為虛擬機執(zhí)行native方法提供服務乞巧。

4.堆:主要用來存儲java對象,它是線程共享的摊鸡,堆按線程來劃分的話绽媒,可為每個線程劃分為一個個的區(qū)域。堆又個劃分成新生代和老人代免猾,堆的內(nèi)存大小可通過 -Xmx20m -Xms20m -Xmn10m參數(shù)來配置是辕,上述Xmx代表堆可用的最大內(nèi)存,Xms為堆初始內(nèi)存猎提,Xmn為新生代內(nèi)存获三,所以老人代內(nèi)存等于堆內(nèi)存減去老人代內(nèi)存 。新生代又可細分為eden區(qū),from survivor區(qū)疙教,to survivor區(qū)棺聊,新生代的可用內(nèi)存為eden區(qū)+survivor區(qū),jvm默認eden和survivor區(qū)的大小比例為8:1贞谓,可通過-XX:SurvivorRatio 或者-XX:NewRatio來配置限佩,內(nèi)存不足時會發(fā)生oom,jvm gc主要回收內(nèi)存的區(qū)域裸弦。

5.方法區(qū):主要用來存放類信息祟同,靜態(tài)變量,動態(tài)鏈接理疙,常量等信息的區(qū)域晕城,線程共享的,默認大小跟最大的堆內(nèi)存一致窖贤,可通過-XX:MaxperSize配置,當內(nèi)存不足時砖顷,也會發(fā)生oom,主要是常量池的oom

6.常量池:存放字面量和符號引用的區(qū)域主之,位于方法區(qū)中择吊。

JVM GC 原理

由于虛擬機棧所需的內(nèi)存在虛擬機啟動時就已經(jīng)基本確定了,而堆內(nèi)存和方法區(qū)的所需大小是不斷變動的槽奕,所以gc主要發(fā)生在這兩個區(qū)域當中几睛。當一個對象沒有被引用的時候,gc會將該對象回收粤攒,從而釋放內(nèi)存所森。

1.如何判斷對象是否可用

可通過引用計數(shù)器和可達性分析算法來判斷對象是否可用,jvm采用的是可達性分析算法來判斷對象是否可用夯接,這里先簡單介紹下引用計數(shù)器焕济,當一個對象被引用時,引用計數(shù)器就會加1盔几,當引用計數(shù)器為0時晴弃,則該對象變?yōu)椴豢捎茫窃趈ava中逊拍,會發(fā)生兩個不可用的對象互相引用的情況上鞠,導致這兩個對象不被回收,從而發(fā)生內(nèi)存泄漏芯丧。

可達性分析算法:jvm通過一系列的gc root芍阎,從該節(jié)點向下搜索,向下搜索的路徑被稱為引用鏈缨恒,當對象的引用鏈對任一gc root不可達時谴咸,從而判定該對象不可用轮听。

如何確定gc root?

1.虛擬機棧中引用的對象

2.方法區(qū)中類靜態(tài)熟悉引用的對象

3.方法區(qū)中常量引用的對象

4.本地方法棧中JNI引用的對象

對象的引用又分為強引用,軟引用岭佳,弱引用血巍,虛引用四種引用

強引用:類似Object x=new Obejct(),jvm gc時驼唱,不會回收此類的對象

軟引用:可用但不是必須的對象藻茂,當內(nèi)存不足時驹暑,可通過標記軟引用玫恳,在垃圾收集器回收時回收此類對象,可通過SoftReference聲明优俘。

弱引用:不是必須的對象京办,在垃圾收集器回收之前,會將該類對象回收帆焕,可通個WeakReference聲明

虛引用:此類對象只是用來標記惭婿,不會創(chuàng)建實例

2.GC算法

1.標記-清除算法:jvm gc時,會將不可用的對象全部標記叶雹,然后一次性的將標記的對象清除财饥,該算法實現(xiàn)簡單,但是標記和清除的效率低且會產(chǎn)生大量的內(nèi)存碎片折晦,會導致申請大內(nèi)存時發(fā)生full gc或者oom


標記-清除

2.復制算法:jvm 將可用的內(nèi)存分為大小相等兩塊钥星,只用其中的一塊,當發(fā)生gc時满着,將該塊存活著的對象全部復制到另一塊中谦炒,然后一次性清除該塊。效率高但是可用空間為內(nèi)存的一半风喇,該算法一般用于新生代中


復制算法

3.標記-整理算法:標記過程和標記-清除算法一樣宁改,但是后續(xù)步驟不是對不可用對象進行回收,而是讓所有存活的對象移至以測魂莫,然后直接清理掉邊界以外的內(nèi)存


標記-整理
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末还蹲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耙考,更是在濱河造成了極大的恐慌谜喊,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳骡,死亡現(xiàn)場離奇詭異锅论,居然都是意外死亡,警方通過查閱死者的電腦和手機楣号,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門最易,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怒坯,“玉大人,你說我怎么就攤上這事藻懒√拊常” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵嬉荆,是天一觀的道長归敬。 經(jīng)常有香客問我,道長鄙早,這世上最難降的妖魔是什么汪茧? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮限番,結(jié)果婚禮上舱污,老公的妹妹穿的比我還像新娘。我一直安慰自己弥虐,他們只是感情好扩灯,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霜瘪,像睡著了一般珠插。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颖对,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天捻撑,我揣著相機與錄音,去河邊找鬼惜互。 笑死布讹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的训堆。 我是一名探鬼主播描验,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坑鱼!你這毒婦竟也來了膘流?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鲁沥,失蹤者是張志新(化名)和其女友劉穎呼股,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體画恰,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡彭谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了允扇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缠局。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡则奥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狭园,到底是詐尸還是另有隱情读处,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布唱矛,位于F島的核電站罚舱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绎谦。R本人自食惡果不足惜管闷,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燥滑。 院中可真熱鬧渐北,春花似錦、人聲如沸铭拧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搀菩。三九已至,卻和暖如春破托,著一層夾襖步出監(jiān)牢的瞬間肪跋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工土砂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留州既,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓萝映,卻偏偏與公主長得像吴叶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子序臂,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 原文閱讀 前言 這段時間懈怠了蚌卤,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了奥秆,挺好的~給他們點贊逊彭,這博客我...
    碼農(nóng)戲碼閱讀 5,952評論 2 31
  • jvm原理 Java虛擬機是整個java平臺的基石侮叮,是java技術實現(xiàn)硬件無關和操作系統(tǒng)無關的關鍵環(huán)節(jié),是java...
    AI喬治閱讀 17,229評論 21 486
  • 1.一些概念 1.1.數(shù)據(jù)類型 Java虛擬機中悼瘾,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型囊榜」纫欤基本類型的變量保存原始...
    落落落落大大方方閱讀 4,524評論 4 86
  • Java 虛擬機有自己完善的硬件架構, 如處理器、堆棧锦聊、寄存器等歹嘹,還具有相應的指令系統(tǒng)。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,685評論 0 10
  • 一. 垃圾回收的意義 在C++中孔庭,對象所占的內(nèi)存在程序結(jié)束運行之前一直被占用尺上,在明確釋放之前不能分配給其它對...
    Stan_Z閱讀 1,924評論 0 25