JVM堆
堆
幾乎所有的對象,都存放在堆中
堆是完全自動化管理的,通過垃圾回收機制
垃圾對象會自動清理,不需要顯式的釋放
堆的內存模型
垃圾收集機制的不同,堆內存結構可能不同
新生代,存放新生的對象,或者年齡不大的對象
老年區,存放老年對象,年齡比較大
對象年齡
對象沒經過一次GC,年齡就會加1
一般,經過15次GC之后,還活著,也就是達到15歲之后,就會放到老年區
永久區,存放永久數據
新生代
分為edan區、S0區、S1區
也稱為伊甸園區、from區、to區
From區、to區,也稱為幸存取
是兩塊大小相等,并且,可以互換角色的空間
GC處理過程
伊甸園區
首先,對象存儲在伊甸園區
經過一次GC之后,存放在幸存區
幸存區
幸存區包括S0、S1區,或者說from區、to區
再經過一次GC之后,對象從from區,到to區
再經過一次GC之后,對象從to區,到form區
再經過一次GC之后,對象從from區,到to區
如此反復……
直到對象的年齡到達15歲之后,就會被放到老年區
這也是,為什么幸存區中的S0、S1區
兩個區大小相等,并且,可以互換角色
老年區
老年區滿了,就會產生MajorGC,FullGC,進行養老區的內存清理
如果,執行完成FullGC之后,依然無法進行對幸存區中對象的保存,就會產生OOM異常——OutOfMemoryError
OutOfMemoryError
原因分析
JVM堆內存不夠,內存溢出
1、JVM堆內存設置不夠,可以通過參數調整
2、代碼創建了大量的大對象,并且,長時間不能被GC回收
原因是棧中存在這些對象的引用,通過代碼優化解決
總結
- 上一篇: JVM的堆、栈、方法区
- 下一篇: JVM栈