如何诊断 Java 包中可能出现的回归?

如何诊断 Java 包中可能出现的回归?

昨天,在安装每日软件更新后,我发现一个 Java 应用程序的 CPU 使用率很高,而在此之前,该应用程序一直运行良好。Java 是更新的软件包之一。来自/var/log/apt/history.log

Start-Date: 2015-10-29  07:18:28
Commandline: aptdaemon role='role-commit-packages' sender=':1.108'
Install: libsctp1:amd64 (1.0.16+dfsg-2), lksctp-tools:amd64 (1.0.16+dfsg-2, automatic)
Upgrade: python3-problem-report:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), qtcreator-plugin-ubuntu-common:amd64 (3.1.1+15.10.20150720-0ubuntu1~0vivid1, 3.1.1+15.10.20151018-0ubuntu1~0vivid1), python-apport:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), ubuntu-sdk-qmake-extras:amd64 (3.1.1+15.10.20150720-0ubuntu1~0vivid1, 3.1.1+15.10.20151018-0ubuntu1~0vivid1), libapache2-mod-php5:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-mysql:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-common:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-curl:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-dev:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), python-problem-report:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), qtcreator-plugin-ubuntu:amd64 (3.1.1+15.10.20150720-0ubuntu1~0vivid1, 3.1.1+15.10.20151018-0ubuntu1~0vivid1), php5-readline:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), openjdk-7-jdk:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), shotwell-common:amd64 (0.20.2-0ubuntu3, 0.20.2-0ubuntu4), shotwell:amd64 (0.20.2-0ubuntu3, 0.20.2-0ubuntu4), openjdk-7-jre-headless:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), ntp:amd64 (4.2.6.p5+dfsg-3ubuntu6, 4.2.6.p5+dfsg-3ubuntu6.2), apport-kde:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), php5-cli:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), openjdk-7-jre:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), openjdk-7-source:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), apport-gtk:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), apport:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), php-pear:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), libaudiofile1:amd64 (0.3.6-2, 0.3.6-2ubuntu0.15.04.1), icedtea-7-jre-jamvm:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), openjdk-7-doc:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), python3-apport:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), php5-gd:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), ntpdate:amd64 (4.2.6.p5+dfsg-3ubuntu6, 4.2.6.p5+dfsg-3ubuntu6.2)
End-Date: 2015-10-29  07:19:15

应用程序运行时,java和 的XorgCPU 使用率均超过 50%。这导致应用程序运行缓慢,我确信过去不会出现这种情况。

该应用程序实际上是一个(基于秋千的)游戏。虽然它是开源的,但我认为它不适合麦克韦,所以我不能用它来提交错误报告。另外,我不知道在哪里我可以报告。

我的问题是:我如何才能找出错误,以便我可以在某处(哪里?)报告错误并帮助解决问题?

我确实拿了线程转储,但我不知道如何处理它,因为实际上没有线程被阻塞。

我的环境:

$ java -version
java version "1.7.0_85"
OpenJDK Runtime Environment (IcedTea 2.6.1) (7u85-2.6.1-5ubuntu0.15.04.1)
OpenJDK 64-Bit Server VM (build 24.85-b03, mixed mode)

$ uname -a
Linux pif 3.19.0-31-generic #36-Ubuntu SMP Wed Oct 7 15:04:02 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.04
Release:    15.04
Codename:   vivid

top我使用 VisualVM 进行查看,发现那里报告的 CPU 使用率 (10%) 比报告的 CPU 使用率(45%) 小得多:在此处输入图片描述

我尝试的另一件事是使用 Java 8 运行它。在这种情况下,游戏运行良好,并且报告的 CPU 使用率top分别为:javaXorg和约为 20-22% compiz

答案1

由于您已将 VisualVM 作为分析器运行,它是适合此项工作的工具,因此其目的是收集足够的数据来找出热点所在的位置。

系统正在报告整个 Java 进程。分析工具是一种查看该进程内工作情况的方法(实际上,“进程”对于分析器来说毫无意义。它正在查看单个 JVM 实例中的多个线程和类加载器。)

由于您想要收集可用于向 OpenJDK 项目(或可能是游戏作者)报告的信息,因此您可能想要尝试“示例”功能。我们的想法是,我们需要随时间推移的活动快照,可能是多个快照,这样我们就可以从系统的角度看到在发现问题期间 JVM 的哪些部分最热。

这样我们就可以知道它是否是与游戏代码相关的方法,或者是 JVM 本身内的本机或非本机代码。

(我要补充一点,分析正在运行的应用程序有点像黑魔法。我的建议是确保您确实在查看您认为的 JVM 实例,并花一些时间使用界面来弄清楚您正在收集什么。性能调查通常更多地是为了了解您正在尝试做什么,而不是您实际获得的信息;它是为了确保您在问正确的问题。)

相关内容