1. 程式人生 > >java內存報警 垃圾回收

java內存報警 垃圾回收

吞吐量 tomcat6 ima 變化 無法 val light event tomcat7

jdk6和7服務器端(-server) 默認的新生的垃圾回收器為:PS Scavenge,老年代默認的垃圾回收器為:PS MarkSweep

目前項目使用jdk7,tomcat7,經常出現內存堆使用量200s持續超過堆總內存80%,觸發報警。

由於項目最近的更新為jdk和tomcat升級,從6升級到7,而之前使用tomcat6時並未報警,據查是由於tomcat的一個監聽器行為模式變更造成的

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

 在tomcat6中,它會每隔一個小時3600s調用一次System.gc()方法,手動執行Full GC,使老年代中的無用對象每隔一小時清理一次;

在tomcat7中,事情發生了變化,它沒每隔Long.Max_Value s執行一次System.gc(),這個時間太長了;

回到實際項目中,老年代持續增加,平均每天會觸發1~2次Full GC,在這個工程中,老年代內存使用量長時間居高不下,而新生代的內存使用量隨著業務頻率的變化,有時候迅速撐滿,觸發Young GC;有時候又增長緩慢,如果Young Memory + Old Memory 總和超過堆內存容量的80%時,就會報警。

總的來說,老年代內存占用量長期偏高,增長較快,是導致這個問題的主要原因。

先來了解垃圾回收算法的一些術語:

PS Scavenge:新生代垃圾回收器,使用復制算法(內存分為Eden,S1,S2),並行的多線程收集器,它關註的系統的吞吐量,有效的利用cpu,盡快完成任務,不太關註線程停頓時間。它有一個自適應策略,導致虛擬機參數配置-XX:SurvivorRatio參數沒有實際意義(S1,S2的大小會不定的變化),當然這也是一個參關控制的

標記-清除MarkSweep:把內存分成很多塊,對象沒有引用了就標記出來,標記完後統一回收對象,清除後空間不在連續,分配大對象時可能無法找到足夠空間將觸發一次垃圾回收

技術分享(深入理解Java虛擬機第二版圖)

java內存報警 垃圾回收