针对JDK8构建时,Java应用程序CPU /负载要高得多

时间:2015-02-22 00:25:46

标签: java eclipse amazon-ec2 java-8

我在Windows中的Eclipse Luna中开发了一个Java应用程序,该应用程序在Amazon EC2(c3.large,Amazon Linux)中运行。此应用程序处理以非常一致的传入速率工作。当我针对JDK 8u31构建应用程序时,EC2 CPU负载远高于针对JDK 7u75构建的相同应用程序。

应用程序最初使用EC2上的默认JRE运行,我添加了OpenJDK 1.8.0.31以利用Java 8 Process waitFor(长超时,TimeUnit单元)。此应用程序的主要工作涉及使用Runtime.exec调用应用程序。

$ sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*  1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
 + 2           /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-2.b13.5.amzn1.x86_64/jre/bin/java

针对1.7构建应用程序时的平均负载平均值:

top - 00:20:28 up 4 days, 10:41,  4 users,  load average: 0.37, 0.26, 0.52

针对1.8构建应用程序时的平均负载平均值:

top - 23:45:52 up 4 days, 10:06,  4 users,  load average: 2.28, 2.60, 2.01

好像它可能与Open JDK 1.8.0.31有关,但我不知道如何调试它。没有代码更改,我只是在Eclipse Luna中更改合规性级别并在1.7和1.8之间构建。知道为什么负载会如此不同?

更新:

当我在EC2上使用Oracle JDK时,我看到类似的高CPU负载。

$ sudo alternatives --config java

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-2.b13.5.amzn1.x86_64/jre/bin/java
*+ 3           /usr/java/jdk1.8.0_31/bin/java

负载平均值:

top - 01:45:27 up 4 days, 12:06,  4 users,  load average: 2.28, 1.50, 1.04

2 个答案:

答案 0 :(得分:3)

你已经描述了症状,但我认为这还不够,只是因为无法搜索像#8; java 8 high CPU"任何地方(谷歌,java bug游行等),并找到有用的结果。不幸的是,您需要收集有关使用CPU的更多信息。以下是有关如何操作的一些想法:

  1. 使用VisualVM等工具配置文件。负载差异极大,因此您可能只能发现使用CPU的内容。
  2. 找到忙线程。您可以拍摄一堆线程快照并进行观察,或尝试jvmtop这样的工具。
  3. 通过启用GC日志记录或使用jstat等工具检查垃圾收集器正在执行的操作。
  4. 使用strace跟踪系统调用的执行情况。

答案 1 :(得分:1)

文档说:"此方法的默认实现轮询exitValue以检查进程是否已终止。强烈建议使用此类的具体实现,以更有效的实现来覆盖此方法。"

我强烈怀疑这是原因。

请参阅http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#waitFor--