JVM基礎和內存區域剖析

一、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運行時數據區

  • 線程共享

    • 方法區

  • 線程私有

    • 虛擬機棧

    • 本地方法棧

    • 程序計數器

image-20200702025222874.png

程序計數器(線程私有)

概念

一塊較小的內存空間,當前線程所執行的字節碼的行號指示器,包括分支、循環、跳轉、異常處理、線程恢復等

特點

1.線程輪流切換CPU時間片後重新回到指令處理位置,故是線程私有的

2.唯一一個在Java虛擬機中不會出現OutOfMemeryError的區域

注:因爲它只是當前線程執行的字節碼的行號指示器

3.若線程執行的是Java方法,計數器記錄的是正在執行的VM字節碼指令地址,若執行的是Native方法,則計數器爲空

4.與線程一起存在

虛擬機棧

先進後出

虛擬機棧:用戶描述Java方法執行的內存模型

  • 調整參數:-Xss

棧幀:虛擬機棧中的棧元素(用於支持虛擬機進行方法調用和方法執行的數據結構)包括局部變量表、操作數棧、動態鏈接、方法出口

  • 局部變量表:存放方法參數和方法內的局部變量

  • 操作數棧:虛擬機的工作區(大多數指令都是從這裏彈出數據,執行運算,然後把結果壓會操作數棧)

  • 動態連接:符號引用和直接引用在運行時進行解析和鏈接的過程,叫動態鏈接

  • 方法返回:程序正常完成出口和異常完成出口

image-20200702030821996.png

方法區(線程共享)[非堆-Non-Heap]

JDK1.8前後變化,JDK8取消了方法區,增加了元空間

image-20200702031716627.png

1.主要存儲:

  • 類信息

  • 常量

  • 靜態變量

  • 即時編譯器編譯信息

2.數據過多會導致OutOfMemoryError異常

< JDK 1.8

  • -XX:Permsize; -XX:MaxPermSize

>=JDK1.8

  • -XX:MeteSpaceSize; -XX:MaxMateSpaceSize

和永久代的區別:

1.存儲位置不同,永久代物理上是堆的一部分,和新手代,老年代地址是連續的,而元空間屬於本地內存;

2.存儲內容不同,元空間存儲類的元信息,靜態變量和常量池等併入堆中;

3.相當於永久代的數據被分到了堆和元空間中

直接內存:避免native空間和java堆中來回進行復制

  • 通過設置-XX:MaxDirectMemorySize限制大小

堆(線程共享)

image-20200702033412543.png

虛擬機啓動時創建,用於存放對象實例,幾乎所有的對象(包含常量池)都在堆上分配內存,當對象無法再該空間申請到內存時將拋出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)

問題:空間不連續,浪費空間
image-20200702035209179.png

複製(copying)

複製算法有2塊一樣大小的空間,情況對象時將可用的對象移動到to區裏,複製算法內存空間連續

問題:要用2塊空間,所以內存的模型from和to非常的小

image-20200702035446036.png

標記整理

只用一塊空間,先進行標記無用對象,然後整理內存空間地址,最後清除

image-20200702035633349.png

五、垃圾收集器類型

串行蒐集器(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] (用於年老代,採用標記/清除算法)

七、收集器組合策略

image-20200702041102010.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章