[轉]perftools查看堆外內存並解決hbase內存溢出


 最近線上運行的hbase發現分配了16g內存,但是實際使用了22g,堆外內存達到6g。感覺非常詭異。堆外內存用一般的工具很難查看,可以通過google-perftools來跟蹤: 
http://code.google.com/p/google-perftools/downloads/list 
    它的原理是在java應用程序運行時,當調用malloc時換用它的libtcmalloc.so,這樣就能做一些統計了 



    通過perftools查看到以下內容: 

Java代碼   收藏代碼
  1. Total: 3263.2 MB  
  2.   3145.2  96.4%  96.4%   3145.2  96.4% zcalloc  
  3.     83.8   2.6%  99.0%     83.8   2.6% os::malloc  
  4.     30.0   0.9%  99.9%     30.0   0.9% init  
  5.      2.2   0.1%  99.9%      2.2   0.1% ObjectSynchronizer::omAlloc  
  6.      1.0   0.0% 100.0%   3144.1  96.4% Java_java_util_zip_Deflater_init  
  7.      0.6   0.0% 100.0%      0.7   0.0% readCEN  


    可見調用了java.util.zip.Deflater占用絕大多數。了解到這個deflater存在無法釋放內存的bug,於是編寫btrace查看是否進入了這個函數: 

Java代碼   收藏代碼
  1. import static com.sun.btrace.BTraceUtils.*;  
  2. import com.sun.btrace.annotations.*;  
  3.   
  4. import java.nio.ByteBuffer;  
  5. import java.lang.Thread;  
  6.   
  7. @BTrace public class TestRegion1{  
  8.    @OnMethod(  
  9.       clazz="java.util.zip.Deflater",  
  10.       method="deflate"  
  11.    )  
  12.    public static void traceCacheBlock(){  
  13. println("deflate?");  
  14.    }  
  15. }  


    發現果然在不停調用這行代碼。應該如何辦呢? 
  由於deflater是gzip需要使用的代碼,查看用戶創建的表,發現COMPRESSOR設置的是GZ,嘗試調整為LZO,結果發現btrace無法進入上述代碼,再通過perftools查看時,堆內存不再申請,完全不再申請... 
  小插曲,perftools的作者是個老實人,提供了zip版下載,但是不提供安裝文件,原因?在README中有以下一段話: 
  

Html代碼   收藏代碼
    1. I don't know very much about how to install DLLs on Windows, so you'll  
    2. have to figure out that part for yourself.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM