我正在考虑编写一个脚本来

  • 每分钟(或每五分钟)运行一次
  • 在生产
  • 中针对正在运行的JVM运行jstack
  • 解析jstack输出并汇总我对
  • 感兴趣的内容
  • 通过另一台服务器上的集中式Cacti安装导出用于24/365绘图的结果

  • 但是我对正在运行的JVM上的jstack有多昂贵或侵入性一无所知。在正在运行的JVM上执行jstack的成本是多少?我是否正在为一个受伤的世界做好准备?

    最佳答案

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

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

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

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

    10-04 18:26