系統頻繁Full gc問題分析及解決辦法

一、場景描述

上週開始系統在業務高峯期一直收到Full gc報警,監控顯示fgc頻繁,下圖是監控圖,左邊紅框是優化前效果,右邊是優化後,優化後fgc基本爲0

監控 
二、原因查找

1.查看gc日誌,發現old區fgc後大小沒有變化,如下圖:

gclog
2.去線上dump內存看是什麼對象,用memory analyzer分析,Retained Size竟然有2.4G,全是sun.awt.SunToolkit這個對象,其實到這一步已經可以確定是什麼問題了,只是自己對系統不是很熟悉,導致定位具體的問題代碼花了一些時間

ma

三、原因分析

系統中有一個調用頻繁的接口會調用下面這個方法,目的是獲取圖片的寬高信息,但是Image這個對象用完不會自動釋放,需要手動調用 flush()方法;以前沒有調用這個方法,就導致一有請求就會有大對象進入old區,在業務高峯期old區一會就被打滿,所以一直進行fgc 
public static Image getImage(String path) { 
ImageIcon icon = new ImageIcon(path); 
Image img = icon.getImage(); 
return img; 
}

四、解決辦法

其實不管是用Image還是BufferedImage,讀取圖片的寬高不用把圖片全部加載到內存,在圖片的寬高信息其實是存儲在文件頭中的,只 要按不同的格式讀取文件的頭信息就可以拿到寬高信息 
使用ImageReader代碼如下

Iterator readers = ImageIO.getImageReadersByFormatName(StringUtil.getFileSuffix(filePath)); 
ImageReader reader = (ImageReader)readers.next(); 
iis = ImageIO.createImageInputStream(is); 
reader.setInput(iis, true); 
return Pair.of(reader.getWidth(0),reader.getHeight(0));

相關 [系統 full gc] 推薦:

系統頻繁Full gc問題分析及解決辦法

- - JavaRanger - 專注JAVA高性能程序開發、JVM、Mysql優化、算法
上週開始系統在業務高峯期一直收到Full gc報警,監控顯示fgc頻繁,下圖是監控圖,左邊紅框是優化前效果,右邊是優化後,優化後fgc基本爲0. 1.查看gc日誌,發現old區fgc後大小沒有變化,如下圖:. 2.去線上dump內存看是什麼對象,用memory analyzer分析,Retained Size竟然有2.4G,全是sun.awt.SunToolkit這個對象,其實到這一步已經可以確定是什麼問題了,只是自己對系統不是很熟悉,導致定位具體的問題代碼花了一些時間.

觸發Full GC執行的情況

- - Web前端 - ITeye博客
除直接調用System.gc外,觸發Full GC執行的情況有如下四種. 舊生代空間只有在新生代對象轉入及創建爲大對象、大數組時纔會出現不足的現象,當執行Full GC後空間仍然不足,則拋出如下錯誤:. 爲避免以上兩種狀況引起的Full GC,調優時應儘量做到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要創建過大的對象及數組.

Full GC是否真的存在

- - Java譯站
在Plumbr這和GC暫停檢測打交道的這段日子裏,我查閱了與這個主題相關的大量文章,書籍以及資料. 在這當中,我經常會對新生代GC, 年老代GC以及Full GC的事件的使用(濫用)感到困惑. 於是便有了這篇文章,希望能夠清除一些困惑. 本文需要讀者對JVM內建的GC相關的常用原理有一定的瞭解. 像eden區,Survivor區以及年老區空間的劃分,分代假設(generational hypothesis)以及不同的GC算法就不在本文的討論範圍之內了.

利用Arena Allocation避免HBase觸發Full GC

- Adam - 淘寶JAVA中間件團隊博客
Arena Allocation,是一種GC優化技術,它可以有效地減少因內存碎片導致的Full GC,從而提高系統的整體性能. 本文介紹Arena Allocation的原理及其在Hbase中的應用-MSLAB. 假設有1G內存,我順序創建了1百萬個對象,每個對象大小1K,Heap會被漸漸充滿且每個對象以創建順序相鄰.

FULL GC有可能導致JVM暫停1分鐘以上嗎?

- - 高級語言虛擬機
作者: qianhd . 鏈接: http://hllvm.group.iteye.com/group/topic/28745 . 發表時間: 2011年12月30日. 聲明:本文系ITeye網站發佈的原創文章,未經作者書面許可,嚴禁任何網站轉載本文,否則必將追究法律責任. 與另外個程序交互有個心跳檢測, 15s/次, 31s沒有收到心跳檢測的返回消息就認爲連接斷了,.

Tomcat的JreMemoryLeakPreventionListener監聽週期性頻繁執行full gc

- -
網上還是有蠻多解決方案,還是說說我最比較喜歡且常用的吧,. 1、添加gcDaemonProtection="false"參數禁用JreMemoryLeakPreventionListener監聽. 2、直接刪除JreMemoryLeakPreventionListener監聽. 已有 0 人發表留言,猛擊->> 這裏<<-參與討論.

Full Circle 51期發佈

- PT - Wow! Ubuntu
How-to:Part 25 Python編程, Part 6 LibreOffice , Part 3 Ubuntu 開發, Part 2 使用KDE (4.6). Linux實驗室:創建自己的源. 還有:Ubuntu 遊戲,我的Ubuntu故事,等等更多. # 本文采用CC協議進行授權,轉載本文請註明本文鏈接.

初級分代GC

- - C++博客-首頁原創精華區
通常情況下GC分爲兩種,分別是:掃描GC(Tracing GC)和引用計數GC(Reference counting GC). 其中掃描GC是比較常用的GC實現方法,其原理是:把正在使用的對象找出來,然後把未被使用的對象釋放. 而引用計數GC則是對每個對象都添加一個計數器,引用增加一個計數器就加一,引用減少一個計數器就減一,當計數器減至零時,把對象回收釋放.

GC 日誌分析

- - 碼蜂筆記
不同的JVM及其選項會輸出不同的日誌. 生成下面日誌使用的選項: -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:d:/GClogs/tomcat6-gc.log. 最前面的數字 4.231 和 4.445 代表虛擬機啓動以來的秒數.

遲到:Full Circle 中文版45期

- L - LinuxTOY

遲到的社區雜誌 Full Circle 發佈 45 期中文版. 在這一期雜誌中,我們給您帶來了以下內容:. 決勝命令行 —— Conky 第二部分. How-To : Python 編程 , 虛擬化 : Debian Xen 以及 使用 m23 安裝 Ubuntu. Linux 實驗室 —— 多重啓動U盤.


jps -v xxx 顯示xxx進程的各項jvm參數

 

jstat -gcutil pid   xxx

顯示xxx的堆分配情況以及垃圾回收次數時間

 

jstack 用法

Top 一下看一下cpu最高進程

Shift+h 查看線程

或者 top -p pid -H 查看該進程下的所有線程

找到最高的線程 vmid

jstack pid | grep -A 10 vmid(線程id16進制其中字母要小寫)

jmap -histo:live pid 強制進行fullgc 查看實例數

ps -eLo pid,lwp,pcpu | grep 6124 |sort -rnk 3

Top -H -p 6124(進程id)

   注意:

       內存溢出的影響週期和JVM內存設置大小有關係,分配得越小,越容易出現。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章