1. 程式人生 > >java在什麼情況下觸發Full GC

java在什麼情況下觸發Full GC

1. 舊生代空間不足

舊生代空間只有在新生代物件轉入及建立為大物件、大陣列時才會出現不足的現象,當執行Full GC後空間仍然不足,則丟擲如下錯誤:

java.lang.OutOfMemoryError: Java heap space

為避免以上兩種狀況引起的Full GC,調優時應儘量做到讓物件在Minor GC階段被回收、讓物件在新生代多存活一段時間及不要建立過大的物件及陣列。

2. Permanet Generation空間滿

Permanet Generation中存放的為一些class的資訊等,當系統中要載入的類、反射的類和呼叫的方法較多時,Permanet Generation可能會被佔滿,在未配置為採用CMS GC的情況下會執行Full GC。如果經過Full GC仍然回收不了,那麼JVM會丟擲如下錯誤資訊:

java.lang.OutOfMemoryError: PermGen space

為避免Perm Gen佔滿造成Full GC現象,可採用的方法為增大Perm Gen空間或轉為使用CMS GC。

3. CMS GC時出現promotion failed和concurrent mode failure

對於採用CMS進行舊生代GC的程式而言,尤其要注意GC日誌中是否有promotion failed和concurrent mode failure兩種狀況,當這兩種狀況出現時可能會觸發Full GC。

promotion failed是在進行Minor GC時,survivor space放不下、物件只能放入舊生代,而此時舊生代也放不下造成的;concurrent mode failure是在執行CMS GC的過程中同時有物件要放入舊生代,而此時舊生代空間不足造成的。

應對措施為:增大survivor space、舊生代空間或調低觸發併發GC的比率,但在JDK 5.0+、6.0+的版本中有可能會由於JDK的bug29導致CMS在remark完畢後很久才觸發sweeping動作。對於這種狀況,可通過設定-XX: CMSMaxAbortablePrecleanTime=5(單位為ms)來避免。

4. 統計得到的Minor GC晉升到舊生代的平均大小大於舊生代的剩餘空間

這是一個較為複雜的觸發情況,Hotspot為了避免由於新生代物件晉升到舊生代導致舊生代空間不足的現象,在進行Minor GC時,做了一個判斷,如果之前統計所得到的Minor GC晉升到舊生代的平均大小大於舊生代的剩餘空間,那麼就直接觸發Full GC。

例如程式第一次觸發Minor GC後,有6MB的物件晉升到舊生代,那麼當下一次Minor GC發生時,首先檢查舊生代的剩餘空間是否大於6MB,如果小於6MB,則執行Full GC。

當新生代採用PS GC時,方式稍有不同,PS GC是在Minor GC後也會檢查,例如上面的例子中第一次Minor GC後,PS GC會檢查此時舊生代的剩餘空間是否大於6MB,如小於,則觸發對舊生代的回收。

除了以上4種狀況外,對於使用RMI來進行RPC或管理的Sun JDK應用而言,預設情況下會一小時執行一次Full GC。可通過在啟動時通過- java -Dsun.rmi.dgc.client.gcInterval=3600000來設定Full GC執行的間隔時間或通過-XX:+ DisableExplicitGC來禁止RMI呼叫System.gc。

相關推薦

java在什麼情況觸發Full GC

1. 舊生代空間不足 舊生代空間只有在新生代物件轉入及建立為大物件、大陣列時才會出現不足的現象,當執行Full GC後空間仍然不足,則丟擲如下錯誤: java.lang.OutOfMemoryError: Java heap space 為避免以上兩種狀況引起的Full

觸發Full GC執行的情況

觸發FULL GC的四種情況 1. System.gc()方法呼叫 一般情況下禁止使用此方法,讓JVM自己決定FULL GC即可。 2. 老生代空間不足 老生代空間只有在新生代物件轉入及建立為大物件、大陣列時才會出現不足的現象,會出現FULL GC情況。 當執行Full G

AlarmManager 怎樣在程序被幹掉的情況觸發回撥

我用 AlarmManager.setRepeating 設定了一個重複的回撥,程序還在的時候能正常呼叫。 把程序殺掉後,這個定時器就不會被觸發了,要怎樣設定才能保證定時器會被觸發 // 啟動程式碼     void InitAlarm()     {           

JVM 觸發Full gc條件

除直接呼叫System.gc外,觸發Full GC執行的情況有如下四種。 1. 舊生代空間不足 舊生代空間只有在新生代物件轉入及建立為大物件、大陣列時才會出現不足的現象,當執行Full GC後空間仍然不足,則丟擲如下錯誤: java.lang.OutOfMe

Integer和int的比較,大資料量情況造成頻繁gc的原因分析

很多基礎的知識,覺得沒用,所以沒有在意。當實際用到的時候,出現了不同於預想的結果,才會認真分析。 這是shell排序的程式碼 public long sort(Integer[] datas) { long start = System.currentT

jvm什麼時候會觸發full gc

除直接呼叫System.gc外,觸發Full GC執行的情況有如下四種。1. 舊生代空間不足舊生代空間只有在新生代物件轉入及建立為大物件、大陣列時才會出現不足的現象,當執行Full GC後空間仍然不足,則丟擲如下錯誤:java.lang.OutOfMemoryError:

jvm:觸發JVM進行Full GC情況及應對策略

堆記憶體劃分為 Eden、Survivor 和 Tenured/Old 空間,如下圖所示: 從年輕代空間(包括 Eden 和 Survivor 區域)回收記憶體被稱為 Minor GC,對老年代GC稱為Major GC,而Full GC是對整個堆來說的,在最近幾個版本的JDK裡預設包括了對永生帶

觸發JVM進行Full GC情況及應對策略

堆記憶體劃分為 Eden、Survivor 和 Tenured/Old 空間,如下圖所示: 從年輕代空間(包括 Eden 和 Survivor 區域)回收記憶體被稱為 Minor GC,對老年代GC

Java面試題之什麽情況觸發類的初始化

初始化 面試題 試題 lan hand 主類 java面試 導致 支持 以下情況會觸發類的初始化: 遇到new,getstatic,putstatic,invokestatic這4條指令; 使用java.lang.reflect包的方法對類進行反射調用; 初始化一

full GC觸發的條件

錯誤 failure tab 大於 lur vivo abort mar 進行 full GC觸發的條件除直接調用System.gc外,觸發Full GC執行的情況有如下四種。1. 舊生代空間不足舊生代空間只有在新生代對象轉入及創建為大對象、大數組時才會出現不足的現象,當執

什麽是離屏渲染?什麽情況觸發?該如何應對?

循環 進行 off scree err 如果 概念 ram rendering 離屏渲染就是在當前屏幕緩沖區以外,新開辟一個緩沖區進行操作。 離屏渲染出發的場景有以下: 圓角 (maskToBounds並用才會觸發) 圖層蒙版 陰影 光柵化 為什麽要有離屏渲染?

mysql什麼情況觸發表鎖(深度好文!!!)

https://www.cnblogs.com/sessionbest/articles/8689082.html   鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(如CPU、RAM、I/O等)的爭用以外,資料也是一種供許多使用者共享的資源。如

JAVA在不基於XML配置檔案的情況實現郵件傳送功能(郵箱轟炸)

    今天要講的是如何用Java程式碼實現簡單郵件傳送和複雜郵件傳送的功能,這裡我使用的是QQ郵箱,你們也可以嘗試使用其他的郵箱哦~ 想實現郵件傳送功能首先郵箱賬號必須要開啟 SMTP 服務,在網頁登入郵箱後點擊設定→賬戶然後下拉,如圖 &nb

JAVA-氣泡排序-程式碼不重複的情況通過引數控制正序倒序

剛剛入職!!!閒著寫了一下自己想出來的需求   氣泡排序方法可以通過一個引數控制冒泡的排序方式(在程式碼不重複的情況下) 實現有問題的或需要改進↓↓↓↓↓↓↓↓↓↓↓↓ 歡迎大佬們指點 /** * 氣泡排序 * type控制排序方式 1 正

Java 在不知道Array長度的情況 動態構造String Array

問題:在不知道Array長度的情況下 動態構造String Array 解決方案: 使用ArrayList:   List<String> myList = new ArrayList<String>();   在最後使用: &

Java記憶體管理之記憶體洩露是什麼?什麼情況會導致記憶體洩露?

文章目錄 1. 靜態類的使用 2. 資源連線的使用 3. 監聽器的使用 雖然Java擁有垃圾回收機制,但同樣會出現記憶體洩露問題,我們說一下比較主要的三種情況。 1. 靜態類的使用 諸如 HashMap、Vector 等集

Java虛擬機器7:記憶體溢位和記憶體洩露、並行和併發、Minor GCFull GC、Client模式和Server模式的區別

記憶體溢位和記憶體洩露的區別 1、記憶體溢位 記憶體溢位指的是程式在申請記憶體的時候,沒有足夠大的空間可以分配了。 2、記憶體洩露 記憶體洩露指的是程式在申請記憶體之後,沒有辦法釋放掉已經申請到記憶體,它始終佔用著記憶體,即被分配的物件可達但無用。記憶體洩露一般都是因

某些情況java md5 base64_encode 與 php md5 base64_encode的簽名

要求:待簽名資料以UTF-8的格式轉位元組流,對位元組流進行MD5演算法得到的簽名位元組流,再經過Base64轉換為字串,即生成了數字簽名。 所有編碼都是 UTF-8 編碼 字串:A12345 值:hySqdYwvZi15lShw70hupg== JAVA

JAVA 10原始碼閱讀筆記之JEP-307(G1的並行Full GC

# 1. 背景 JEP-307解決了G1垃圾回收器的一個嚴重的問題,截止到Java 9,G1的Full GC採用的是單執行緒演算法,嚴重影響效能,無法利用到多核能力進行垃圾回收。JEP-307修復了此問題,發生Full GC時允許使用多個執行緒進行並行回收。 # 2. G1

HBase在split和major compact的一些非通常情況觸發條件

原 HBase在split和major compact的一些非通常情況下的觸發條件 2013年03月10日 17:51:25 楊步濤的部落格 閱讀數:9914更多 所屬專欄: HBase儲存 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 http