最近线上运行的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.
分享到:
相关推荐
google_perftools是谷歌的内存池代码,可以支持嵌入程序。
google-perftools-1.8.2.tar.gz工具,帮助查看堆外内存
google-perftools-1.8.3-1.el6.x86_64.rpm
google-perftools-1.6
perf tools p0
使用Google tcmalloc进行内存申请释放,解决内存没有真正释放
perf tools jre2
perf tools jre1
非常强大的Linux系统性能检测工具。非常强大的Linux系统性能检测工具。
支持nginx优化
rack-perftools_profiler, 使用 perftools.rb 配置 rack 兼容应用程序的中间件 Rack::PerftoolsProfiler使用 perftools.rb 配置机架兼容应用的中间件快速启动假定应用程序使用 Rails 3 ( 你已经在下一节中安装了需求...
perf tools p2
perf 性能分析工具
google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它...本文介绍了一个 Linux 平台上的性能剖析工具 google-perftools,并结合实例向读者展示了如何使用该工具配置、使用及分析性能瓶颈。
perf tools p1
perf tools p3
下面为大家介绍google-perftools的安装,并配置Nginx和MySQL支持google-perftools。 首先,介绍如何优化Nginx: 1,首先下载并安装google-perftools: 注意,如果是64位系统: 那么你需要做:1)先安装libunwind或者2)在...
我们见过的最快的malloc; 与线程和STL配合使用特别好。 另外:线程友好的堆检查器,堆分析器和cpu分析器。
perftools.rb gperftools for ruby code (c) 2012 Aman Gupta (tmm1) http://www.ruby-lang.org/en/LICENSE.txt gperftools (formerly known as google-perftools): http://gperftools.googlecode.com 用法(在...