JVM的GC機制及JVM的調優方法

2022-09-17 13:30:19 字數 1786 閱讀 8038

記憶體管理和垃圾**是jvm非常關鍵的點,對j**a效能的剖析而言,了解記憶體管理和垃圾**的基本策略非常重要。

1.在程式執行過程當中,會建立大量的物件,這些物件,大部分是短週期的物件,小部分是長週期的物件,對於短週期的物件,需要頻繁地進行垃圾**以保證無用對 象盡早被釋放掉,對於長週期物件,則不需要頻率垃圾**以確保無謂地垃圾掃瞄檢測。為解決這種矛盾,sun jvm的記憶體管理採用分代的策略。

1)年輕代(young gen):年輕代主要存放新建立的物件,記憶體大小相對會比較小,垃圾**會比較頻繁。年輕代分成1個eden space和2個suvivor space(命名為a和b)

當物件在堆建立時,將進入年輕代的eden space。

垃圾**器進行垃圾**時,掃瞄eden space和a suvivor space,如果物件仍然存活,則複製到b suvivor space,如果b suvivor space已經滿,則複製 old gen

掃瞄a suvivor space時,如果物件已經經過了幾次的掃瞄仍然存活,jvm認為其為乙個old物件,則將其移到old gen。

掃瞄完畢後,jvm將eden space和a suvivor space清空,然後交換a和b的角色(即下次垃圾**時會掃瞄eden space和bsuvivor space。

我們可以看到:young gen垃圾**時,採用將存活物件複製到到空的suvivor space的方式來確保不存在記憶體碎片,採用空間換時間的方式來加速記憶體垃圾**。

2)年老代(tenured gen):年老代主要存放jvm認為比較old的物件(經過幾次的young gen的垃圾**後仍然存在),記憶體大小相對會比較大,垃圾**也相對沒有那麼頻繁(譬如可能幾個小時一次)。年老代主要採用壓縮的方式來避免記憶體碎片 (將存活物件移動到記憶體片的一邊),當然,有些垃圾**器(譬如cms垃圾**器)出於效率的原因,可能會不進行壓縮。

3)持久代(perm gen):持久代主要存放類定義、位元組碼和常量等很少會變更的資訊

2.總結

1、物件優先在eden分配,這裡大部分物件具有朝生夕滅的特徵,minor gc主要清理該處 

2、大物件(佔記憶體大)、老物件(使用頻繁) 

3、survivor無法容納的物件,將進入老年代,full gc的主要清理該處

3.jvm有2個gc執行緒

第乙個執行緒負責**heap的young區 

第二個執行緒在heap不足時,遍歷heap,將young 區公升級為older區

jvm(採用分代**的策略),用較高的頻率對年輕的物件(young generation)進行ygc,而對老物件( tenured  generation)較少( tenured  generation 滿了後才進行)進行full gc。這樣就不需要每次gc都將記憶體中所有物件都檢查一遍。

gc不會在主程式執行期對permgen space進行清理,所以如果你的應用中有很多class(特別是動態生成類,當然permgen space存放的內容不僅限於類)的話,就很可能出現permgen space錯誤。

4.jvm的調優

減少fullgc的次數,以為fullgc會暫停程式比較長的時間,如果fullgc的次數比較多。程式就會經常性的假死。

jvm 堆的設定是指j**a程式執行過程中jvm可以調配使用的記憶體空間的設定.jvm在啟動的時候會自動設定heap size的值,其初始空間(即-xms)是物理記憶體的1/64,最大空間(-xmx)是物理記憶體的1/4。可以利用jvm提供的-xmn -xms -xmx等選項可進行設定。

如果heap size 設定偏小,gc占用了更多的時間,而應用分配到的執行時間較少。但heap size 最大不要超過可用物理記憶體的80%。

關於jvm的GC調優的做法

如果不能忍受full gc,預設設定也達不到你的期望值,並且應用停頓時間和你的目標不一致,那麼你需要對gc調優。調優的基本想法如下 1,能在新生eden區代 的資源,盡量不讓資源進入到survivor區。2,能在survivor區 的資源,盡量不讓資源進入old區。其實,我們的最終目的是盡量不讓太多...

Jvm調優的方法

其實,jvm調優只要是指的記憶體管理方面的調優,包括各個代的大小,gc策若,由於gc動作會導致應用執行緒的掛起,嚴重影響效能,這些調優對於應用很重要,下面這些方法主要是為了盡量降低gc所導致的應用暫停時間的方法 一 代大小的調優。1 避免新生代大小設定的過小 主要是minorgc和fullgc的關係...

JVM效能調優

gc 優化的兩個目標 將進入老年代的物件數量降到最低 減少 full gc 的執行時間 gc 優化的基本原則是 將不同的 gc 引數應用到兩個及以上的伺服器上然後比較它們的效能,然後將那些被證明可以提高效能或減少 gc 執行時間的引數應用於最終的工作伺服器上。gc 優化需要考慮的 jvm 引數 型別...