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

时间:2010-09-09 14:32:54

标签: java jstack

我正在考虑将脚本添加到

  1. 每分钟运行一次(或每五分钟一次)
  2. 针对生产中正在运行的JVM运行jstack
  3. 解析jstack输出并计算我感兴趣的内容
  4. 通过另一台服务器上的集中式Cacti安装导出24/365图表的结果
  5. 但我不知道在运行的JVM上有多昂贵或侵入性的jstack。在正在运行的JVM上执行jstack有多贵?我是否为一个受伤的世界做好准备?

3 个答案:

答案 0 :(得分:4)

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

任意堆栈跟踪只能在安全点上生成,或者在线程等待时生成(即在java范围之外)。如果线程正在等待/在java范围之外,则堆栈请求线程将通过自己执行堆栈遍历来执行任务。但是,您可能不希望中断"一个线程来走自己的堆栈,特别是当它持有一个锁(或做一些忙碌的等待)。由于无法控制安全点 - 需要考虑风险。

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

最后一点:我喜欢jstack,它在生产系统上非常棒。

答案 1 :(得分:3)

措施。其中一个time变体(/ usr / bin / time我相信)有一个-p选项,可以让你看到使用的cpu资源:

ravn:~ ravn$ /usr/bin/time -p echo Hello World
Hello World
real         0.32
user         0.00
sys          0.00
ravn:~ ravn$ 

这意味着需要0.32秒的挂起时间,在用户空间使用0.00秒的CPU时间,在内核空间使用0.00秒。

创建一个测试场景,其中有一个程序正在运行但没有做任何事情,并尝试与使用WITH和没有jstack附加进行比较,例如每一秒。然后你有很难的数字,可以试验看看会给出合理的开销。

我的预感是,每五分钟一次是可以忽略不计的。

答案 2 :(得分:0)

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