天天看點

Perftools拾遺

                                                                  Perftools拾遺

       做為一個java程式員,堆外記憶體洩漏問題并不總能遇到。去年年底換公司去了一個遊戲小公司。去之前就一直聽說存在記憶體洩漏問題,但是一直不知道問題出現在哪裡。由于權限,職責的原因,沒能直接參與線上的問題排查。今年六月份,我負責伺服器遷移,調整,使得我不得不直接參與線上問題的排查。

       問題描述:在一個8核16G的正常伺服器配置上,項目每隔幾天就會當機一次。在觀察的過程中,我發現。java堆外記憶體大約以每6小時100M的速度在增長。高峰時段可能速度還會稍微快一些。這是一個棘手的問題。因為我對堆外記憶體并不熟悉。我們使用了netty架構,我最開始以為可能是io的問題。經查正發現我們的項目并沒有使用堆外記憶體來提升性能。我們自己包裝了jni庫,會不會是jni庫出了問題呢?為了驗證這種猜測,我使用了Google的Perftools工具來做資料樣本分析。以下為整個測試過程。

      1,軟體安裝

      下載下傳google-perftools-master.zip ,libunwind-0.99-beta.tar.gz

      a.unzip google-perftools-master.zip

      b.tar -zxvf libunwind-0.99-beta.tar.gz

      c.安裝libunwind

           ① cd libunwind-0.99-beta

           ② ./configure

           ③ make

           ④ make install

     d.安裝 google-perftools-master

           ① cd google-perftools-master

           ② ./configure

           ③ make

           ④ make install

     e.配置libunwind

        vim /etc/ld.so.conf 添加 /usr/local/lib 儲存

     f.啟動 /sbin/ldconfig

     2,在項目啟動腳本中引入

     export LD_PRELOAD=/usr/local/lib/libprofiler.so:/usr/local/lib/libtcmalloc.so

     export HEAPPROFILE=/data/pef/pef.out

     HEAPPROFILE為配置輸出檔案的位置。

     3,啟動腳本,觀察結果,可以看到諸如下面的檔案清單

Perftools拾遺

使用pprof 指令分析以上檔案結果。

按建立對象數量檢視

pprof --cum --text --alloc_objects $JAVA_HOME/bin/java pef.out_15468.0181.heap >1.txt

Perftools拾遺

按配置設定的記憶體多少檢視

pprof --cum --text --alloc_space $JAVA_HOME/bin/java pef.out_15468.0181.heap >2.txt

Perftools拾遺

綜合以上分析,可以看出我們自己包裝的NavLib庫存在問題的可能性非常大。