JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)
線(xiàn)程共享
JAVA堆
- 首先如果不指定堆的大小灶挟,取決于電腦內(nèi)存琉朽,可使用
jmap -heap pid
來(lái)確認(rèn)。默認(rèn)大小為內(nèi)存的四分之一稚铣。 -
-Xms
堆的初始大小箱叁,-Xmx
堆的最大值,-Xmn
新生代的大小惕医。堆分為新生代和老年代兩塊內(nèi)存耕漱,默認(rèn)新生代和老年代占比為1:2。 -
幾乎
所有的對(duì)象都在堆上分配內(nèi)存抬伺,但不是絕對(duì)螟够,特殊情況下對(duì)象可以在棧上分配的。 - 如果堆上沒(méi)有內(nèi)存給新生對(duì)象分配了,并且又沒(méi)有垃圾回收空出內(nèi)存妓笙,就會(huì)發(fā)生OOM內(nèi)存溢出若河。
方法區(qū)
- 用于存儲(chǔ)運(yùn)行時(shí)常量池、已被虛擬機(jī)加載的類(lèi)信息寞宫、常量萧福、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)辈赋。
- 當(dāng)方法區(qū)無(wú)法滿(mǎn)足內(nèi)存分配需求時(shí)鲫忍,將拋出OOM異常。
線(xiàn)程獨(dú)享
虛擬機(jī)棧
- 一個(gè)線(xiàn)程有一個(gè)自己的棧炭庙。默認(rèn)棧的大小為1M饲窿,可以通過(guò)
-Xss
來(lái)設(shè)置棧的大小。 - 線(xiàn)程走過(guò)的每個(gè)方法焕蹄,都符合FILO逾雄,每個(gè)方法都叫一個(gè)方法棧幀,每個(gè)棧幀都會(huì)包含:局部變量表腻脏、操作數(shù)棧鸦泳、動(dòng)態(tài)鏈接、返回地址永品。
- 如果線(xiàn)程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度做鹰,將拋出StackOverflowError異常。
本地方法棧
- 為JVM所調(diào)用到的Nativa方法鼎姐,即本地方法服務(wù)钾麸。
程序計(jì)數(shù)器
- JVM的多線(xiàn)程是通過(guò)線(xiàn)程輪流切換并分配處理器來(lái)實(shí)現(xiàn)的,看起來(lái)的并行炕桨,事實(shí)上是一個(gè)處理器也只會(huì)執(zhí)行一條線(xiàn)程中的指令饭尝。所以,為了保證各線(xiàn)程指令的安全順利執(zhí)行献宫,每條線(xiàn)程都有獨(dú)立的私有的程序計(jì)數(shù)器钥平,為的就是能記錄每個(gè)線(xiàn)程具體執(zhí)行到代碼哪一行了,方便下次繼續(xù)執(zhí)行姊途。
- 此內(nèi)存區(qū)域是唯一一個(gè)在JVM上不會(huì)發(fā)生OOM的區(qū)域涉瘾。