墨陌之提示您:看後求收藏(第189章 ,/.,帶著遊戲賬號流浪,墨陌之,630看書),接著再看更方便。
請關閉瀏覽器的閱讀/暢讀/小說模式並且關閉廣告遮蔽過濾功能,避免出現內容無法顯示或者段落錯亂。
5、堆和棧的區別
棧是執行時單位,代表著邏輯,內含基本資料型別和堆中物件引用,所在區域連續,沒有碎片;堆是存 儲單位,代表著資料,可被多個棧共享(包括成員中基本資料型別、引用和引用物件),所在區域不連 續,會有碎片。
1、功能不同
棧記憶體用來儲存區域性變數和方法呼叫,而堆記憶體用來儲存java中的物件。無論是成員變數,區域性變數, 還是類變數,它們指向的物件都儲存在堆記憶體中。
2、共享性不同
棧記憶體是執行緒私有的。
堆記憶體是所有執行緒共有的。
3、異常錯誤不同
如果棧記憶體或者堆記憶體不足都會丟擲異常。
棧空間不足:javangstackoverflowerror。堆空間不足:javangoutoforyerror。
4、空間大小
棧的空間大小遠遠小於堆的。
6、什麼時候會觸發fullgc
除直接呼叫systegc外,觸發full gc執行的情況有如下四種。
舊生代空間不足
舊生代空間只有在新生代物件轉入及建立為大物件、大陣列時才會出現不足的現象,當執行full gc後空間仍然不足,則丟擲如下錯誤:
javangoutoforyerror: java heap space
為避免以上兩種狀況引起的fullgc,調優時應儘量做到讓物件在or gc階段被回收、讓物件在新生代多存活一段時間及不要建立過大的物件及陣列。
pera neration空間滿
peraneration中存放的為一些css的資訊等,當系統中要載入的類、反射的類和呼叫的方法較 多時,pera neration可能會被佔滿,在未配置為採用s gc的情況下會執行full gc。如果經過full gc仍然回收不了,那麼jv會丟擲如下錯誤資訊:
javangoutoforyerror: pern space
為避免per n佔滿造成full gc現象,可採用的方法為增大per n空間或轉為使用s gc。
s gc時出現prootion failed和ncurrent ode faire
對於採用s進行舊生代gc的程式而言,尤其要注意gc日誌中是否有prootion failed和ncurrent ode faire兩種狀況,當這兩種狀況出現時可能會觸發full gc。
prootionfailed是在進行or gc時,survivor space放不下、物件只能放入舊生代,而此時舊生代也放不下造成的;ncurrent ode faire是在執行s gc的過程中同時有物件要放入舊生代,而此時舊生代空間不足造成的。
應對措施為:增大survivorspace、舊生代空間或調低觸發併發gc的比率,但在jdk 50+、60+的版本中有可能會由於jdk的bug29導致s在reark完畢後很久才觸發sweepg動作。對於這種狀況,可透過設定-xx:saxabortableprecleanti=5(單位為s)來避免。
統計得到的or gc晉升到舊生代的平均大小大於舊生代的剩餘空間
這是一個較為複雜的觸發情況,hotspot為了避免由於新生代物件晉升到舊生代導致舊生代空間不足的 現象,在進行or gc時,做了一個判斷,如果之前統計所得到的or gc晉升到舊生代的平均大小大於舊生代的剩餘空間,那麼就直接觸發full gc。
例如程式第一次觸發c後,有6b的物件晉升到舊生代,那麼當下一次or gc發生時,首先檢查舊生代的剩餘空間是否大於6b,如果小於6b,則執行full gc。
當新生代採用psgc時,方式稍有不同,ps gc是在or gc後也會檢查,例如上面的例子中第一次or gc後,ps gc會檢查此時舊生代的剩餘空間是否大於6b,如小於,則觸發對舊生代的回收。除了以上4種狀況外,對於使用ri來進行rpc或管理的sun jdk應用而言,預設情況下會一小時執行一次full gc。可透過在啟動時透過- j
本章未完,點選下一頁繼續閱讀。