我考虑运行VisualVM来监视生产JVM的运行情况,因为它似乎由于某些原因开始消耗过多CPU资源。 必须确保这不会导致JVM崩溃,所以我正在尝试评估所有风险。 他们网站上唯一可能导致JVM崩溃的问题与类共享和-Xshare JVM选项有关,但据我所知,类共享在服务器模式和/或x64系统上未启用。 那么,在生产JVM上运行VisualVM真的安全吗?如果不安全,应该考虑哪些风险,并且在JVM上运行VisualVM(并进行性能分析)会产生多大的负载(CPU/内存)? 谢谢
据我所知,VisualVM可以在生产环境中使用,但我只会在轻负载的服务器上使用它。你可以等待服务变慢,然后在它不被大量使用时测试它,看看是否有一些集合非常大。或者你可以触发堆转储并离线分析它。如果没有重大开销,你无法获得关于方法调用的统计信息。Java 6和7比Java 5更好,但即使使用商业分析工具,它仍可能使应用程序减速30%。
实际上,通过使用堆栈转储,您可以在没有太多开销的情况下获取一些信息。甚至有一个脚本可以帮助您在https://gist.github.com/851961上执行此操作。 这种类型的分析是最不具侵入性的。
如今,在生产环境中可能会使用默认的.jfc配置文件来使用Java Flight Recorder。也就是说,开发人员明确表示它的开销非常低(约1%):https://docs.oracle.com/en/java/javase/17/jfapi/flight-recorder-configurations.html#GUID-51B499C9-CF15-48EE-9AAA-47BB69CBDABF