一、JVM的種類
Sun Classic VM
Exact VM(EMM 準(zhǔn)確式)
HotSpot VM
JVM(Kilobyte)
-
JRockit
號(hào)稱世界上最快的JVM
JIT即時(shí)編譯
JVM處于世界一流水平
J9
Azui VM
Liquid VM
Dalvik VM
Microsoft VM
二、JVM的結(jié)構(gòu)
類加載子系統(tǒng)
Java運(yùn)行時(shí)數(shù)據(jù)區(qū)
執(zhí)行引擎
本地方法接口
三、JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)
-
線程共享
方法區(qū)
堆
-
線程私有
虛擬機(jī)棧
本地方法棧
程序計(jì)數(shù)器
程序計(jì)數(shù)器(線程私有)
概念
一塊較小的內(nèi)存空間芙委,當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,包括分支萧福、循環(huán)伊群、跳轉(zhuǎn)洛口、異常處理稚照、線程恢復(fù)等
特點(diǎn)
1.線程輪流切換CPU時(shí)間片后重新回到指令處理位置逞壁,故是線程私有的
2.唯一一個(gè)在Java虛擬機(jī)中不會(huì)出現(xiàn)OutOfMemeryError的區(qū)域
注:因?yàn)樗皇钱?dāng)前線程執(zhí)行的字節(jié)碼的行號(hào)指示器
3.若線程執(zhí)行的是Java方法,計(jì)數(shù)器記錄的是正在執(zhí)行的VM字節(jié)碼指令地址锐锣,若執(zhí)行的是Native方法,則計(jì)數(shù)器為空
4.與線程一起存在
虛擬機(jī)棧
先進(jìn)后出
虛擬機(jī)棧:用戶描述Java方法執(zhí)行的內(nèi)存模型
- 調(diào)整參數(shù):-Xss<size>
棧幀:虛擬機(jī)棧中的棧元素(用于支持虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu))包括局部變量表绳瘟、操作數(shù)棧雕憔、動(dòng)態(tài)鏈接、方法出口
局部變量表:存放方法參數(shù)和方法內(nèi)的局部變量
操作數(shù)棧:虛擬機(jī)的工作區(qū)(大多數(shù)指令都是從這里彈出數(shù)據(jù)糖声,執(zhí)行運(yùn)算斤彼,然后把結(jié)果壓會(huì)操作數(shù)棧)
動(dòng)態(tài)連接:符號(hào)引用和直接引用在運(yùn)行時(shí)進(jìn)行解析和鏈接的過程,叫動(dòng)態(tài)鏈接
方法返回:程序正常完成出口和異常完成出口
方法區(qū)(線程共享)[非堆-Non-Heap]
JDK1.8前后變化蘸泻,JDK8取消了方法區(qū)琉苇,增加了元空間
1.主要存儲(chǔ):
類信息
常量
靜態(tài)變量
即時(shí)編譯器編譯信息
2.數(shù)據(jù)過多會(huì)導(dǎo)致OutOfMemoryError異常
< JDK 1.8
- -XX:Permsize; -XX:MaxPermSize
>=JDK1.8
- -XX:MeteSpaceSize; -XX:MaxMateSpaceSize
和永久代的區(qū)別:
1.存儲(chǔ)位置不同,永久代物理上是堆的一部分悦施,和新手代并扇,老年代地址是連續(xù)的,而元空間屬于本地內(nèi)存抡诞;
2.存儲(chǔ)內(nèi)容不同穷蛹,元空間存儲(chǔ)類的元信息,靜態(tài)變量和常量池等并入堆中;
3.相當(dāng)于永久代的數(shù)據(jù)被分到了堆和元空間中
直接內(nèi)存:避免native空間和java堆中來回進(jìn)行復(fù)制
- 通過設(shè)置-XX:MaxDirectMemorySize限制大小
堆(線程共享)
虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建昼汗,用于存放對(duì)象實(shí)例肴熏,幾乎所有的對(duì)象(包含常量池)都在堆上分配內(nèi)存,當(dāng)對(duì)象無法再該空間申請(qǐng)到內(nèi)存時(shí)將拋出OutOfMemoryError異常顷窒。同時(shí)也是垃圾收集器管理的主要區(qū)域蛙吏。可通過 -Xmx –Xms 參數(shù)來分別指定最大堆和最小堆
GC主要管理區(qū)域,可以通過-Xmx和Xms來設(shè)置最大和最小值鸦做,也可以通過-XX:NewSize -XX:MaxNewSize設(shè)置年輕代初始大小
超出空間大小會(huì)拋出OutOfMemoryError異常
新生區(qū)
新生區(qū)分為兩個(gè)部分:伊甸區(qū)(Eden space)和幸存者區(qū)(survivor space)
伊甸區(qū)(Eden space)
大部分對(duì)象都會(huì)在Eden區(qū)誕生励烦,并且一段時(shí)間不使用就會(huì)被GC回收
幸存者區(qū)(survivor space)
存在一段時(shí)間還在使用的對(duì)象會(huì)進(jìn)入survivor區(qū),survivor區(qū)包含一個(gè)相對(duì)的From區(qū)和to區(qū)馁龟,兩者來回copy崩侠,回收沒用的對(duì)象,用來延長(zhǎng)對(duì)象的生命周期坷檩。
老年區(qū)(old FullGC)
經(jīng)過多次GC仍然存在的對(duì)象會(huì)移動(dòng)到老年區(qū)中却音,若老年區(qū)也滿了,則會(huì)產(chǎn)生MajorGC(Full GC)矢炼,對(duì)老年區(qū)進(jìn)行內(nèi)存清理(STW)系瓢,若老年區(qū)執(zhí)行了Full GC之后發(fā)現(xiàn)還是無法進(jìn)行對(duì)象的報(bào)錯(cuò),那么就會(huì)產(chǎn)生OOM異尘涔啵”O(jiān)utOfMemoryError“
虛擬機(jī)棧(線程私有)[VM Stack]
四夷陋、內(nèi)存模型與回收策略
垃圾回收算法
1.標(biāo)記-清除(Mark-Sweep)
問題:空間不連續(xù),浪費(fèi)空間
復(fù)制(copying)
復(fù)制算法有2塊一樣大小的空間胰锌,情況對(duì)象時(shí)將可用的對(duì)象移動(dòng)到to區(qū)里骗绕,復(fù)制算法內(nèi)存空間連續(xù)
問題:要用2塊空間,所以內(nèi)存的模型from和to非常的小
標(biāo)記整理
只用一塊空間资昧,先進(jìn)行標(biāo)記無用對(duì)象酬土,然后整理內(nèi)存空間地址,最后清除
五格带、垃圾收集器類型
串行搜集器(serial collector)
它只有一條GC線程撤缴,且就像前面說的,它在運(yùn)行的時(shí)候需要暫停用戶程序(stop the world)STW
并行搜集器(parallel collector)
它有多條GC線程叽唱,且它也需要暫停用戶程序(stop the world)STW
并發(fā)搜集器(concurrent collector)
它有一條或多條GC線程屈呕,且它需要在部分階段暫停用戶程序(stop the world),部分階段與用戶程序并發(fā)執(zhí)行
六棺亭、HotSpot中的垃圾收集器
串行搜集器的實(shí)現(xiàn)
serial(用于新生代虎眨,采用復(fù)制算法)、serial old(用于年老代侦铜,采用標(biāo)記/整理算法)
并行收集器的實(shí)現(xiàn)
parNew(用于新生代专甩,采用復(fù)制算法)、Parallel
Scavenge(用于新生代钉稍,采用復(fù)制算法)涤躲、Parallel
old(用于年老代,采用標(biāo)記/整理算法)
并發(fā)搜集器的實(shí)現(xiàn)
concurrent mark sweep[CMS] (用于年老代贡未,采用標(biāo)記/清除算法)