最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

JVM內(nèi)存模型

2023-04-11 15:01 作者:喜歡玩杰克的小瑜哥灬  | 我要投稿

一、JVM模型圖

JVM模型圖

?JVM內(nèi)存模型包括:程序計(jì)數(shù)器、本地方法棧、虛擬機(jī)堆(線程)、線程棧、方法區(qū)(元空間),其中程序計(jì)數(shù)器、線程棧、本地方法棧是每個(gè)線程所獨(dú)有的。

?1. 線程棧

? ? ? ? JVM的每一個(gè)線程對(duì)應(yīng)一個(gè)線程棧,一個(gè)線程的每個(gè)方法會(huì)分配一塊棧幀內(nèi)存空間。棧幀中包含:局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接和方法出口。

局部變量表:存儲(chǔ)基本數(shù)據(jù)類型(int、float、byte等),如果是引用數(shù)據(jù)類型,則存儲(chǔ)的是其在堆中的內(nèi)存地址,也就是指向?qū)ο蟮囊粋€(gè)指針。

操作數(shù)棧:操作數(shù)運(yùn)算時(shí)一塊臨時(shí)的空間來存放操作數(shù)。

動(dòng)態(tài)鏈接:將代碼的符號(hào)引用轉(zhuǎn)換為在方法區(qū)(運(yùn)行時(shí)常量池)中的直接引用。

方法出口:存儲(chǔ)了棧幀中的方法執(zhí)完之后回到上一層方法的位置。

?2. 本地方法棧

? ? ? ? 運(yùn)行本地方法的空間,也就是native本地方法運(yùn)行時(shí)的一塊空間。

3. 程序計(jì)數(shù)器

? ? ? ? 程序計(jì)數(shù)器是用于存放下一條指令所在單元的地址的地方。當(dāng)執(zhí)行一條指令時(shí),首先需要根據(jù)PC中存放的指令地址,將指令由內(nèi)存取到指令寄存器中,此過程稱為“取指令”。與此同時(shí),PC中的地址或自動(dòng)加1或由轉(zhuǎn)移指針給出下一條指令的地址。此后經(jīng)過分析指令,執(zhí)行指令。完成第一條指令的執(zhí)行,而后根據(jù)PC取出第二條指令的地址,如此循環(huán),執(zhí)行每一條指令。

4.? 方法區(qū)(元空間)

? ? ? ? 主要包括:常量、靜態(tài)變量、類信息、運(yùn)行時(shí)常量池,操作的是直接內(nèi)存。

5. 堆

? ? ? ? 堆是運(yùn)行時(shí)數(shù)據(jù)區(qū),所有類的實(shí)例和數(shù)組都是在堆上分配內(nèi)存。它在 JVM 啟動(dòng)的時(shí)候被創(chuàng)建。對(duì)象所占的堆內(nèi)存是由自動(dòng)內(nèi)存管理系統(tǒng)也就是垃圾收集器回收。

二、JVM中對(duì)象及常量、局部變量、全局變量的存儲(chǔ)位置

1. 局部變量

基本數(shù)據(jù)類型:變量名和變量值存儲(chǔ)在方法棧中。

引用數(shù)據(jù)類型:變量值存儲(chǔ)在方法棧中(存儲(chǔ)的是堆中對(duì)象的內(nèi)存地址),所指向的對(duì)象是存儲(chǔ)在堆內(nèi)存中(如new出來的對(duì)象)。

2. 全局變量

基本數(shù)據(jù)類型:變量名和變量值存儲(chǔ)在堆內(nèi)存中。

引用數(shù)據(jù)類型:變量名存儲(chǔ)的是所引用對(duì)象的內(nèi)存地址,變量名和變量值存儲(chǔ)在堆內(nèi)存中。

三、JVM內(nèi)存參數(shù)

? ? ? ? 默認(rèn)堆中年輕代(Young)占1/3,老年代(Old)占2/3,年輕代中包含Eden區(qū)和Survivor區(qū),Survivor區(qū)包含F(xiàn)rom(S0)區(qū)和To(區(qū)),默認(rèn)新生代中Eden區(qū)、From區(qū)、To區(qū)的比例為8:1:1,當(dāng)Eden區(qū)內(nèi)存不足時(shí)會(huì)觸發(fā)Minor gc,沒有被回收的對(duì)象進(jìn)入到Survivor區(qū),同時(shí)分代年齡+1,當(dāng)再次觸發(fā)Minor gc時(shí),F(xiàn)rom區(qū)中的對(duì)象會(huì)移動(dòng)到To區(qū),Minor gc會(huì)回收Eden區(qū)和From區(qū)中的垃圾對(duì)象,對(duì)象的分代年齡會(huì)一次次的增加,當(dāng)分代年齡增加到15以后,對(duì)象會(huì)進(jìn)入到老年代。

? ? ? ? 當(dāng)老年代內(nèi)存不足時(shí),會(huì)觸發(fā)Full gc,如果Full gc無(wú)法釋放足夠的空間,會(huì)觸發(fā)OOM內(nèi)存溢出,在進(jìn)行Minor gc或Full gc時(shí),會(huì)觸發(fā)STW(Stop The World),即停止用戶線程。

內(nèi)存模型圖

Spring Boot程序的JVM參數(shù)設(shè)置格式(Tomcat啟動(dòng)直接加在bin目錄下catalina.sh文件里):

java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar

-Xss:每個(gè)線程的棧大小

-Xms:設(shè)置堆的初始可用大小,默認(rèn)物理內(nèi)存的1/64

-Xmx:設(shè)置堆的最大可用大小,默認(rèn)物理內(nèi)存的1/4

-Xmn:新生代大小

-XX:NewRatio:默認(rèn)2表示新生代占年老代的1/2,占整個(gè)堆內(nèi)存的1/3。

-XX:SurvivorRatio:默認(rèn)8表示一個(gè)survivor區(qū)占用1/8的Eden內(nèi)存,即1/10的新生代內(nèi)存。

關(guān)于元空間的JVM參數(shù)有兩個(gè):-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N

-XX:MaxMetaspaceSize: 元空間最大值, 默認(rèn)-1, 即不限制,或者說只受限于本地內(nèi)存大小。

-XX:MetaspaceSize: 指定元空間觸發(fā)Fullgc的初始閾值(元空間無(wú)固定初始大小), 以字節(jié)為單位,默認(rèn)是21M左右,達(dá)到該值就會(huì)觸發(fā)full gc進(jìn)行類型卸載, 同時(shí)收集器會(huì)對(duì)該值進(jìn)行調(diào)整: 如果釋放了大量的空間, 就適當(dāng)降低該值; 如果釋放了很少的空間,會(huì)適當(dāng)提高該值( 如果設(shè)置了-XX:MaxMetaspaceSize,不會(huì)超過其最大值 )。這個(gè)跟早期jdk版本的-XX:PermSize參數(shù)意思不一樣,-XX:PermSize代表永久代的初始容量。

???? 由于調(diào)整元空間的大小需要Full GC,這是非常昂貴的操作,如果應(yīng)用在啟動(dòng)的時(shí)候發(fā)生大量Full GC,通常都是由于永久代或元空間發(fā)生了大小調(diào)整,基于這種情況,一般建議在JVM參數(shù)中將MetaspaceSize和MaxMetaspaceSize設(shè)置成一樣的值,并設(shè)置得比初始值要大,對(duì)于8G物理內(nèi)存的機(jī)器來說,這兩個(gè)值可以都設(shè)置為256M。


JVM內(nèi)存模型的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
沂水县| 九江县| 民丰县| 隆子县| 灵宝市| 巴马| 沾益县| 丽水市| 文安县| 启东市| 肇源县| 阳城县| 北辰区| 徐汇区| 婺源县| 龙川县| 南丰县| 隆德县| 突泉县| 稻城县| 高台县| 万宁市| 石楼县| 夏津县| 商洛市| 麻栗坡县| 山西省| 龙泉市| 临汾市| 微博| 额敏县| 武清区| 长治县| 西青区| 金昌市| 兴山县| 甘谷县| 嘉兴市| 乌苏市| 蓬溪县| 定结县|