一、JVM的種類
-
Sun Classic VM
-
Exact VM(EMM 準確式)
-
HotSpot VM
-
JVM(Kilobyte)
-
JRockit
-
號稱世界上最快的JVM
-
JIT即時編譯
-
JVM處於世界一流水平
-
-
J9
-
Azui VM
-
Liquid VM
-
Dalvik VM
-
Microsoft VM
二、JVM的結構
-
類加載子系統
-
Java運行時數據區
-
執行引擎
-
本地方法接口
三、JVM運行時數據區
-
線程共享
-
方法區
-
堆
-
-
線程私有
-
虛擬機棧
-
本地方法棧
-
程序計數器
-
程序計數器(線程私有)
概念
一塊較小的內存空間,當前線程所執行的字節碼的行號指示器,包括分支、循環、跳轉、異常處理、線程恢復等
特點
1.線程輪流切換CPU時間片後重新回到指令處理位置,故是線程私有的
2.唯一一個在Java虛擬機中不會出現OutOfMemeryError的區域
注:因爲它只是當前線程執行的字節碼的行號指示器
3.若線程執行的是Java方法,計數器記錄的是正在執行的VM字節碼指令地址,若執行的是Native方法,則計數器爲空
4.與線程一起存在
虛擬機棧
先進後出
虛擬機棧:用戶描述Java方法執行的內存模型
- 調整參數:-Xss
棧幀:虛擬機棧中的棧元素(用於支持虛擬機進行方法調用和方法執行的數據結構)包括局部變量表、操作數棧、動態鏈接、方法出口
-
局部變量表:存放方法參數和方法內的局部變量
-
操作數棧:虛擬機的工作區(大多數指令都是從這裏彈出數據,執行運算,然後把結果壓會操作數棧)
-
動態連接:符號引用和直接引用在運行時進行解析和鏈接的過程,叫動態鏈接
-
方法返回:程序正常完成出口和異常完成出口
方法區(線程共享)[非堆-Non-Heap]
JDK1.8前後變化,JDK8取消了方法區,增加了元空間
1.主要存儲:
-
類信息
-
常量
-
靜態變量
-
即時編譯器編譯信息
2.數據過多會導致OutOfMemoryError異常
< JDK 1.8
- -XX:Permsize; -XX:MaxPermSize
>=JDK1.8
- -XX:MeteSpaceSize; -XX:MaxMateSpaceSize
和永久代的區別:
1.存儲位置不同,永久代物理上是堆的一部分,和新手代,老年代地址是連續的,而元空間屬於本地內存;
2.存儲內容不同,元空間存儲類的元信息,靜態變量和常量池等併入堆中;
3.相當於永久代的數據被分到了堆和元空間中
直接內存:避免native空間和java堆中來回進行復制
- 通過設置-XX:MaxDirectMemorySize限制大小
堆(線程共享)
虛擬機啓動時創建,用於存放對象實例,幾乎所有的對象(包含常量池)都在堆上分配內存,當對象無法再該空間申請到內存時將拋出OutOfMemoryError異常。同時也是垃圾收集器管理的主要區域。可通過 -Xmx –Xms 參數來分別指定最大堆和最小堆
GC主要管理區域,可以通過-Xmx和Xms來設置最大和最小值,也可以通過-XX:NewSize -XX:MaxNewSize設置年輕代初始大小
超出空間大小會拋出OutOfMemoryError異常
新生區
新生區分爲兩個部分:伊甸區(Eden space)和倖存者區(survivor space)
伊甸區(Eden space)
大部分對象都會在Eden區誕生,並且一段時間不使用就會被GC回收
倖存者區(survivor space)
存在一段時間還在使用的對象會進入survivor區,survivor區包含一個相對的From區和to區,兩者來回copy,回收沒用的對象,用來延長對象的生命週期。
老年區(old FullGC)
經過多次GC仍然存在的對象會移動到老年區中,若老年區也滿了,則會產生MajorGC(Full GC),對老年區進行內存清理(STW),若老年區執行了Full GC之後發現還是無法進行對象的報錯,那麼就會產生OOM異常”OutOfMemoryError“
虛擬機棧(線程私有)[VM Stack]
四、內存模型與回收策略
垃圾回收算法
1.標記-清除(Mark-Sweep)
問題:空間不連續,浪費空間
複製(copying)
複製算法有2塊一樣大小的空間,情況對象時將可用的對象移動到to區裏,複製算法內存空間連續
問題:要用2塊空間,所以內存的模型from和to非常的小
標記整理
只用一塊空間,先進行標記無用對象,然後整理內存空間地址,最後清除
五、垃圾收集器類型
串行蒐集器(serial collector)
它只有一條GC線程,且就像前面說的,它在運行的時候需要暫停用戶程序(stop the world)STW
並行蒐集器(parallel collector)
它有多條GC線程,且它也需要暫停用戶程序(stop the world)STW
併發蒐集器(concurrent collector)
它有一條或多條GC線程,且它需要在部分階段暫停用戶程序(stop the world),部分階段與用戶程序併發執行
六、HotSpot中的垃圾收集器
串行蒐集器的實現
serial(用於新生代,採用複製算法)、serial old(用於年老代,採用標記/整理算法)
並行收集器的實現
parNew(用於新生代,採用複製算法)、Parallel
Scavenge(用於新生代,採用複製算法)、Parallel
old(用於年老代,採用標記/整理算法)
併發蒐集器的實現
concurrent mark sweep[CMS] (用於年老代,採用標記/清除算法)