[Java] JVM

1 內(nèi)存管理

1.1 方法區(qū)(Method Area)

  • 存放

    • 類的信息(類名/修飾符/類中字段和方法等)
    • 靜態(tài)變量
    • 構(gòu)造函數(shù)
    • final常量
  • GC

    對(duì)應(yīng)持久代(Permanent Generation)。方法區(qū)是全局共享的,在一定條件下也會(huì)被GC。當(dāng)方法區(qū)超過(guò)它允許的大小時(shí),就會(huì)拋出OutOfMemory:PermGen Space異常。

1.2 堆區(qū)(Heap)

  • 存放

    • 對(duì)象實(shí)例
    • 數(shù)組
    • 所有new出來(lái)的對(duì)象
  • GC

    GC最頻繁的區(qū)域

1.3 虛擬機(jī)棧(VM Stack)

  • 存放

    每個(gè)方法被執(zhí)行時(shí)產(chǎn)生的一個(gè)棧幀(Statck Frame)

  • GC 不需要進(jìn)行垃圾回收

  • 異常

    • 線程調(diào)用的棧深度大于虛擬機(jī)允許的最大深度,則拋出StackOverFlowError
    • 內(nèi)存不足時(shí),拋出OutOfMemoryError

1.4 本地方法棧(Native Method Stack)

本地方法棧用于支持native方法的執(zhí)行,存儲(chǔ)了每個(gè)native方法的執(zhí)行狀態(tài)。本地方法棧和虛擬機(jī)棧他們的運(yùn)行機(jī)制一致,唯一的區(qū)別是,虛擬機(jī)棧執(zhí)行Java方法,本地方法棧執(zhí)行native方法。

  • GC 不需要進(jìn)行垃圾回收

1.5 程序計(jì)數(shù)器(Program Counter Register)

  • GC 不需要進(jìn)行垃圾回收

2 垃圾回收GC

2.1 四種引用類型

  • 強(qiáng)引用 - 存在引用則不會(huì)被回收
  • 軟引用 - 內(nèi)存不足時(shí)會(huì)被回收
  • 弱引用 - 每次GC時(shí)會(huì)被回收
  • 虛引用 - 忽略不計(jì)

2.2 分區(qū)

  • 新生代(Youn Generation):大致分為Eden區(qū)和Survivor區(qū),Survivor區(qū)又分為大小相同的兩部分:FromSpace和ToSpace。新建的對(duì)象都是從新生代分配內(nèi)存,Eden區(qū)不足的時(shí)候,會(huì)把存活的對(duì)象轉(zhuǎn)移到Survivor區(qū)。當(dāng)新生代進(jìn)行垃圾回收時(shí)會(huì)出發(fā)Minor GC(也稱作Youn GC)。

  • 舊生代(Old Generation):舊生代用于存放新生代多次回收依然存活的對(duì)象,如緩存對(duì)象。當(dāng)舊生代滿了的時(shí)候就需要對(duì)舊生代進(jìn)行回收,舊生代的垃圾回收稱作Major GC(也稱作Full GC)。

  • 持久代(Permanent Generation):在Sun 的JVM中就是方法區(qū)的意思,盡管大多數(shù)JVM沒(méi)有這一代。

2.3 GC算法

  • 復(fù)制(新生代)

    將存活對(duì)象移動(dòng)到一塊空閑區(qū)域中,需要額外的空間

  • 標(biāo)記-清除

    掃描標(biāo)記存活對(duì)象,再掃描未被標(biāo)記的對(duì)象進(jìn)行清除,會(huì)造成內(nèi)存碎片

  • 標(biāo)記-壓縮(舊生代)

    掃描標(biāo)記存活對(duì)象,再掃描未被標(biāo)記的對(duì)象進(jìn)行清除,清除后將存活對(duì)象向左端空閑空間移動(dòng),增加了移動(dòng)成本

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JVM架構(gòu) 當(dāng)一個(gè)程序啟動(dòng)之前,它的class會(huì)被類裝載器裝入方法區(qū)(Permanent區(qū)),執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,834評(píng)論 0 7
  • 一、概述: 本文作為大數(shù)據(jù)基礎(chǔ)的Java部分,上一篇說(shuō)明了Linux的常用命令,今天學(xué)習(xí)了Java的高級(jí)特性,我們...
    慕久久閱讀 786評(píng)論 1 5
  • 原文閱讀 前言 這段時(shí)間懈怠了,罪過(guò)! 最近看到有同事也開(kāi)始用上了微信公眾號(hào)寫(xiě)博客了,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 6,150評(píng)論 2 31
  • 1. 內(nèi)存模型以及分區(qū),需要詳細(xì)到每個(gè)區(qū)放什么 程序計(jì)數(shù)器(Program Counter Register) 是...
    猿圈哲學(xué)家閱讀 354評(píng)論 0 1
  • 我是一個(gè)愿意活的簡(jiǎn)簡(jiǎn)單單的人,現(xiàn)實(shí)社會(huì)中群聚的人類,可是形形色色的,慢慢的會(huì)讓你改變?yōu)槿颂幨碌某踔?。不管我是?..
    可清秋水閱讀 279評(píng)論 0 1

友情鏈接更多精彩內(nèi)容