jemalloc使用jeprof从'* .heap'文件生成gif

时间:2017-11-01 14:51:35

标签: java java-native-interface malloc jemalloc

首先,jemalloc(在我的用例中)的目的是跟踪由JNI调用之类的东西引起的本机内存分配,所以让我们开始吧:

你好我们这里有一些严重的问题。我们在其中一个应用程序中碰巧发生内存泄漏。它位于JNI图书馆,特别适合那些了解它的人--cplex。我已经知道了,但是因为我们的经理要求我现在得到一个证据,所以我花了很多时间试图得到一个。我遇到了一个名为jemalloc的怪物工具(是的,我知道它不仅仅是一个工具),它应该创建“ .heap”文件,这很棒,我管理虽然我看不到任何方法来实际阅读任何明智的东西从该文件中,以下是示例:PNG image of the generated " .heap" file - first few lines only but it all looks pretty much like that

我发现有一个名为“jeprof”的其他怪物显然可以将“ .heap”文件转换为漂亮的“ .gif” - 所有你需要做的就是像这样运行命令:jeprof --show_bytes --gif /path/to/jvm/bin/java jeprof*.heap > /tmp/app-profiling.gif它应该在这里产生类似示例(和描述)的内容:https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/ (你需要将页面向下滚动到“JEMALLOC to the rescue”部分,看看我正在谈论的gif的例子)。

不幸的是,除了我所包含的博客之外,还有关于如何实际使用它的信息。每次我尝试使用确切的命令生成该gif:jeprof --show_bytes --gif java jeprof.out.14441.5.i5.heap > ../../../sheetchallenger/temp/app-profiling_14_10.gif - 我得到以下答案,并创建一个大小为0字节的空gif:

Use of uninitialized value $line in substitution (s///) at /usr/local/bin/jeprof line 3256.
http://jeprof.out.14441.5.i5.heap/pprof/symbol doesn't exist

以下是它似乎谈论的“jeprof”文件(我的意思是第3256行的部分):

sub CheckSymbolPage {
  my $url = SymbolPageURL();
  my $command = ShellEscape(@URL_FETCHER, $url);
  open(SYMBOL, "$command |") or error($command);
  my $line = <SYMBOL>;
  $line =~ s/\r//g;         # Line:3256: turn windows-looking lines into unix-looking lines
  close(SYMBOL);
  unless (defined($line)) {
    error("$url doesn't exist\n");
  }

  if ($line =~ /^num_symbols:\s+(\d+)$/) {
    if ($1 == 0) {
      error("Stripped binary. No symbols available.\n");
    }
  } else {
    error("Failed to get the number of symbols from $url\n");
  }
}

字面意思不知道这是什么试图告诉我,为什么它使用http?做什么的?我知道没有创建某种类型的配置文件,或者它似乎在说什么配置文件,在哪里,如何?

也许有必要提一下,我第一次运行这个“jeprof堆文件到gif转换命令”我收到了以下回复:

[root@mnd-dev-kfk01 sheetchallenger]# jeprof --show_bytes --gif java jeprof.out.12077.129.i129.heap > temp/app-profiling_11_24.gif
Using local file jeprof.out.12077.129.i129.heap.
The first profile should be a remote form to use /pprof/symbol

这究竟是什么意思,我为什么要关心 - 这是重要的,什么是远程形式,形式是什么,为什么?

所以基本上问题是:因为我已经可以生成那些不幸的“* .heap”文件(如果这些文件看起来不正确,请有人纠正我)如何开启我可以将它们转换为有用的东西,最好是使用jeprof或其他任何东西吗?

我可以将它们转换为我在上面链接的网站上显示的那个gif(https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/),还是可以用它们做任何其他事情?

亲切的问候所有人,希望有人可以帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

jeprof --show_bytes --gif <java bin path>/java jeprof.out.12077.129.i129.heap > temp/app-profiling_11_24.gif

尝试使用完整的Java路径,对我有帮助