JVM內(nèi)存管理


JVM 內(nèi)存區(qū)域劃分如圖所示耿戚,從圖中我們可以看出:

  • JVM 堆中的數(shù)據(jù)是共享的湿故,是占用內(nèi)存最大的一塊區(qū)域阿趁。
  • 可以執(zhí)行字節(jié)碼的模塊叫作執(zhí)行引擎。
  • 執(zhí)行引擎在線程切換時(shí)怎么恢復(fù)坛猪?依靠的就是程序計(jì)數(shù)器脖阵。
  • JVM 的內(nèi)存劃分與多線程是息息相關(guān)的。像我們程序中運(yùn)行時(shí)用到的棧墅茉,以及本地方法棧命黔,它們的維度都是線程。
虛擬機(jī)棧:
  • Java 虛擬機(jī)棧是基于線程的就斤。哪怕你只有一個(gè) main() 方法悍募,也是以線程的方式運(yùn)行的。在線程的生命周期中洋机,參與計(jì)算的數(shù)據(jù)會(huì)頻繁地入棧和出棧坠宴,棧的生命周期是和線程一樣的。棧里的每條數(shù)據(jù)绷旗,就是棧幀喜鼓。在每個(gè) Java 方法被調(diào)用的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀衔肢,并入棧庄岖。可以理解為每個(gè)方法開(kāi)辟一個(gè)獨(dú)立的棧幀角骤,這個(gè)棧幀里的局部變量不受其他棧幀的影響隅忿。這條線程開(kāi)辟的虛擬機(jī)棧內(nèi)存大小是所有的棧幀開(kāi)辟的大小總和。
程序計(jì)數(shù)器
  • 程序計(jì)數(shù)器是一塊較小的內(nèi)存空間启搂,它的作用可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器硼控。這里面存的,就是當(dāng)前線程執(zhí)行的進(jìn)度胳赌。在多線程任務(wù)中牢撼,cup在線程之間進(jìn)行切換需要記錄線程執(zhí)行到哪了,等到線程重新分配到cpu時(shí)才能在上次執(zhí)行的地方繼續(xù)執(zhí)行下去疑苫。
  • JVM 上最大的內(nèi)存區(qū)域熏版,我們申請(qǐng)的幾乎所有的對(duì)象,都是在這里存儲(chǔ)的捍掺。我們常說(shuō)的垃圾回收撼短,操作的對(duì)象就是堆。jvm堆空間大小可以指定挺勿,在啟動(dòng)時(shí)就會(huì)從系統(tǒng)內(nèi)存中分配曲横,分配的堆內(nèi)存不一定全部會(huì)被用到。就好像一個(gè)公司包了電影院的三排座位,但是實(shí)際公司去了多少人不一定禾嫉,但是這三排位置是預(yù)留給公司的人的灾杰,不是公司的人不能夠使用。隨著對(duì)象的頻繁創(chuàng)建熙参,堆空間占用的越來(lái)越多艳吠,就需要不定期的對(duì)不再使用的對(duì)象進(jìn)行回收。這個(gè)在 Java 中孽椰,就叫作 GC(Garbage Collection)昭娩。對(duì)象在堆中被創(chuàng)建的時(shí)候大小是固定的,這里涉及到位置分配的問(wèn)題黍匾,我們?cè)儆秒娪霸簣?chǎng)景模擬栏渺。計(jì)算機(jī)只能識(shí)別0和1,數(shù)據(jù)在內(nèi)存中實(shí)際上是一連串的0和1锐涯,一個(gè)對(duì)象時(shí)一連串的0和1迈嘹,當(dāng)對(duì)象比較大的時(shí)候,這串?dāng)?shù)字就比較長(zhǎng)全庸,保存在內(nèi)存中占的位置也就比較長(zhǎng)秀仲,好比我們?nèi)齻€(gè)人去電影院看電影。作為電影院分配位置的方案壶笼,比較好的就是三個(gè)人坐一塊神僵,按順序坐(1,2覆劈,3號(hào)位置)保礼。新來(lái)的人繼續(xù)往后面,如果來(lái)兩個(gè)就分配(4责语,5號(hào))位置炮障,如果來(lái)三個(gè)就分配(4,5坤候,6號(hào))位置胁赢,把整個(gè)電影院劃分為兩個(gè)區(qū)域(已使用區(qū)域和未使用區(qū)域),不管已使用區(qū)域的人是否離開(kāi)白筹,新來(lái)的人安排去未使用區(qū)域智末,這種方案好處時(shí)管理方便,安排入座快徒河,壞處就是如果有人中途離開(kāi)系馆,那對(duì)應(yīng)的位置就空了下來(lái)不能利用,浪費(fèi)了空間顽照,對(duì)應(yīng)內(nèi)存中的內(nèi)存碎片由蘑。
元空間
  • 在 Java 8 之前,類的信息是放在一個(gè)叫 Perm (永久代)區(qū)的內(nèi)存里面的。更早版本(java7之前)尼酿,甚至 String.intern 相關(guān)的運(yùn)行時(shí)常量池也放在這里下隧。這個(gè)區(qū)域有大小限制,很容易造成 JVM 內(nèi)存溢出谓媒,從而造成 JVM 崩潰。Perm 區(qū)在 Java 8 中已經(jīng)被徹底廢除何乎,取而代之的是 Metaspace句惯。原來(lái)的 Perm 區(qū)是在堆上的,現(xiàn)在的元空間是在非堆上的支救,這是背景抢野。
    元空間的好處也是它的壞處。使用非堆可以使用操作系統(tǒng)的內(nèi)存各墨,JVM 不會(huì)再出現(xiàn)方法區(qū)的內(nèi)存溢出指孤;但是,無(wú)限制的使用會(huì)造成操作系統(tǒng)的死亡贬堵。所以恃轩,一般也會(huì)使用參數(shù) -XX:MaxMetaspaceSize 來(lái)控制大小。
    方法區(qū)黎做,作為一個(gè)概念叉跛,依然存在。它的物理存儲(chǔ)的容器蒸殿,就是 Metaspace筷厘。我們將在后面的課時(shí)中,再次遇到它『晁現(xiàn)在酥艳,你只需要了解到,這個(gè)區(qū)域存儲(chǔ)的內(nèi)容爬骤,包括:類的信息充石、常量池、方法數(shù)據(jù)霞玄、方法代碼就可以了赫冬。
本地方法棧
  • 本地方法棧(Native Method Stacks)與 Java 虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行 Java 方法(也就是字節(jié)碼)服務(wù)溃列,而本地方法棧則是為虛擬機(jī)使用到的 Native 方法服務(wù)劲厌。虛擬機(jī)規(guī)范中對(duì)本地方法棧中的方法使用的語(yǔ)言、使用方式與數(shù)據(jù)結(jié)構(gòu)并沒(méi)有強(qiáng)制規(guī)定听隐,因此具體的虛擬機(jī)可以自由實(shí)現(xiàn)它补鼻。
    -Navtive 方法是 Java 通過(guò) JNI 直接調(diào)用本地 C/C++ 庫(kù),可以認(rèn)為是 Native 方法相當(dāng)于 C/C++ 暴露給 Java 的一個(gè)接口,Java 通過(guò)調(diào)用這個(gè)接口從而調(diào)用到 C/C++ 方法风范。當(dāng)線程調(diào)用 Java 方法時(shí)咨跌,虛擬機(jī)會(huì)創(chuàng)建一個(gè)棧幀并壓入 Java 虛擬機(jī)棧。然而當(dāng)它調(diào)用的是 native 方法時(shí)硼婿,虛擬機(jī)會(huì)保持 Java 虛擬機(jī)棧不變锌半,也不會(huì)向 Java 虛擬機(jī)棧中壓入新的棧幀,虛擬機(jī)只是簡(jiǎn)單地動(dòng)態(tài)連接并直接調(diào)用指定的 native 方法寇漫。

    參考資料:1.《深入淺出 Java 虛擬機(jī)》
    2.http://www.reibang.com/p/8a775d747c47
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刊殉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子州胳,更是在濱河造成了極大的恐慌记焊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓撞,死亡現(xiàn)場(chǎng)離奇詭異遍膜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瓤湘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瓢颅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弛说,你說(shuō)我怎么就攤上這事惜索。” “怎么了剃浇?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵巾兆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我虎囚,道長(zhǎng)角塑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任淘讥,我火速辦了婚禮圃伶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒲列。我一直安慰自己窒朋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蝗岖。 她就那樣靜靜地躺著侥猩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抵赢。 梳的紋絲不亂的頭發(fā)上欺劳,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天唧取,我揣著相機(jī)與錄音,去河邊找鬼划提。 笑死枫弟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹏往。 我是一名探鬼主播淡诗,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伊履!你這毒婦竟也來(lái)了韩容?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤湾碎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奠货,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體介褥,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年递惋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柔滔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萍虽,死狀恐怖睛廊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杉编,我是刑警寧澤超全,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布捷凄,位于F島的核電站靖苇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仲墨。R本人自食惡果不足惜光酣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一疏遏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧救军,春花似錦财异、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拷泽,卻和暖如春庆揩,著一層夾襖步出監(jiān)牢的瞬間俐东,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工订晌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虏辫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓锈拨,卻偏偏與公主長(zhǎng)得像砌庄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奕枢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355