在运行的JVM上执行jstack是多么"昂贵"?

Stu*_*son 10 java jstack

我正在考虑制作一个剧本

  1. 每分钟运行一次(或每五分钟运行一次)
  2. 对生产中正在运行的JVM运行jstack
  3. 解析jstack输出并计算我感兴趣的东西
  4. 通过另一台服务器上的集中式Cacti安装导出24/365图表的结果

但我不知道在运行的JVM上有多昂贵或侵入性的jstack.在正在运行的JVM上执行jstack有多贵?我是否为一个受伤的世界做好准备?

bes*_*sss 5

我知道这个答案迟到了,但是jstack的昂贵部分来自附加到调试器接口,通常不会生成带有重要异常的堆栈跟踪(并且堆大小根本不重要):

只能在安全点上或在线程等待时(即,在Java范围之外)生成任意堆栈跟踪。如果线程正在等待/在Java范围外,则请求堆栈的线程将通过自己执行堆栈遍历来承载任务。但是,您可能不希望“中断”线程以遍历自己的堆栈,尤其是在线程持有锁(或进行一些繁忙的等待)时。由于无法控制安全点,因此需要考虑这一风险。

与jstack相比,避免附加到调试接口的另一种选择是:Thread.getAllStackTraces()或使用ThreadMXBean,在过程中运行它,保存到文件中,并使用外部工具轮询该文件。

最后说明:我喜欢jstack,它在生产系统上非常庞大。


dog*_*ane 0

根据线程的数量和堆的大小,jstack 可能非常昂贵。JStack 旨在用于故障排除,而不是为统计信息收集而设计。最好在检测中使用某种形式或公开 JMX 接口来直接获取您想要的信息,而不是必须解析堆栈跟踪。