JVM在內存中申請對象及垃圾回收流程

先看一下JVM的內存模型:
 

 
從大的方面來講,JVM的內存模型分爲兩大塊:
 
永久區內存( Permanent space )和堆內存(heap space)。
 
棧內存(stack space)一般都不歸在JVM內存模型中,因爲棧內存屬於線程級別。
每個線程都有個獨立的棧內存空間。
 
Permanent space裏存放加載的Class類級對象如class本身,method,field等等。
heap space主要存放對象實例和數組。
heap space由Old Generation和New Generation組成,Old Generation存放生命週期長久的實例對象,而新的對象實例一般放在New Generation。
New Generation還可以再分爲Eden區(聖經中的伊甸園)、和Survivor區,新的對象實例總是首先放在Eden區,Survivor區作爲Eden區和Old區的緩衝,可以向Old區轉移活動的對象實例。
 
下圖是JVM在內存空間(堆空間)中申請新對象過程的活動圖:

我們常見的OOM(out of memory)內存溢出異常,就是堆內存空間不足以存放新對象實例時導致。
 
永久區內存溢出相對少見,一般是由於需要加載海量的Class數據,超過了非堆內存的容量導致。通常出現在Web應用剛剛啓動時,因此Web應用推薦使用預加載機制,方便在部署時就發現並解決該問題。
 
棧內存也會溢出,但是更加少見。
 
堆內存優化:
調整JVM啓動參數-Xms  -Xmx   -XX:newSize -XX:MaxNewSize,如調整初始堆內存和最大對內存 -Xms256M -Xmx512M。 或者調整初始New Generation的初始內存和最大內存 -XX:newSize=128M -XX:MaxNewSize=128M。
 
永久區內存優化:
調整PermSize參數   如  -XX:PermSize=256M -XX:MaxPermSize=512M。
 
棧內存優化:
調整每個線程的棧內存容量  如  -Xss2048K
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章