JVM 內(nèi)存模型

JVM 內(nèi)存模型

JVM 整體結(jié)構(gòu)及內(nèi)存模型

JVM 內(nèi)存模型圖涉及變量代碼如下:

class Test {

    public static Order order = new Order();

    public int test() {
        int a = 1;
        int b = 2;
        User user = new User();
        int c = a + b;
        return c;
    }

    public static void main(String[] args) {
        new Test().test();
        System.out.println("===test方法出口返回===");
    }
}

class User {
}

class Order {
}
JVM內(nèi)存模型.png

JVM 為為每個線程分配了獨立的椢裳。空間道逗,程序計數(shù)器,本地方法棧卖词。在一個線程內(nèi),方法的調(diào)用會給方法分配一塊棧幀即横,每個棧幀都有獨立的局部變量表裆赵,操作數(shù)棧,動態(tài)鏈接页藻,方法出口(保證了方法內(nèi)部局部變量的作用范圍)

test 方法操作數(shù)棧變化:在局部變量表中分配給變量 a 內(nèi)存空間植兰,將整數(shù) 1 壓入操作數(shù)棧,然后出棧賦值給變量 a楣导,在給變量 b 分配內(nèi)存空間,將整數(shù) 2 壓入操作數(shù)棧,然后出棧賦值給變量 b膝晾,從局部變量表中找到 a 和 b 的值务冕,存入操作數(shù)棧,進行整數(shù) add 操作臊旭,得到結(jié)果壓入操作數(shù)棧箩退,出棧賦值給變量 c,從局部變量表得到 c 的值滋戳,壓入操作數(shù)棧啥刻,執(zhí)行 return 返回。


操作數(shù)棧變化過程.png

GC 垃圾回收機制

Eden 區(qū)滿了之后會執(zhí)行 minor GC 清理 Eden 區(qū)和非空的 Survivor 區(qū)娄涩,GC 之后將存活對象移至空的 Survivor 區(qū),并將分代年齡+1映跟,分代年齡到 15 之后會將存活對象存入年老代蓄拣,當年老代滿了之后會執(zhí)行 Full GC 清理年輕代,年老代和元空間扬虚,如果 Full GC 之后沒有清理出空間就會出現(xiàn) OOM(內(nèi)存溢出)。 JVM 會根據(jù) GC Roots 查找所有依賴的對象直到最后一個沒有依賴的對象為止弯蚜,將這些對象標記為非垃圾對象孔轴。每次 GC 會伴隨 STW 機制。

什么是 GC Roots

JVM 中判斷一個對象是否標記為可回收的對象是根據(jù)可達性分析算法碎捺,顧名思義路鹰,可達性分析需要知道當前對象(是否需要回收的對象)的起點,而這個起點對象在當前時刻一定是存活的收厨,才能保證對當前對象是否需要回收的判斷是正確的晋柱,所以 GC Root 表示:當前時刻存活的對象诵叁。

GC Roots 包含以下幾種:

  1. 方法中的局部變量
  2. 靜態(tài)變量引用的對象
  3. 常量(被 final 修飾)
  4. 本地方法引用的對象
什么是 STW

Stop 一 the 一 World雁竞,簡稱 STW,指的是 Gc 事件發(fā)生過程中拧额,會使得用戶線程停止執(zhí)行碑诉,產(chǎn)生應用程序的卡頓。

JVM 為什么會設(shè)計 STW 機制

在 GC 期間侥锦,如果用戶線程不停止进栽,可能剛剛根據(jù) GC Roots 找到的非垃圾對象可能變成垃圾對象,使得 GC 未能回收恭垦。

JVM 內(nèi)存參數(shù)設(shè)置

JVM參數(shù)設(shè)置.png

Spring Boot 程序的 JVM 參數(shù)設(shè)置格式(Tomcat 啟動直接加在 bin 目錄下 catalina.sh 文件里)

    ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M

關(guān)于元空間的 JVM 參數(shù)有兩個:-XX:MetaspaceSize=N 和-XX:MaxMetaspaceSize=N

-XX:MaxMetaspaceSize:設(shè)置元空間最大值快毛,默認是-1,即不限制番挺,或者說只受限于本地內(nèi)存大小唠帝。

-XX:MetaspaceSize:指定元空間觸發(fā) Full GC 的初始閾值(元空間無固定初始大小),以字節(jié)為單位玄柏,默認是 21M襟衰,達到該值就會觸發(fā) Full GC 進行類型卸載,同時收集器會對該值進行調(diào)整:如果釋放了大量的空間粪摘,就適當降低該值右蒲;如果釋放了很少的空間,那么在不超過-XX:MaxMetaspaceSize(如果設(shè)置了的話)的情況下赶熟,
適當提高該值瑰妄。這個跟早期 jdk 版本的-XX:PermSize 參數(shù)意思不一樣,-XX:PermSize 代表永久代的初始容量映砖。由于調(diào)整元空間的大小需要 Full GC间坐,這是非常昂貴的操作,如果應用在啟動的時候發(fā)生大量 Full GC,通常都是由于永久代或元空間發(fā)生了大小調(diào)整竹宋,基于這種情況劳澄,一般建議在 JVM 參數(shù)中將 MetaspaceSize 和 MaxMetaspaceSize 設(shè)置成一樣的值,并設(shè)置得比初始值要大蜈七,對于 8G 物理內(nèi)存的機器來說秒拔,一般設(shè)置為 256M。

StackOverFlowError

public class TestStackOverFlow {
    static int i = 0;
    public static void overflow() {
        i++;
        overflow();
    }

    public static void main(String[] args) {
        overflow();
    }
}

結(jié)論:-Xss設(shè)置越小飒硅,說明一個線程棧里能分配的棧幀就越少砂缩,但是對JVM整體來說能開啟的線程數(shù)會更多。
JVM優(yōu)化就是盡可能讓對象都在新生代里分配和回收三娩,盡量別讓太多對象頻繁進入老年代庵芭,避免頻繁對老年代進行垃圾回收,同時給系統(tǒng)充足的內(nèi)存大小雀监,避免新生代頻繁的進行垃圾回收双吆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市会前,隨后出現(xiàn)的幾起案子好乐,更是在濱河造成了極大的恐慌,老刑警劉巖瓦宜,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹宴,死亡現(xiàn)場離奇詭異,居然都是意外死亡歉提,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門区转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苔巨,“玉大人,你說我怎么就攤上這事废离≈对螅” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵蜻韭,是天一觀的道長。 經(jīng)常有香客問我,道長页响,這世上最難降的妖魔是什么非洲? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮俯画,結(jié)果婚禮上析桥,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好泡仗,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布埋虹。 她就那樣靜靜地躺著,像睡著了一般娩怎。 火紅的嫁衣襯著肌膚如雪搔课。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天截亦,我揣著相機與錄音爬泥,去河邊找鬼。 笑死魁巩,一個胖子當著我的面吹牛急灭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谷遂,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼葬馋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肾扰?” 一聲冷哼從身側(cè)響起畴嘶,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎集晚,沒想到半個月后窗悯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡偷拔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年蒋院,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莲绰。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡欺旧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛤签,到底是詐尸還是另有隱情辞友,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布震肮,位于F島的核電站称龙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏戳晌。R本人自食惡果不足惜鲫尊,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沦偎。 院中可真熱鬧马昨,春花似錦竞帽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匙奴,卻和暖如春堆巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泼菌。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工谍肤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哗伯。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓荒揣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焊刹。 傳聞我的和親對象是個殘疾皇子系任,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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