设置 HEAPPROFILE 后码头立即退出

jetty quits immediately after setting HEAPPROFILE

我想分析jetty的堆外内存使用情况
所以我使用 gperftools 并将 env 添加到 jetty.sh:

export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
# export HEAPPROFILE=/home/cccccc/perftools/mybin

工作正常

[root@xxx ~]# lsof -n | grep tcmalloc
java      23200           root  mem       REG              253,1    2350880     667001 /usr/local/lib/libtcmalloc.so.4.5.3
java      23200 23203     root  mem       REG              253,1    2350880     667001 /usr/local/lib/libtcmalloc.so.4.5.3
java      23200 23204     root  mem       REG              253,1    2350880     667001 /usr/local/lib/libtcmalloc.so.4.5.3
java      23200 23205     root  mem       REG              253,1    2350880     667001 /usr/local/lib/libtcmalloc.so.4.5.3

但是当我注释掉 HEAPPROFILE 并尝试 service jetty restart(start).
登录后

Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Dumping heap profile to /home/cccccc/perftools/mybin.0001.heap (Exiting, 0 bytes in use)
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
Starting Jetty: Starting tracking the heap
Starting tracking the heap
Starting tracking the heap
ok Thu Sep 20 20:33:36 CST 2018

它退出了。
并检查错误日志,我发现这是一个 'libunwind' 错误。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f882ad93dd4, pid=18147, tid=0x00007f882949a700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_122-b03) (build 1.8.0_122-ea-b03)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.122-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libunwind.so.8+0x2dd4]  access_mem+0x24

(完整内容:https://drive.google.com/open?id=1JB3R27Udpdid3FMgnoWQPr516gZsSfc3

离我的范围太远了。
我使用 gperftools-2.7libunwind-1.2.1(在我使用 libunwind-0.99-BETA 之前结果相同)。
resolve.Too 许多环境因素可能很难。

这个问题几乎可以肯定是由于 libunwind 试图处理由 JVM(热点等)动态生成的代码的堆栈帧。我想甚至 "interpreter" 也不是真正的经典解释器。

我认为你最好的选择是切换到基于帧指针的展开(传递 TCMALLOC_STACKTRACE_METHOD=x86 作为环境变量)。你需要 运行 JVM 和 -XX:+PreserveFramePointer(参见 https://medium.com/netflix-techblog/java-in-flames-e763b3d32166