1. 程式人生 > >伺服器記憶體洩露 , 重啟後恢復問題解決方案

伺服器記憶體洩露 , 重啟後恢復問題解決方案

 最近爆發了一個問題 , 以前一直在正常執行的應用突然無法訪問 .

不用問,這個肯定是伺服器的問題,但是這個要怎麼看呢?

1.登入伺服器,如果伺服器壓力過大,已經無法登入伺服器了,那麼只能請求DBA強制重啟了.

  1.1. 假設能登陸伺服器,馬上檢視伺服器CPU以及記憶體或者回收等資訊,可以那麼使用以下方法收集日誌和檢視CPU,手速一定要快,比較使用者都在催,電話,微信,qq都在響..收集完了就重啟伺服器,現正常了再查原因.

  附圖:為了大家能夠熟練敲打,照著多打吧.

  

2.登入之後查看回收效率以及速度:

  1.通過 ps -ef|grep java 得到pid:如圖:

  

2.通過 ps -p 101040 -o etime;jstat -gcutil 101040 1000 30  

  上面的命令意思:

  ps -p 101040 -o etime 檢視的是應用執行時長

  jstat -gcutil 為檢視jvm gc回收情況的命令

  101040 為上圖的PID

  1000為時間間隔,單位毫秒

  30為列印的條數,不設定則一直列印

至於列印什麼東西??請看下面:

  

 結果中每個專案的含義可以參考官方對jstat的文件,簡單翻譯如下:(參考別人的翻譯)

- S0C: Young Generation第一個survivor space的記憶體大小 (kB).- S1C: Young Generation第二個survivor space的記憶體大小 (kB).- S0U: Young Generation第一個Survivor space當前已使用的記憶體大小 (kB).- S1U: Young Generation第二個Survivor space當前已經使用的記憶體大小 (kB).- EC: Young Generation中eden space的記憶體大小 (kB).- EU: Young Generation中Eden space當前已使用的記憶體大小 (kB).- OC: Old Generation的記憶體大小 (kB).- OU: Old Generation當前已使用的記憶體大小 (kB).- PC: Permanent Generation的記憶體大小 (kB)- PU: Permanent Generation當前已使用的記憶體大小 (kB).- YGC: 從啟動到取樣時Young Generation GC的次數- YGCT: 從啟動到取樣時Young Generation GC所用的時間 (s).- FGC: 從啟動到取樣時Old Generation GC的次數.- FGCT: 從啟動到取樣時Old Generation GC所用的時間 (s).- GCT: 從啟動到取樣時GC所用的總時間 (s).

3.上面都是檢視JVM的記憶體情況,具體表現為jvm記憶體洩露,解決方案現在有2個:

  1.具體問題具體分析,找到記憶體洩露的瓶頸,上面所蒐集的日誌可以幫助你找到問題的根源;

  2.短期內需要保證專案執行,那麼請將JVM的記憶體加大,1G的加到2G,2G的加到4G等...

    調整方式(Tomcat為例,其他容器自行參考)

    1.開啟檔案:自己的tomcat目錄/bin/catalina.sh

    2.找到如下引數,並將其修改為如下:

JAVA_OPTS="-server -Xms4096m -Xmx4096m"JavaOpts裡面的server引數足夠用了,其餘多餘的引數其實沒什麼用(專案自行配置),將上面的記憶體大小調整即可,如上面為4096M=4G.

  調整記憶體只是權宜之計,根本問題還是要找到瓶頸,對症下藥!!!

  祝大家永無bug.