使用jeprof从“*.heap”文件中生成gif的jemalloc

5
首先,jemalloc的目的(在我的用例中)是跟踪由诸如JNI调用之类的原生内存分配引起的问题,所以让我们开始吧:
大家好,我这里有一个严重的问题。我们的一个应用程序出现了内存泄漏。特别是针对那些熟悉它的人来说,它位于JNI库中 - cplex。我已经知道了,但由于我们的经理要求我现在提供证据,所以我正在浪费极大量的时间来获取证据。我遇到了一个名为jemalloc的巨型工具(是的,我知道它不仅仅是一个工具),它应该创建“ .heap”文件,这很棒,虽然我不能看到任何实际从该文件中读取任何有意义的内容的方法,这是一个例子:生成的“ .heap”文件的PNG图像 - 仅列出前几行,但所有看起来都相当一致。

我发现还有另一个名为“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示例)。

很遗憾,除了像我所包含的博客之类的内容之外,关于如何实际使用它的信息恰好为0。每次我尝试使用完全相同的命令生成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/),或者我还能做其他事情吗?

祝大家一切顺利,希望有人能帮助我解决这个问题。


你可以生成一个png/gif文件,甚至是pdf,然后查看它以查看有意义的输出。你试过这些选项吗?你查看了突出重要内容的png文件吗? - Swapnil
2个回答

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

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


0
我曾经吃过亏,发现以下错误信息:
The first profile should be a remote form to use /pprof/symbol
可能与实际问题无关,并且如果你的Java路径不正确,它会出现!

尝试使用 $JAVA_HOME/bin/java 作为你的Java路径,就像这样:
jeprof --show_bytes --gif $JAVA_HOME/bin/java jeprof.*.heap > temp/app-profiling.gif

注意!!! 环境变量 JAVA_HOME 可能未定义,因此请尝试查找您的 Java 路径 /<path to java home>/bin/java 并使用该路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接