perftools查看JVM堆外内存

本文探讨了如何解决HBase中内存使用异常的问题,通过使用google-perftools进行内存跟踪,并发现了Java.util.zip.Deflater组件的内存泄露问题。通过调整压缩算法为LZO,成功解决了内存泄露问题,优化了内存使用效率。

转自http://koven2049.iteye.com/blog/1142768

最近线上运行的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.0100.0%   3144.1  96.4% Java_java_util_zip_Deflater_init  
  7.      0.6   0.0100.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.  

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值