我正在考虑编写一个脚本来
但是我对正在运行的JVM上的jstack有多昂贵或侵入性一无所知。在正在运行的JVM上执行jstack的成本是多少?我是否正在为一个受伤的世界做好准备?
最佳答案
我知道这个答案迟到了,但是jstack的昂贵部分来自附加到调试器接口(interface),通常不会生成带有重要异常的堆栈跟踪(并且堆大小根本不重要):
只能在安全点上或在线程等待时(即在Java范围之外)生成任意堆栈跟踪。如果线程正在等待/在Java范围外,则请求堆栈的线程将通过自己执行堆栈遍历来承载任务。但是,您可能不希望“中断”线程以遍历自己的堆栈,特别是在线程持有锁(或进行一些繁忙的等待)时。由于无法控制安全点,因此需要考虑这一风险。
与jstack相比,避免附加到调试接口(interface)的另一种选择是:Thread.getAllStackTraces()或使用ThreadMXBean,在此过程中运行它,保存到文件中,并使用外部工具轮询该文件。
最后说明:我喜欢jstack,它在生产系统上非常庞大。