內(nèi)存組成部分
根據(jù) JVM
規(guī)范,JVM
內(nèi)存共分為虛擬機(jī)棧统捶、堆榆芦、方法區(qū)、程序計(jì)數(shù)器喘鸟、本地方法棧五個(gè)部分匆绣。
虛擬機(jī)棧
每個(gè)線程都有一私有棧,隨著線程的創(chuàng)建而創(chuàng)建什黑。棧里面會(huì)存放著“棧幀”崎淳,每個(gè)方法創(chuàng)建一個(gè)棧幀。
棧幀的組成部分:
一兑凿、局部變量:存放基本的數(shù)據(jù)類型(byte
凯力,char
,int
礼华,double
,float
,boolean
,long
,short
)和對(duì)象地址引用(一個(gè)指針指向?qū)ο蠡蛘咭粭l指令)。局部變量區(qū)被定義一個(gè)從0開始的數(shù)字?jǐn)?shù)組拗秘,byte
圣絮、Char
、short
雕旨,boolean
轉(zhuǎn)換成int
扮匠,long
,double
, 2
個(gè)字節(jié)捧请。其中64
位長(zhǎng)度的long
和double
類型的數(shù)據(jù)會(huì)占用2
個(gè)局部變量空間(Slot
),其余的數(shù)據(jù)類型只占用1個(gè)棒搜。局部變量通過數(shù)組的下標(biāo)訪問疹蛉。
備注:局部變量表中的Slot
是可重用的,方法體中定義的變量力麸,其作用域并不一定會(huì)覆蓋整個(gè)方法可款,如果當(dāng)前字節(jié)碼PC計(jì)算器的值已經(jīng)超出了某個(gè)變量的作用域,那么這個(gè)變量對(duì)應(yīng)的Slot
就可以交給其它變量使用克蚂。
二闺鲸、操作數(shù)棧:數(shù)組,先進(jìn)后出埃叭,push
和pop
操作摸恍。
三、幀數(shù)據(jù)區(qū):
1赤屋、解析常量池的數(shù)據(jù)
2立镶、方法執(zhí)行完后處理方法返回,恢復(fù)調(diào)用方現(xiàn)場(chǎng)
3类早、方法執(zhí)行過程中拋出異常時(shí)異常的處理媚媒,當(dāng)出現(xiàn)異常時(shí)虛擬機(jī)查找相應(yīng)的異常表看是否有對(duì)應(yīng)的catch
語句,如果沒有就拋出異常終止這個(gè)方法調(diào)用莺奔。
如果棧內(nèi)存不夠?qū)?huì)拋出StackOverflowError
錯(cuò)誤欣范。catch
捕獲的是 Throwable
類。
調(diào)整棧內(nèi)存大小參數(shù)-Xss
:每個(gè)線程的stack大辛钣础(棧)
虛擬機(jī)堆
堆內(nèi)存是 JVM
所有線程共享的部分恼琼,在虛擬機(jī)啟動(dòng)的時(shí)候就已經(jīng)創(chuàng)建。所有的對(duì)象和數(shù)組都在堆上進(jìn)行分配屏富。這部分空間可通過 GC
進(jìn)行回收晴竞。
當(dāng)申請(qǐng)不到空間時(shí)會(huì)拋出 OutOfMemoryError
。catch
捕獲的是 Throwable
狠半。
調(diào)整堆參數(shù)大小參數(shù):
Xmx
:Java Heap
的最大值噩死、默認(rèn)為物理內(nèi)存的1/4
Xms
:Java Heap
的初始值,server端最好Xms與Xmx一樣
Xmn
:Java Heap
young區(qū)的大小
XX:MetaspaceSize
元數(shù)據(jù)初始大小
XX:MaxMetaspaceSize
元數(shù)據(jù)內(nèi)存最大值
在JDK1.8
中神年,取消了PermGen
已维,取而代之的是Metaspace
。
元數(shù)據(jù)空間并不在虛擬機(jī)中已日,而是使用本地內(nèi)存垛耳。
方法區(qū)
方法區(qū)也是所有線程共享。主要用于存儲(chǔ)類的信息、常量池堂鲜、方法數(shù)據(jù)栈雳、方法代碼等。方法區(qū)邏輯上屬于堆的一部分缔莲,但是為了與堆進(jìn)行區(qū)分哥纫,通常又叫“非堆”。
本地方法區(qū)
這部分主要與虛擬機(jī)用到的 Native
方法相關(guān)痴奏,一般情況下蛀骇, Java
應(yīng)用程序員并不需要關(guān)心這部分的內(nèi)容。
程序計(jì)數(shù)器
JVM
支持多個(gè)線程同時(shí)運(yùn)行抛虫,每個(gè)線程都有自己的程序計(jì)數(shù)器松靡。倘若當(dāng)前執(zhí)行的是 JVM
的方法,則該寄存器中保存當(dāng)前執(zhí)行指令的地址建椰;倘若執(zhí)行的是Native
方法雕欺,則程序計(jì)數(shù)器中為空。