使用JVM agentlib附加JVM分析器(在我的情况下,是jprofiler)和动态附加到进程之间有什么区别? 除了静态和动态分析的优势之外,这两种方法之间还有其他显着的差异吗? 假设分析器在应用程序服务器本地运行。
正如Stephen所说,Java 1.5及以下版本不支持attach模式(attach是在Java 6中引入的),因此只能通过添加-agentlib VM参数来对应用程序进行启动性能分析。对于远程性能分析的限制并不适用于JProfiler,您可以使用jpenable命令行工具来为远程进程准备性能分析。attach模式的主要缺点是,性能分析器无法看到全部加载的类。相反,对于感兴趣的类,它必须重新插装这些类。这需要时间,并且在Java 8之前,会给PermGen带来负担,因此与启动时存在时相比,性能分析器在插装类时必须更有选择性。例如:仅在插装了所有调用站点时才能记录数组分配的堆栈跟踪。在attach模式下,这意味着所有类都需要重新插装,这是不切实际的,因此在JProfiler中,此功能在attach模式下未启用。attach模式存在其他一些问题,这导致其功能受到限制。
静态(agentlib)分析器附加的优点是: 您可以分析应用程序的启动 您可以分析Java 5和Java 6应用程序 您可以在远程JVM中分析应用程序 动态附加的优点是,您可以在不重新启动应用程序且不更改其命令行选项(添加agentlib)的情况下对其进行分析。参考:NetBeans IDE开发应用程序,版本8.0,第8.9节,“附加分析器”。