zoukankan      html  css  js  c++  java
  • 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.  
  • 相关阅读:
    一次偶然的Java内存溢出引发的思考
    centos6.4下面安装postgresql以及客户端远程连接
    用springMVC构建restful程序,接收以及返回json数据格式
    如何编译spring源码,并导入到eclipse中
    模仿MFC封装Windows API
    一些好用的控制台命令
    014:字符串:各种其奇葩的内置方法
    013:元组:戴上了枷锁的列表
    012:列表:一个打了激素的数组3
    011:列表:一个打了激素的数组2
  • 原文地址:https://www.cnblogs.com/hushaojun/p/4967514.html
Copyright © 2011-2022 走看看