《JVM》(五)內存溢出異常與調優

內存溢出異常
前端

除了程序計數器以外,jvm的其餘幾個運行時區域都存在着OOM異常的可能性java

java堆溢出web

對象數量達到最大堆的容量限制後算法

虛擬機棧和本地方法棧溢出緩存

線程請求的棧深度大於虛擬機所容許的最大深度服務器

虛擬機在擴展棧時沒法申請到足夠的內存空間網絡

方法區和運行時常量池溢出session

生成大量的class的狀況負載均衡


JDK的可視化工具框架

JConsole:java監視與管理控制檯

概述;類;vm摘要;MBean;

內存(至關於jstat);

線程(至關於jstack);

VisualVM:多合一故障處理工具

顯示虛擬機進程以及進程的配置,環境信息(jps,jinfo)

監視應用程序的CPU,GC,堆,方法區以及線程的信息(jstat,jstack)

dump以及分析堆轉儲快照(jmap,jhat)

方法級的程序運行性能分析,找出被調用最多,運行時間最長的方法

離線程序快照


調優案例分析

1.高性能硬件上的程序部署策略

問題:將網站堆內存固定在12GB,網站不按期出現長時間失去響應的狀況。

緣由:失去響應是由於過大的堆內存,程序設計產生成批大對象,進入老年代,GC停頓致使的。

解決:給java虛擬機分配超大堆的前提是,把握程序的Full GC頻率控制得足夠低。

                控制GC頻率的關鍵是不能有成批的,長時間生存的大對象產生,這樣才能保證老年代的穩定。

現階段64位jdk性能測試結果廣泛低於32位jdk,多數人選擇使用若干個32位虛擬機創建邏輯集羣:在一臺物理機器上啓動多個應用服務器進程,每一個進程分配不一樣端口,在前端搭一個負載均衡器。

無session複製的親和式集羣:均衡器按照必定的算法(通常根據sessionId分配)將一個固定的用戶請求永遠分配到固定的一個集羣節點處理。

2.集羣間同步致使的內存溢出

問題:親和式集羣,節點間沒有session同步,須要有一些數據共享,使用JBossCache構建一個全局緩存。不按期出現屢次內存溢出問題

緣由:JBossCache 的缺陷。JBossCache在發送數據時有一個全局filter,把數據操做時間同步到全部的節點中,當網絡狀況不知足,重發數據在內存中不斷堆積

解決:須要被集羣共享的數據,使用相似JBossCache的緩存框架同步時,能夠讀操做頻繁,不能寫頻繁。

3.堆外內存致使的溢出錯誤

問題:GC並不頻繁,Eden區,surviver區,老年代以及永久代均表示壓力不大,但仍是報錯內存溢出

緣由:除了java堆和永久代,還有些區域會佔用必定的內存:Direct Memory;線程堆棧;socket緩衝區...

4.服務器jvm進程崩潰

問題:使用了異步方式調用另外一個系統的web服務,速度不對等,致使等待的socket鏈接愈來愈多,虛擬機崩潰

解決:將異步調用改成生產者/消費者的消息隊列實現

相關文章
相關標籤/搜索