使用代理与进程附加 jvm 分析器之间的区别

Difference between attaching jvm profiler using agent vs process

使用 jvm agentlib 附加 jvm profiler(在我的例子中是它的 jprofiler)和动态附加到进程有什么区别?

除了静态分析与动态分析的优点之外,这两种方法之间还有其他显着差异吗?

假设探查器运行在应用程序服务器本地。

静态 (agentlib) 分析器附件的优点是:

  • 您可以分析应用程序的启动
  • 您可以分析 Java 5 个和 Java 6 个应用程序
  • 您可以分析远程 JVM 中的应用程序

动态附件的优点是您可以分析应用程序而无需重新启动它,也无需更改其命令行选项(添加 agentlib)。

参考:NetBeans 使用 NetBeans 开发应用程序 IDE 8.0 版,Section 8.9, "Attaching the Profiler"

正如 Stephen 所说,附加模式不适用于 Java 1.5 及更低版本(附加是在 Java 6 中引入的)并且只能通过添加 -agentlib 来分析应用程序的启动虚拟机参数。远程分析的限制不适用于 JProfiler,您可以在其中使用 jpenable 命令行工具为分析准备远程进程。

附加模式的主要缺点是探查器在加载时看不到所有 类。相反,为了 类 感兴趣,它必须重新检测那些 类。这需要时间,并且在 Java 8 之前它会给 PermGen 带来负担,因此与启动时相比,分析器在检测 类 时必须更具选择性。

例如:记录数组分配的堆栈跟踪只有在检测所有调用点时才有可能。在附加模式下,这意味着所有 类 都需要重新检测,这是不切实际的,因此在 JProfiler 中,此功能在附加模式下未启用。

还有其他几个此类问题导致附加模式下的功能限制。