最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g。感觉非常诡异。堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪:
http://code.google.com/p/google-perftools/downloads/list
它的原理是在java应用程序运行时,当调用malloc时换用它的libtcmalloc.so,这样就能做一些统计了
- 下载http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz,configure;make;sudo make install
- 下载http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz, configure --prefix=/home/user/perftools;make;sudo make install
- 在应用程序启动前加入:export LD_PRELOAD=/home/hadoop/perftools/lib/libtcmalloc.so以及export HEAPPROFILE=/home/user/perftools/test
- 修改lc_config:sudo vi /etc/ld.so.conf.d/usr_local_lib.conf,加入/usr/local/lib(libunwind的lib所在目录)
- 执行sudo /sbin/ldconfig,使libunwind生效
- 启动应用程序,此时会在/home/user/perftools/下看到诸如test_pid.xxxx.heap的heap文件,可使用bin/pprof --text $JAVA_HOME/bin/java test_pid.xxxx.heap来查看
通过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开发的一套强大的性能分析和内存管理工具,它能够帮助开发者深入理解程序的运行情况,从而实现性能的优化。本文将详细介绍Google Perftools及其在Nginx优化中的应用。 Google Perftools是...
google perftools 性能分析工具说明 Google Perftools 是一个功能强大的 Linux 系统性能检测工具,它可以通过采样方式对程序中的 CPU 使用情况进行“画像”,从而帮助开发者对程序的性能进行优化。下面是 Google ...
谷歌的`google-perftools`是一个强大的性能分析和内存管理工具包,主要为C++开发者设计,用于提高程序的性能并有效地管理内存。这个1.7版本的zip文件包含了源码和其他相关文件,使得开发者可以在自己的项目中集成和...
《谷歌性能工具google-perftools详解》 在深入探讨`google-perftools-1.8.2.tar.gz`这一工具之前,我们先来了解一下它的基本背景。`google-perftools`是谷歌公司开源的一款高性能的系统监控和分析工具,主要用于C++...
Google Perftools是一款由Google开发的性能分析和内存管理工具包,主要包含tcmalloc(Thread-Caching Malloc)和CPU、内存等性能剖析器。tcmalloc是一种高效的内存分配器,它通过优化内存分配和回收过程来提高系统...
《谷歌性能工具google-perftools 1.6详解》 谷歌性能工具(Google Performance Tools,简称gperftools)是一款由Google开发的开源性能分析和内存管理工具集,旨在帮助开发者优化C++程序的性能。在本文中,我们将...
google-perftools-1.8.3-1.el6.x86_64.rpm
google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU...
谷歌Perftools是一款由Google开发并开源的性能分析和内存管理工具套件,它提供了对C++应用程序的深度性能优化支持。标题中的“开源”意味着这个工具是免费且公开源代码的,允许开发者查看、使用、修改以及分发其源码...
5. **内存分析**:perf还可以分析内存使用情况,如页面缓存、分配和释放的内存块等,帮助我们发现内存泄漏或不合理内存使用的问题。 6. **硬件性能计数器**:perf利用现代处理器内置的硬件性能计数器,可以实时监测...
4. 创建一个临时目录 `/tmp/tcmalloc`,并给予足够权限,这是google-perftools存放内存分析数据的地方。 5. 修改Nginx的配置文件`/usr/local/nginx/conf/nginx.conf`,在pid配置项下方添加`google_perftools_...
【标题】"perf tools p0" 指的是性能优化工具包的第一部分,可能是针对某个特定的软件或系统进行性能分析和调优的工具集合。在这个场景中,“perf”是性能分析工具的缩写,通常用于Linux环境中,用于收集和分析系统...
rack-perftools_profiler, 使用 perftools.rb 配置 rack 兼容应用程序的中间件 Rack::PerftoolsProfiler使用 perftools.rb 配置机架兼容应用的中间件快速启动假定应用程序使用 Rails 3 ( 你已经在下一节中安装了需求...
标题“perf tools jre2”指的是使用perf性能分析工具针对Java运行环境(JRE)的第二个版本进行优化和调试的相关内容。perf是Linux系统中一个强大的性能分析工具,它可以用来剖析程序的性能瓶颈,帮助开发者优化代码...
标题“perf tools jre1”和描述中的关键词“perf”暗示了这可能与Java性能分析工具有关,尤其是针对JRE(Java Runtime Environment)1版本的。Perf是Linux操作系统中一个强大的性能分析工具,主要用于收集和分析系统...
综上所述,"perf tools p2" 主题涵盖了Linux系统性能分析的关键方面,而提供的两个JAR文件可能与IBM的性能监控和数据收集解决方案有关,帮助用户更深入地了解和优化他们的应用性能。在实际使用中,结合这两个工具,...
离线安装包,亲测可用
标题中的"perf tools p1"可能是指一个关于性能分析工具的系列教程或文档的第一部分,主要关注"perf"工具。"perf"是Linux系统中一个强大的性能分析工具,用于收集和分析系统的各种性能数据,包括CPU周期、指令、缓存...
"perf tools p3" 是一个专注于性能分析的工具集,主要应用于Linux系统,它提供了丰富的功能来帮助开发者和系统管理员深入理解程序运行时的行为。Perf是Linux内核自带的一套性能事件采样工具,其设计目标是提供一种...