我正在考虑将脚本添加到
但我不知道在运行的JVM上有多昂贵或侵入性的jstack。在正在运行的JVM上执行jstack有多贵?我是否为一个受伤的世界做好准备?
答案 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接口以直接获取所需信息,而不必解析堆栈跟踪。