我已经设置并使用了https://github.com/jvm-profiling-tools/async-profiler这非常有用,但是我有一个奇怪的事情我无法解释。
我的设置正是多个演示文稿显示它可以提供帮助的地方:
具有节点池的 AKS kubernetes 集群
部署在一个节点上的 Pod
在容器中,我使用 debuginfo 设置了 openjdk-11
分析设置是一个简单的 ./profiler start -e malloc PID
由于我在虚拟化环境中进行分析工作,我得到的唯一警告是
[WARN] Kernel symbols are unavailable due to restrictions. Try sysctl kernel.kptr_restrict=0 sysctl kernel.perf_event_paranoid=1
我认为关于可能不需要的 malloc 调用捕获。
问题是,经过一些分析时间后,我已经捕获了火焰图显示的分配部分:堆栈跟踪“未知”(参见附图)。可能是我在容器中还没有完整的设置,或者我真的需要那些 sysctl?
问题是虚拟化将它们放置到位并不是一件容易的事,因为据我所知,这实际上会影响我们正在运行的底层节点。
更新
现在,在我的微服务的所有主要功能至少触发一次之后,我重新启动了分析,似乎没有未知的分配。愚蠢的问题,但是我是否会在所有类加载发生之前立即开始分析(因为 bean 是惰性实例化的),这就是为什么它被这样分类的原因?
更新 2
此后不久,同样的现象再次发生,据报道捕获的大量 malloc 事件是未知的,顶部显示没有显着增加。这可能是由于虚拟化而我实际上是从同一节点上的其他容器中捕获事件吗?在我的容器中没有更多的 java 进程,我还直接指定了 PID
更新 3
因此,在 Andrei 为我提供了“矮人 stackwalker”之后,这看起来好多了。我只有一个问题还不清楚,但只有我一个人。我们在这里用我的: ./profile.sh start --cstack dwarf -e malloc PID 分析 malloc 事件所以我在这些火焰图上看到的是:它只是捕获的事件编号,可以同时释放还是它当前持有所有这些 malloc 的本机内存?
My current situation is that I see payara-micro healthcheck and autodeploy holds significant amount of memory which is weird and my first guess for the leak source.
I also made a jeprof output anybody has a guess what "updatewindow/inflate" can point to?