【问题标题】:JVM getting allocation call stacks programmaticallyJVM 以编程方式获取分配调用堆栈
【发布时间】:2021-07-13 07:25:55
【问题描述】:

这是this one的后续问题

因此,我不断从“程序化访问”的角度探索现代分析器的功能,但我发现了一些超出我理解的东西。

这次我偶然发现了 JProfiler 中的“分配调用树”功能:

我确实看到,为了获得这种信息,我必须默认以 1/10 的速率触发采样分配,然后指定(最好)将记录分配的分类的包。

第 1 步

第 2 步

但是我真的不明白如何才能将有关调用堆栈的信息与有关分配对象的信息“匹配”。

当然我的问题不是关于JProfiler的实现细节,我理解它是一个商业工具,代码很紧凑,什么都有,而是关于如何检索这种信息的一般理解。

我最初的猜测是它以某种方式“检测”已经加载的类文件以“拦截”这些对象的每个分配(采样率不会过多地减慢过程)但是然后呢?它是否调用类似Thread.currentThread().getStackTrace() 并记录导致分配的实际堆栈跟踪?

另一方面,它在“采样模式”下激活(与仪器相反)+ 存在性能问题 - 这对我来说听起来是一件非常昂贵的事情(阅读,不应该在生产中使用) ,但我可能是错的,所以任何建议将不胜感激。

【问题讨论】:

    标签: java jvm profiling heap-memory profiler


    【解决方案1】:

    我最初的猜测是它以某种方式将已加载的类文件“插入”到 “拦截”这些对象的每一次分配

    自从 Java 11 交付 JEP 331 以来,它在本机 JVMTI 中使用这些功能来采样分配。在 Java 11 之前,它检测 java.lang.Object 构造函数。至于调用堆栈,这取决于使用的是检测还是采样。对于检测,它使用检测已经构建的调用堆栈。对于采样,采样构建的调用栈不够精确,所以queries the call stack through JVMTI

    它是否调用类似 Thread.currentThread().getStackTrace() 的东西

    对于采样,它有点像这样,但在 Java 中这样做会产生巨大的开销,因为有许多次要分配。 JVMTI 是本机接口,可以更高效地完成此操作。

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 2020-07-16
      • 2021-07-12
      • 2010-09-06
      • 2011-12-04
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多