full gc JAVA_java觸發full gc的幾種情況概述

前言

近期被問及這個問題,在此記錄整理一下。

System.gc()方法的調用

此方法的調用是建議JVM進行Full GC,雖然只是建議而非一定,但很多情況下它會觸發 Full GC,從而增加Full GC的頻率,也即增加了間歇性停頓的次數。強烈影響系建議能不使用此方法就別使用,讓虛擬機自己去管理它的內存,可通過通過-XX:+ DisableExplicitGC來禁止RMI調用System.gc。

老年代空間不足

老年代空間只有在新生代對象轉入及創建為大對象、大數組時才會出現不足的現象,當執行Full GC后空間仍然不足,則拋出如下錯誤:

java.lang.OutOfMemoryError: Java heap space

為避免以上兩種狀況引起的Full GC,調優時應盡量做到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要創建過大的對象及數組。

永生區空間不足

JVM規范中運行時數據區域中的方法區,在HotSpot虛擬機中又被習慣稱為永生代或者永生區,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。

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的過程中同時有對象要放入老年代,而此時老年代空間不足造成的(有時候“空間不足”是CMS GC時當前的浮動垃圾過多導致暫時性的空間不足觸發Full GC)。

對措施為:增大survivor space、老年代空間或調低觸發并發GC的比率,但在JDK 5.0+、6.0+的版本中有可能會由于JDK的bug29導致CMS在remark完畢

后很久才觸發sweeping動作。對于這種狀況,可通過設置-XX: CMSMaxAbortablePrecleanTime=5(單位為ms)來避免。

統計得到的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對象,例如很長的數組,此種對象會直接進入老年代,而老年代雖然有很大的剩余空間,但是無法找到足夠大的連續空間來分配給當前對象,此種情況就會觸發JVM進行Full GC。

為了解決這個問題,CMS垃圾收集器提供了一個可配置的參數,即-XX:+UseCMSCompactAtFullCollection開關參數,用于在“享受”完Full GC服務之后額外免費贈送一個碎片整理的過程,內存整理的過程無法并發的,空間碎片問題沒有了,但提頓時間不得不變長了,JVM設計者們還提供了另外一個參數 -XX:CMSFullGCsBeforeCompaction,這個參數用于設置在執行多少次不壓縮的Full GC后,跟著來一次帶壓縮的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529703.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java excel條件格式_Java 設置Excel條件格式(高亮條件值、應用單元格值/公式/數據條等類型)...

概述在Excel中,應用條件格式功能可以在很大程度上改進表格的設計和可讀性,用戶可以指定單個或者多個單元格區域應用一種或者多種條件格式。本篇文章,將通過Java程序示例介紹條件格式的設置方法,設置條件格式時,因不同設…

java order()_java.util.Collections.reverseOrder()

描述reverseOrder()方法被用來獲取強加實現可比接口的對象collection的自然順序相反的比較器。聲明以下是java.util.Collections.reverseOrder()方法的聲明。public static Comparator reverseOrder()參數NA返回值方法調用返回一個比較器,該比較器對實現Comparable接…

jsp mysql登錄 demo_java jsp+servlet+mysql實現登錄網頁設計

涉及以下幾個文件:1。登錄頁面 login.jsp2,成功跳轉頁面 success.jsp3,失敗跳轉頁面 fail.jsp4,servlet 處理類 LoginTestServlet.java5,配置文件 web.xml--------------------------------------------- 依次看代碼 …

libsvm java下載_一個基于LIBSVM(JAVA)的股票預測demo

【實例簡介】一個基于LIBSVM的股票價格預測程序,采用隨機森林算法對樣本進行訓練和預測,使用的編程語言為JAVA。【實例截圖】【核心代碼】stock-master└── stock-master├── data│ ├── 000752.csv│ ├── 300251.csv│ ├── 300329.c…

mysql 家譜樹查詢_中國家譜族譜數據庫可以登錄、查詢了

原標題:中國家譜族譜數據庫可以登錄、查詢了中青在線武漢6月6日電(黨波濤 中國青年報中青在線記者 雷宇)數據量全球第一,最早可追溯到明朝萬歷年間。華中師范大學中國農村研究院今天對外發布,由該院建設的中國家譜族譜數據庫正式上線&#xf…

mysql-5.5.56配置_mysql 5.5.56免安裝版配置方法

mysql 5.5.56免安裝版配置方法發布時間:2020-10-18 23:16:23來源:腳本之家閱讀:74作者:阿安安mysql 5.5.56免安裝版配置方法,本文通過文字代碼詳解,具體內容如下所示:1. 下載mysql-5.5.56-winx6…

MySQL命令梳理_MySQL操作命令梳理(2)

一、表操作在mysql運維操作中會經常使用到alter這個修改表的命令,alter tables允許修改一個現有表的結構,比如增加或刪除列、創造或消去索引、改變現有列的類型、或重新命名列或表本身,也能改變表的注釋和表的類型。下面就針對alter修改命令的…

java 進度條_進度條Java

你必須使用線程.設計一個實現Runnable接口的類,它將更新這樣的值.class ProgressBarUpdator implements java.lang.Runnable {/*** Progress bar that shows the current status*/private javax.swing.JProgressBar jpb null;/*** Progress bar value*/private java.lang.Inte…

java 文件存儲_文件存儲學生信息(JavaIO流)

package com;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Scanner;/*** author Administrator*1.要求:有五個學生,每個學生有姓名、年齡 、成績三個屬性&a…

位運算java_Java中的位運算

Java中的位運算,說實話,工作了兩年的時間里,從來沒有用過一次,因為平時都是些的是業務代碼,很少接觸比較底層的東西,我記得第一次在代碼中看到還是在HashMap的Hash算法中看到的,這次重拾Java基礎…

java藍橋杯dfs_第七屆 藍橋杯決賽 Java B組 打靶 解題報告(DFS,回溯,全排列)-Go語言中文社區...

題目:打靶小明參加X星球的打靶比賽。比賽使用電子感應計分系統。其中有一局,小明得了96分。這局小明共打了6發子彈,沒有脫靶。但望遠鏡看過去,只有3個彈孔。顯然,有些子彈準確地穿過了前邊的彈孔。不同環數得分是這樣設…

guid mysql_關于MySQL:MySQL-如何搜索GUID

我正在使用第三方.NET庫(Rhino Security),將其標識符存儲為mysql數據庫中binary(16)字段中的向導。 一切都可以從該應用程序完美地工作,但是當我嘗試通過查詢編輯器(對于MySQL為TOAD)手動運行查詢時,沒有行返回我知道存在的標識符。 例如&…

java 單例 生命周期_Rhythmk 一步一步學 JAVA (13) Spring-2 之Ben懶加載以及生命周期,單例...

1、定義Demo類:package com.rhythmk.spring;public class User {public void Init (){System.out.println("User 對象被 創建!");}// 計數器public int Count0;public void Say(){this.Count;System.out.println("User 被"this.Coun…

java 高級泛型_java泛型的高級應用

展開全部在上面的例子中,由于沒有限制class GenericsFoo類型持有者T的范圍,實際上這里32313133353236313431303231363533e59b9ee7ad9431333339666666的限定類型相當于Object,這和“Object泛型”實質是一樣的。限制比如我們要限制T為集合接口類…

java窗體線條切換消失_java – 如何更改apache poi生成的圖表不使用平滑線條并將空單元格顯示為間隙?...

我使用的是POI 3.12-beta1,并且代碼可以在圖例中創建包含多個數據集和命名系列的折線圖.但是,poi中折線圖的默認設置會生成一條已在數據點上平滑的線.空值也被繪制為0,但我們希望這些線在第一列停止,其中有一個空單元格.一旦在xlsx文件中呈現并更改這些設置,我就可以進入圖表屬…

java正則表達式 問號_正則表達式問號的四種用法詳解

正則表達式問號的四種用法詳解原文符號因為?在正則表達式中有特殊的含義,所以如果想匹配?本身,則需要轉義,\?有無量詞問號可以表示重復前面內容的0次或一次,也就是要么不出現,要么出現一次。非貪婪匹配貪婪匹配在滿…

java alert跳頁面_JavaScript中通過提示框跳轉頁面的方法

通過提示框跳轉頁面具體代碼如下所示:Documentwindow.onload function(){ //設置當頁面加載時執行var btn document.getElementsByTagName("button")[] //獲取btn元素btn.onclick function(){ //給button加上一個點擊事件var answer confirm("是否…

java jsp if else if_jsp頁面使用if else語句 | 學步園

jsp頁面嵌入java語句使用即可,但是在使用if else語句時一定要注意使用是標點的使用,在語句中分號不能寫,不符合jsp頁面的語法規則,若多寫了則會報錯:如下:{name: priceRA, type: string}, {name: priceRB, type: string}, {name: priceRC, type: string},{name: priceRD, typ…

mysql 優化300例_mysql的limit優化實例

測試環境操作系統: debian linux服務器版本: Mysql 5.0.24Mysql數據庫的Qcache緩存關閉數據庫表testtable的參數:類型: MyISAM 大小: >80MB 記錄規模: >50000 字段數: >25個字段id是主鍵 leibie字段上建有索引進行數據分段測試1>SQL不帶where條件的測試1…

mysql+百萬+中間表_MYSQL優化

MYSQL優化是一個非常大的課題,這篇文章主要介紹了跟MYSQL相關的4個方面,如果想深入研究可以查下相關資料。一、服務器級別優化二、操作系統級別優化三、MYSQL級別優化四、SQL級別優化一、服務器級別優化1.服務器選型SUN小型機、DELL730xd、HPDL380、IBM3…