我正在考虑制作一个剧本
但我不知道在运行的JVM上有多昂贵或侵入性的jstack.在正在运行的JVM上执行jstack有多贵?我是否为一个受伤的世界做好准备?
我知道这个答案迟到了,但是jstack的昂贵部分来自附加到调试器接口,通常不会生成带有重要异常的堆栈跟踪(并且堆大小根本不重要):
只能在安全点上或在线程等待时(即,在Java范围之外)生成任意堆栈跟踪。如果线程正在等待/在Java范围外,则请求堆栈的线程将通过自己执行堆栈遍历来承载任务。但是,您可能不希望“中断”线程以遍历自己的堆栈,尤其是在线程持有锁(或进行一些繁忙的等待)时。由于无法控制安全点,因此需要考虑这一风险。
与jstack相比,避免附加到调试接口的另一种选择是:Thread.getAllStackTraces()或使用ThreadMXBean,在过程中运行它,保存到文件中,并使用外部工具轮询该文件。
最后说明:我喜欢jstack,它在生产系统上非常庞大。
根据线程的数量和堆的大小,jstack 可能非常昂贵。JStack 旨在用于故障排除,而不是为统计信息收集而设计。最好在检测中使用某种形式或公开 JMX 接口来直接获取您想要的信息,而不是必须解析堆栈跟踪。
| 归档时间: |
|
| 查看次数: |
5048 次 |
| 最近记录: |