【问题标题】:How to CPU Profile Wildfly10 using VisualVM?如何使用 VisualVM 对 Wildfly10 进行 CPU 分析?
【发布时间】:2019-01-12 19:24:42
【问题描述】:

问题: 我有一个使用特定数据集的给定任务(生成一些文件)运行非常缓慢的 J2EE 应用程序。我决定在应用程序上运行 visualvm 分析器以了解问题的本质。该应用程序使用最新的 Java 8 在 Widfly 10 上运行。

为避免配置复杂性,分析器 (visualvm) 和 Wildfly 服务器都在本地运行。

遇到的第一个问题是 JVMTI 错误 62,使用 -Xverify:none 作为 jvm 参数已解决。

第二个问题(阻塞问题)是,如果我在应用程序部署和运行时运行分析器,Wildfly 部署扫描器会抛出如下异常:

13:19:04,476 INFO  [stdout] (*** Profiler Agent Communication Thread) Profiler Agent: Waiting for connection on port 5140 (Protocol version: 15)

13:19:04,517 INFO  [stdout] (*** Profiler Agent Communication Thread) Profiler Agent: Established connection with the tool

13:19:04,847 INFO  [stdout] (*** Profiler Agent Communication Thread) Profiler Agent: Local accelerated session

13:19:15,984 WARN  [org.jboss.as.ejb3.timer] (EJB default - 6) WFLYEJB0043: A previous execution of timer [id=e6a6ea46-6c2a-466d-b767-cccc8d5021a9 timedObjectId=ecs.ecs.BatchCoordinator auto-timer?:false persistent?:false timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@142b16ca initialExpiration=Sun Aug 05 13:17:05 COT 2018 intervalDuration(in milli sec)=5000 nextExpiration=Sun Aug 05 13:19:15 COT 2018 timerState=IN_TIMEOUT info=null] is still in progress, skipping this overlapping scheduled execution at: Sun Aug 05 13:19:15 COT 2018.
13:19:16,025 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 1) WFLYCTL0013: Operation ("read-resource") failed - address: ([("deployment" => "my_application.war")]): java.lang.NoClassDefFoundError: org/jboss/as/controller/AttributeDefinition$$Lambda$157
at org.jboss.as.controller.AttributeDefinition$$Lambda$157/1799183343.get$Lambda(Unknown Source)
at org.jboss.as.controller.AttributeDefinition.getNoTextDescription(AttributeDefinition.java:872)
at org.jboss.as.controller.AttributeDefinition.addResourceAttributeDescription(AttributeDefinition.java:697)
at org.jboss.as.controller.ListAttributeDefinition.addResourceAttributeDescription(ListAttributeDefinition.java:158)
at org.jboss.as.controller.descriptions.DefaultResourceDescriptionProvider.getModelDescription(DefaultResourceDescriptionProvider.java:129)
at org.jboss.as.controller.operations.global.ReadResourceHandler.doExecuteInternal(ReadResourceHandler.java:370)
at org.jboss.as.controller.operations.global.ReadResourceHandler.doExecute(ReadResourceHandler.java:173)
at org.jboss.as.controller.operations.global.GlobalOperationHandlers$AbstractMultiTargetHandler.execute(GlobalOperationHandlers.java:263)
at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:890)
at org.jboss.as.controller.AbstractOperationContext.processStages(AbstractOperationContext.java:659)
at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:370)
at org.jboss.as.controller.OperationContextImpl.executeOperation(OperationContextImpl.java:1329)
at org.jboss.as.controller.ModelControllerImpl.internalExecute(ModelControllerImpl.java:400)
at org.jboss.as.controller.ModelControllerImpl.execute(ModelControllerImpl.java:208)
at org.jboss.as.controller.ModelControllerImpl$3.execute(ModelControllerImpl.java:667)
at org.jboss.as.controller.ModelControllerImpl$3.execute(ModelControllerImpl.java:657)
at org.jboss.as.server.deployment.scanner.DefaultDeploymentOperations.getDeploymentsStatus(DefaultDeploymentOperations.java:76)
at org.jboss.as.server.deployment.scanner.FileSystemDeploymentService$ScanContext.<init>(FileSystemDeploymentService.java:1622)
at org.jboss.as.server.deployment.scanner.FileSystemDeploymentService$ScanContext.<init>(FileSystemDeploymentService.java:1571)
at org.jboss.as.server.deployment.scanner.FileSystemDeploymentService.scan(FileSystemDeploymentService.java:572)
at org.jboss.as.server.deployment.scanner.FileSystemDeploymentService.scan(FileSystemDeploymentService.java:491)
at org.jboss.as.server.deployment.scanner.FileSystemDeploymentService$DeploymentScanRunnable.run(FileSystemDeploymentService.java:250)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)

Caused by: java.lang.ClassNotFoundException: org.jboss.as.controller.AttributeDefinition$$Lambda$157 from [Module "org.jboss.as.controller:main" from local module loader @4cc77c2e (finder: local module finder @7a7b0070 (roots: D:\jbossas\wildfly-10.1.0.Final-ecs\modules,D:\jbossas\wildfly-10.1.0.Final-ecs\modules\system\layers\base))]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
... 30 more

如果我在没有部署任何应用程序的情况下运行探查器,VisualVM 的探查器将毫无问题地启动;但是,如果我尝试在这种状态/操作模式下部署我的应用程序,wildfly 扫描器将永远不会启动并且应用程序永远不会部署。

那么,我做错了什么??

【问题讨论】:

  • 如何配置配置文件以运行?
  • 这是我过去的做法。在命令提示符 shell 中使用独立的(bat 或 sh)脚本启动 wildfly。创建或更改启动 visualvm 的脚本以包含 jboss 特定的 jar 文件。看看这里的答案:developer.jboss.org/thread/269919

标签: java profiling wildfly wildfly-10 visualvm


【解决方案1】:

最后,我使用了 visualVM Profiler... 这些是您需要执行的步骤,以便使用 VisualVM 执行 Wildfly 10 CPU 配置文件都在本地执行! !):

  1. 下载latest VisualVM(在我的例子中是1.4.1版)。

  2. 下载 JDK10 ...您需要 JDK10 才能仅运行 VisualVM。这一步是必需的,因为bug(这是我之前在分析应用程序时遇到的错误)

  3. 更改 visualVM 配置文件 (&lt;visual-vm&gt;/etc/visualvm.conf) 以指向您的 JDK10 安装...

  4. 转到 &lt;visual-vm&gt;/profiler/lib 并将库:jfluid-server.jar 复制到:&lt;wildfly&gt;/standalone/lib/ext ... 需要此库来克服以下错误:java.lang.NoClassDefFoundError: org/netbeans/lib/profiler/server/ProfilerRuntimeCPUFullInstr(有关此错误的更多信息,请参见 herehere)

  5. 接下来,修改 wildfly 启动脚本,将包 org.netbeans.lib.profiler.server 包含在 SystemProperty:jboss.modules.system.pkgs 中。示例:-Djboss.modules.system.pkgs=org.jboss.byteman,org.netbeans.lib.profiler.server。 (根据这个link,这个属性强制wildfly从任何类加载器中找到这样的包)

  6. 启动visualVM。

  7. 启动 wildfly 服务器(包括您的应用程序 EAR/WAR/JAR 应用程序).​​.. 注意:我使用 JBoss Tools 从 Eclipse 运行 wildfly 服务器;在这种配置下,我的应用程序 (WAR) 处于爆炸模式!

  8. 进入visualVM,打开org.jboss.modules.Main进程。然后转到分析器选项卡。修改目标 Profile classesOutgoing calls 并放置您要监视/配置的类(注意:目前,我的获胜者配置是:Profile classesmy.package.** 和 @ 987654340@:my.package.**)

  9. 点击 CPU 按钮,等待 VisualVM 检测您的目标类,然后调用运行缓慢的代码;稍后,分析结果...

【讨论】:

  • 看起来根本原因可能是JDK-8145964 - 我猜这些步骤有助于避免检测有问题的 lambda(s)。我想知道它是否确实用 Java >= 9 修复了
  • 我在第 4 步中遇到了错误(ProfilerRuntimeCPUFullInstr 未找到),只有在将第 5 步中描述的 VM 参数设置为 -Djboss.modules.system.pkgs=org.jboss.byteman,org.graalvm.visualvm.lib.jfluid.server(WildFly 19、JDK 11 和 VisualVM 2.0)后才能正常工作.1).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多