Java 虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域包括程序計(jì)數(shù)器吭净、虛擬機(jī)棧、本地方法棧肴甸、堆寂殉、方法區(qū)等
程序計(jì)數(shù)器
當(dāng)前線程執(zhí)行的虛擬機(jī)字節(jié)碼的行號(hào)指示器,字節(jié)碼解釋器通過(guò)改變計(jì)數(shù)器的值來(lái)選取下一條要執(zhí)行的字節(jié)碼指令地址
虛擬機(jī)棧
java方法執(zhí)行的內(nèi)存模型原在,虛擬機(jī)棧就是有棧幀的容器友扰,每一個(gè)方法調(diào)用就是棧幀在vm stack 進(jìn)出的過(guò)程
棧幀
每個(gè)方法執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀彤叉,其內(nèi)部包含:
- 局部變量表:存放方法參數(shù)和方法內(nèi)定義的局部變量,以索引方式引用村怪,存儲(chǔ)單元稱為slot
- 操作數(shù)棧:后人先出秽浇,字節(jié)碼指令往操作數(shù)棧值寫入提取內(nèi)容
- 動(dòng)態(tài)鏈接:對(duì)應(yīng)的是即時(shí)編譯后Class文件存儲(chǔ)的方法體引用地址
- 方法返回地址:正常退出通俗講就是返回方法調(diào)用處,當(dāng)前棧幀出棧实愚,班返回值壓入調(diào)用者的操作數(shù)棧兼呵,調(diào)用程序計(jì)數(shù)器執(zhí)行下一指令;異常退出:本方法異常表沒(méi)有搜索到匹配的異常處理器(沒(méi)有try catch異常)
方法區(qū)(非堆腊敲、永久代 Permanent Generation)
線程共享的內(nèi)存區(qū)域击喂,存儲(chǔ)虛擬機(jī)加載的類信息、常量碰辅、靜態(tài)變量懂昂、是各個(gè)線程共享的內(nèi)存區(qū)域。默認(rèn)最小值為16MB没宾,最大值為64MB凌彬,可以通過(guò)
-XX:PermSize
和-XX:MaxPermSize
參數(shù)調(diào)整運(yùn)行時(shí)常量池
方法區(qū)的一部分,Class文件中除了有類的版本循衰、字段铲敛、方法、接口等描述信息外会钝,還有一項(xiàng)信息是常量池伐蒋,用于存放編譯器生成的各種符號(hào)引用,這部分內(nèi)容將在類加載后放到方法區(qū)的運(yùn)行時(shí)常量池中
堆 heap
也稱Java 堆迁酸、GC堆是java虛擬機(jī)所管理的內(nèi)存中最大的一塊內(nèi)存區(qū)域先鱼,是線程共享的內(nèi)存區(qū)域,在JVM啟動(dòng)時(shí)創(chuàng)建奸鬓,存放對(duì)象實(shí)例及數(shù)組焙畔。通過(guò)
-Xms512m
和-Xmx512m
調(diào)整jvm運(yùn)行內(nèi)存大小,默認(rèn)設(shè)置為一致
命令 | 閾值 | 描述 |
---|---|---|
-Xms512m | 物理內(nèi)存的1/64但小于1G串远,一理論為服務(wù)器內(nèi)存的1/2-3/4之間 | JVM啟動(dòng)時(shí)申請(qǐng)的最小內(nèi)存 |
-Xmx512m | 同Xms一致 | JVM啟動(dòng)時(shí)申請(qǐng)的最大內(nèi)存 |
-XX:MinHeapFreeRatio=40 | 小于閾值增大到Xmx | 默認(rèn)40% |
-XX:MaxHeapFreeRation=70 | 大于閾值減小到Xms | 默認(rèn)70% |
下圖是根據(jù)理解所畫
有疑問(wèn)不妥之處請(qǐng)留言討論