java虛擬機(jī)和內(nèi)存優(yōu)化總結(jié)

前一段時(shí)間總結(jié)了spring和springmvc相關(guān)的知識(shí),面試中常問(wèn)到的除了這些基本的框架之外,還有底層的基礎(chǔ)知識(shí),比如與java虛擬機(jī)相關(guān)的知識(shí)點(diǎn),這一部分也是面試中經(jīng)常問(wèn)到的,在面試中高級(jí)java工程師的時(shí)候,這一部分是很重要的一個(gè)點(diǎn),倘若一個(gè)程序員在這一塊沒(méi)有了解或者看過(guò)學(xué)習(xí)過(guò)相關(guān)的知識(shí),那么他的基礎(chǔ)就是相對(duì)薄弱的,面試成功的可能性也會(huì)降低很多.
這篇文章會(huì)把java的整體運(yùn)行結(jié)構(gòu)和jvm的關(guān)系做個(gè)梳理,但是不再用大篇幅的文字?jǐn)⑹龅膬?nèi)容,這樣不容易記憶,而且容易產(chǎn)生厭看的情緒.所以我決定使用采用繪圖+少部分文字描述為主.

一姻几、弄明白java的整體運(yùn)行結(jié)構(gòu)與jvm的關(guān)系

1. jvm是什么?

Java虛擬機(jī)(英語(yǔ):Java Virtual Machine,縮寫為JVM),一種能夠運(yùn)行Java bytecode的虛擬機(jī),以堆棧結(jié)構(gòu)機(jī)器來(lái)進(jìn)行實(shí)做匙握。最早由太陽(yáng)微系統(tǒng)所研發(fā)并實(shí)現(xiàn)第一個(gè)實(shí)現(xiàn)版本愧杯,是Java平臺(tái)的一部分啡省,能夠運(yùn)行以Java語(yǔ)言寫作的軟件程序Java虛擬機(jī)有自己完善的硬體架構(gòu)标沪,如處理器朱沃、堆棧苞轿、寄存器等茅诱,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息搬卒,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼-字節(jié)碼瑟俭,就可以在多種平臺(tái)上不加修改地運(yùn)行。通過(guò)對(duì)中央處理器CPU所執(zhí)行的軟件實(shí)現(xiàn)契邀,實(shí)現(xiàn)能執(zhí)行編譯過(guò)的Java程序碼與應(yīng)用程序)摆寄。
作為一種編程語(yǔ)言的虛擬機(jī),實(shí)際上不只是專用于Java語(yǔ)言坯门,只要生成的編譯文件匹配JVM對(duì)加載編譯文件格式要求微饥,任何語(yǔ)言都可以由JVM編譯運(yùn)行。此外古戴,除了甲骨文欠橘,也有其他開(kāi)源或閉源的實(shí)現(xiàn)。--摘自維基百科

2.java運(yùn)行過(guò)程與jvm關(guān)系
java運(yùn)行流程與jvm關(guān)系示意圖

上圖能夠清晰的展示我們從新編譯一個(gè)java類到j(luò)vm中執(zhí)行的全部流程,對(duì)堆棧等地方的功能做一個(gè)解釋:

  • 堆:java的引用傳遞實(shí)現(xiàn),依靠的就是堆內(nèi)存,同一塊堆內(nèi)存可以被不同的棧內(nèi)存所指向;
  • 棧:程序運(yùn)行的單位,里面存儲(chǔ)的信息都與當(dāng)前的線程有關(guān)系,包括局部變量,程序的運(yùn)行狀態(tài),方法返回值等;
  • 方法區(qū):在進(jìn)行遞歸調(diào)用時(shí),所保存的堆棧內(nèi)容,它由局部變量表,操作數(shù)棧,當(dāng)前方法所屬的類的運(yùn)行時(shí)常量的引用,返回地址等;
  • 程序計(jì)數(shù)器:一塊非常小的內(nèi)存空間,主要用來(lái)做一個(gè)計(jì)數(shù)操作,對(duì)象的晉升問(wèn)題(關(guān)系到垃圾回收(GC)).

二现恼、堆內(nèi)存組織結(jié)構(gòu)以及與內(nèi)存有關(guān)的參數(shù)設(shè)置(優(yōu)化)

在整個(gè)jvm運(yùn)行時(shí)數(shù)據(jù)區(qū),要對(duì)jvm進(jìn)行優(yōu)化,那么堆內(nèi)存是重點(diǎn)優(yōu)化對(duì)象.原因是棧本身所占的內(nèi)存比率很小,而java中所有new對(duì)象全部放在堆內(nèi)存區(qū)域.那么對(duì)這些對(duì)象的回收控制策略就非常重要.

1.堆內(nèi)存的內(nèi)部結(jié)構(gòu)

堆內(nèi)存內(nèi)部結(jié)構(gòu)

上圖展示了堆內(nèi)存的內(nèi)部結(jié)構(gòu),值得注意的是,在1.8之前和之后,java的永久代被取消,被元空間所代替(元空間就是電腦本省的物理內(nèi)存),下面對(duì)各個(gè)區(qū)的作用做簡(jiǎn)單的解釋:
年輕代:

  • Eden區(qū):新生的小對(duì)象,每當(dāng)使用關(guān)鍵字new的時(shí)候,默認(rèn)都會(huì)在此空間進(jìn)行對(duì)象創(chuàng)建,如果創(chuàng)建的對(duì)象過(guò)多,那么最終的的結(jié)果就是Eden區(qū)的空間爆滿,此時(shí)會(huì)發(fā)生晉級(jí)操作(在經(jīng)歷若干次minorGC后還保留的對(duì)象,晉升到存活區(qū))
  • 存活區(qū):minorGC存活的對(duì)象保存的區(qū)域,存活區(qū)有兩塊空間S0和S1,有一塊始終為空,該區(qū)域保存對(duì)象向老年代晉升(停止-復(fù)制算法);
    老年代:經(jīng)歷了數(shù)次GC之后還保留的對(duì)象,這些對(duì)象經(jīng)歷了多次GC仍然存活,但是也有可能在接下來(lái)的某一次被清除掉,同時(shí)要注意,假如是new一個(gè)很大的對(duì)象,那么是直接保存到老年代來(lái),如果老年代空間不夠了,會(huì)出現(xiàn)MajorGC(FullGC)進(jìn)行老年代的清理,非常耗費(fèi)性能(不建議使用system.gc()的原因);
    在發(fā)生MajorGC的時(shí)候,jvm會(huì)檢查每次晉升入老年代的對(duì)象的大小是否大于老年代剩余空間的大小,若大于,直接觸發(fā)一次FullGC,否則可以自定義是否允許擔(dān)保失敗(關(guān)鍵字設(shè)置:XX:+HandlePromotionFailure)(標(biāo)記-清理算法);
    元空間(永久代):jdk1.8之后,取消了永久代,變成了元空間,不再在堆內(nèi)存里面保存類,字符串常量等,采用了元空間之后,不會(huì)再出現(xiàn)堆溢出的異常.
2. 重要參數(shù)

通過(guò)調(diào)整jvm的相關(guān)參數(shù),可以優(yōu)化堆內(nèi)存,提高jvm的運(yùn)行效率,下面對(duì)幾個(gè)重要參數(shù)做一下總結(jié):

  • -Xms:設(shè)置初始化的內(nèi)存分配大小,,默認(rèn)采用的大小為物理大小的1/64;
  • -Xmx:設(shè)置最大的內(nèi)存可用空間,,默認(rèn)采用的大小為物理大小的1/4;
  • -Xmn:設(shè)置年輕代大小,默認(rèn)采用的大小為物理大小的1/64;
  • -Xss:設(shè)置每一個(gè)線程所占用的棧的大小

三肃续、GC算法

在jdk1.7之后,正式發(fā)布了G1回收算法;
在此之前,GC算法的發(fā)展進(jìn)程如下:

  1. Serial(串行)收集器
    在jdk1.3.1之前,java虛擬機(jī)僅僅能使用Serial收集器叉袍。 Serial收集器是一個(gè)單線程的收集器始锚,但它的“單線程”的意義并不僅僅是說(shuō)明它只會(huì)使用一個(gè)CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進(jìn)行垃圾收集時(shí)畦韭,必須暫停其他所有的工作線程疼蛾,直到它收集結(jié)束肛跌。
  2. Parallel(并行)收集器
    Parallel收集器也稱吞吐量收集器艺配,相比Serial收集器,Parallel最主要的優(yōu)勢(shì)在于使用多線程去完成垃圾清理工作衍慎,這樣可以充分利用多核的特性转唉,大幅降低gc時(shí)間。
  3. CMS(并發(fā))收集器
    CMS收集器在Minor GC時(shí)會(huì)暫停所有的應(yīng)用線程稳捆,并以多線程的方式進(jìn)行垃圾回收赠法。在Full GC時(shí)不再暫停應(yīng)用線程,而是使用若干個(gè)后臺(tái)線程定期的對(duì)老年代空間進(jìn)行掃描乔夯,及時(shí)回收其中不再使用的對(duì)象砖织。
  4. G1(并發(fā))收集器
    G1收集器(或者垃圾優(yōu)先收集器)的設(shè)計(jì)初衷是為了盡量縮短處理超大堆(大于4GB)時(shí)產(chǎn)生的停頓。相對(duì)于CMS的優(yōu)勢(shì)而言是內(nèi)存碎片的產(chǎn)生率大大降低末荐。
    以上就是GC算法發(fā)展史,具體的各個(gè)算法有什么不同,暫時(shí)還沒(méi)有特別深入的研究和比較,后續(xù)會(huì)再開(kāi)一篇補(bǔ)上.

總結(jié)

這篇文章對(duì)java運(yùn)行的流程和jvm的關(guān)系,以及jvm的內(nèi)部結(jié)構(gòu),和jvm的堆內(nèi)存優(yōu)化,做了一個(gè)總結(jié),但是GC算法是一個(gè)大頭,一篇文章的篇幅實(shí)在是無(wú)法詳述,后續(xù)再接再厲,爭(zhēng)取把這一快吃透.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侧纯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甲脏,更是在濱河造成了極大的恐慌眶熬,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異娜氏,居然都是意外死亡拳缠,警方通過(guò)查閱死者的電腦和手機(jī)含末,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門燥筷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)步咪,“玉大人萌抵,你說(shuō)我怎么就攤上這事全景÷央梗” “怎么了卜壕?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵辩块,是天一觀的道長(zhǎng)最岗。 經(jīng)常有香客問(wèn)我帕胆,道長(zhǎng),這世上最難降的妖魔是什么般渡? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任懒豹,我火速辦了婚禮,結(jié)果婚禮上驯用,老公的妹妹穿的比我還像新娘脸秽。我一直安慰自己,他們只是感情好蝴乔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布记餐。 她就那樣靜靜地躺著,像睡著了一般薇正。 火紅的嫁衣襯著肌膚如雪片酝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天挖腰,我揣著相機(jī)與錄音雕沿,去河邊找鬼。 笑死猴仑,一個(gè)胖子當(dāng)著我的面吹牛审轮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辽俗,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疾渣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了崖飘?” 一聲冷哼從身側(cè)響起榴捡,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坐漏,沒(méi)想到半個(gè)月后薄疚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碧信,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年街夭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砰碴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡板丽,死狀恐怖呈枉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埃碱,我是刑警寧澤猖辫,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站砚殿,受9級(jí)特大地震影響啃憎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜似炎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一辛萍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羡藐,春花似錦贩毕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘩扼,卻和暖如春谆甜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邢隧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工店印, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冈在,地道東北人倒慧。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像包券,于是被迫代替她去往敵國(guó)和親纫谅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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