jemalloc использует jeprof для генерации GIF из файлов *.heap
Прежде всего, цель jemalloc (в моем сценарии использования) состоит в том, чтобы отслеживать внутреннее распределение памяти, вызванное такими вещами, как вызовы JNI, поэтому давайте начнем:
Привет, ребята, у меня есть серьезная проблема здесь. У нас случается утечка памяти в одном из наших приложений. Он находится в библиотеке JNI, особенно для тех из вас, кто знает это - cplex. Я уже знаю это, но так как наш менеджер попросил меня получить доказательство, я трачу ужасно много времени на его получение. Я сталкивался с инструментом-монстром (да, я знаю, что это не просто инструмент) под названием jemalloc, который должен создавать файлы " .heap", и это здорово, мне удалось, хотя я не вижу способа на самом деле прочитать что-нибудь разумное из этого файла Вот пример: изображение PNG сгенерированного файла ".heap" - только первые несколько строк, но все выглядит примерно так
Затем я обнаружил, что есть другой монстр по имени "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
- я получаю следующий ответ и создаю пустой gif размером 0 байт:
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? Зачем? Я понял, что нет какого-то профиля, созданного каким-то образом, или, кажется, он говорит, но какой профиль, где, как?
Возможно, будет полезно упомянуть, что в первый раз, когда я запустил эту "команду heprof heap file to 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/) или я могу сделать что-нибудь еще с ними?
С наилучшими пожеланиями всем вам, и, надеюсь, кто-то может помочь мне разобраться в этом.
2 ответа
jeprof --show_bytes --gif <java bin path>/java jeprof.out.12077.129.i129.heap > temp/app-profiling_11_24.gif
Попробуйте с полным путем Java, это помогло мне
Я на собственном опыте выяснил, что сообщение об ошибке
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
хотя это может измениться в зависимости от вашей среды