首先,jemalloc (在我的usecase中)的目的是跟踪由JNI调用之类的东西引起的本机内存分配,所以让我们开始:
嗨,伙计们,我有一些严重的问题。我们的一个应用程序碰巧有内存泄漏。它位于JNI图书馆,特别是那些知道它的人。我已经知道了,但既然我们的经理要求我拿到证据,现在我正花大量的时间去争取证据。我遇到了一个叫做jemalloc的怪物工具(是的,我知道它不仅仅是一个工具),它应该创建".heap“文件,这是很棒的,虽然我找不到从该文件中读取任何合理的方法,下面是一个例子:https://i.stack.imgur.com/mAZKd.png.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援救”部分,以查看我正在讨论的gif示例)。
不幸的是,除了我所包含的博客之外,还有关于如何实际使用它的0条信息。每次我尝试使用精确的命令(如:jeprof --show_bytes --gif java jeprof.out.14441.5.i5.heap > ../../../sheetchallenger/temp/app-profiling_14_10.gif
)生成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?干什么用?For what?我知道没有创建某种类型的配置文件,或者它似乎是在说,但是什么配置文件,在哪里,如何创建?
也许值得一提的是,当我第一次运行这个"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/)一样,或者我还能用它们做什么吗?
向你们所有人致以良好的问候,希望有人能帮我弄清楚这件事。
发布于 2018-12-19 13:45:12
jeprof --show_bytes --gif <java bin path>/java jeprof.out.12077.129.i129.heap > temp/app-profiling_11_24.gif
尝试使用完整的java路径,它帮助了我。
发布于 2021-09-23 14:59:32
我发现了下面的错误消息
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
注意!可能没有定义env var JAVA_HOME
,所以只需尝试找到您的java路径/<path to java home>/bin/java
并使用它。
https://stackoverflow.com/questions/47057599
复制相似问题