內存溢出異常
前端
除了程序計數器以外,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鏈接愈來愈多,虛擬機崩潰
解決:將異步調用改成生產者/消費者的消息隊列實現