昨天,在安装每日软件更新后,我发现一个 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
和 的Xorg
CPU 使用率均超过 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
分别为:java
、Xorg
和约为 20-22% compiz
。
答案1
由于您已将 VisualVM 作为分析器运行,它是适合此项工作的工具,因此其目的是收集足够的数据来找出热点所在的位置。
系统正在报告整个 Java 进程。分析工具是一种查看该进程内工作情况的方法(实际上,“进程”对于分析器来说毫无意义。它正在查看单个 JVM 实例中的多个线程和类加载器。)
由于您想要收集可用于向 OpenJDK 项目(或可能是游戏作者)报告的信息,因此您可能想要尝试“示例”功能。我们的想法是,我们需要随时间推移的活动快照,可能是多个快照,这样我们就可以从系统的角度看到在发现问题期间 JVM 的哪些部分最热。
这样我们就可以知道它是否是与游戏代码相关的方法,或者是 JVM 本身内的本机或非本机代码。
(我要补充一点,分析正在运行的应用程序有点像黑魔法。我的建议是确保您确实在查看您认为的 JVM 实例,并花一些时间使用界面来弄清楚您正在收集什么。性能调查通常更多地是为了了解您正在尝试做什么,而不是您实际获得的信息;它是为了确保您在问正确的问题。)