分类: j2se

原文转自: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查看到以下内容:
  • Total: 3263.2 MB  
  •   3145.2  96.4%  96.4%   3145.2  96.4% zcalloc  
  •     83.8   2.6%  99.0%     83.8   2.6% os::malloc  
  •     30.0   0.9%  99.9%     30.0   0.9% init  
  •      2.2   0.1%  99.9%      2.2   0.1% ObjectSynchronizer::omAlloc  
  •      1.0   0.0% 100.0%   3144.1  96.4% Java_java_util_zip_Deflater_init  
  •      0.6   0.0% 100.0%      0.7   0.0% readCEN  

  •     可见调用了java.util.zip.Deflater占用绝大多数。了解到这个deflater存在无法释放内存的bug,于是编写btrace查看是否进入了这个函数:
  • import static com.sun.btrace.BTraceUtils.*;  
  • import com.sun.btrace.annotations.*;  
  •   
  • import java.nio.ByteBuffer;  
  • import java.lang.Thread;  
  •   
  • @BTrace public class TestRegion1{  
  •    @OnMethod(  
  •       clazz="java.util.zip.Deflater",  
  •       method="deflate"  
  •    )  
  •    public static void traceCacheBlock(){  
  • println("deflate?");  
  •    }  
  • }  

  •     发现果然在不停调用这行代码。应该如何办呢?
      由于deflater是gzip需要使用的代码,查看用户创建的表,发现COMPRESSOR设置的是GZ,尝试调整为LZO,结果发现btrace无法进入上述代码,再通过perftools查看时,堆内存不再申请,完全不再申请...
      小插曲,perftools的作者是个老实人,提供了zip版下载,但是不提供安装文件,原因?在README中有以下一段话:
      
  • I don't know very much about how to install DLLs on Windows, so you'll  
  • have to figure out that part for yourself. 
  • 相关文章:

    • 2022-01-24
    • 2022-02-19
    • 2021-12-06
    • 2022-12-23
    • 2021-06-01
    • 2022-12-23
    • 2021-07-27
    • 2021-11-21
    猜你喜欢
    • 2022-12-23
    • 2021-12-15
    • 2021-12-06
    • 2021-12-25
    相关资源
    相似解决方案