代码之家  ›  专栏  ›  技术社区  ›  Stu Thompson Helter Scelter

在运行中的JVM上执行jstack有多“昂贵”?

  •  8
  • Stu Thompson Helter Scelter  · 技术社区  · 16 年前

    我在考虑写一个剧本

    1. 在生产环境中对正在运行的JVM运行jstack
    2. 分析jstack输出并总结出我感兴趣的东西
    3. 导出由另一台服务器上的集中式仙人掌安装绘制24/365图形的结果

    但我不知道运行中的JVM上jstack有多昂贵或有攻击性。在运行中的JVM上执行jstack的成本有多高?我是在为一个受伤害的世界做准备吗?

    3 回复  |  直到 16 年前
        1
  •  5
  •   bestsss    14 年前

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

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

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

        2
  •  3
  •   Thorbjørn Ravn Andersen    16 年前

    测量。其中一个 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秒的cpu时间。

    创建一个测试场景,让一个程序运行但什么也不做,并尝试与使用jstack和不使用jstack进行比较,例如每秒一次。然后你有一个硬数字,可以尝试看看什么会给一个合理的开销。

    我的预感是每五分钟一次是不可忽视的。

        3
  •  0
  •   dogbane    16 年前

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