概念
特點
先進後出
虛擬機棧:用戶描述Java方法執行的內存模型
棧幀:虛擬機棧中的棧元素(用於支持虛擬機進行方法調用和方法執行的數據結構)包括局部變量表、操作數棧、動態鏈接、方法出口
1.主要存儲:
2.數據過多會導致OutOfMemoryError異常
< JDK 1.8
>=JDK1.8
和永久代的區別:
1.存儲位置不同,永久代物理上是堆的壹部分,和新手代,老年代地址是連續的,而元空間屬於本地內存;
2.存儲內容不同,元空間存儲類的元信息,靜態變量和常量池等並入堆中;
3.相當於永久代的數據被分到了堆和元空間中
直接內存:避免native空間和java堆中來回進行復制
虛擬機啟動時創建,用於存放對象實例,幾乎所有的對象(包含常量池)都在堆上分配內存,當對象無法再該空間申請到內存時將拋出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“
問題:空間不連續,浪費空間
復制算法有2塊壹樣大小的空間,情況對象時將可用的對象移動到to區裏,復制算法內存空間連續
問題:要用2塊空間,所以內存的模型from和to非常的小
只用壹塊空間,先進行標記無用對象,然後整理內存空間地址,最後清除
它只有壹條GC線程,且就像前面說的,它在運行的時候需要暫停用戶程序(stop the world)STW
它有多條GC線程,且它也需要暫停用戶程序(stop the world)STW
它有壹條或多條GC線程,且它需要在部分階段暫停用戶程序(stop the world),部分階段與用戶程序並發執行
serial(用於新生代,采用復制算法)、serial old(用於年老代,采用標記/整理算法)
parNew(用於新生代,采用復制算法)、Parallel
Scavenge(用於新生代,采用復制算法)、Parallel
old(用於年老代,采用標記/整理算法)
concurrent mark sweep[CMS] (用於年老代,采用標記/清除算法)