我有一个Java应用程序,在Windows的Eclipse Luna中开发,在Amazon EC2(c3.large,Amazon Linux)上运行。该应用程序以非常一致的速率处理工作。当我使用JDK 8u31构建应用程序时,EC2的CPU负载比相同应用程序使用JDK 7u75构建时更高。
该应用程序最初在EC2上运行默认的JRE,并添加了OpenJDK 1.8.0.31,以利用Java 8 Process waitFor(long timeout,TimeUnit unit)。此应用程序主要工作涉及调用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