且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java应用程序CPU /负载较高时,对JDK8建

更新时间:2022-10-20 18:33:24

您所描述的症状,但我不认为这是不够下去,如果仅仅是因为这将是不可能的搜索之类的java 8个高CPU的任何地方(谷歌,java的错误巡游等),并找到有用的结果。不幸的是,你需要收集什么使用的CPU的详细信息。下面是关于如何做到这一点的一些想法:

  1. 资料有诸如VisualVM的一个工具。负载差异是极端的,所以你可能只能够是怎么使用的CPU被发现。
  2. 找到繁忙的线程。你可以拿一把线程快照和眼球,或者尝试一个工具,这样的 jvmtop 一>
  3. 检查一下垃圾收集器在做,无论是通过启用GC日志记录或如jstat工具。
  4. 使用strace追踪系统调用执行。

I have a Java application developed in Eclipse Luna in Windows that runs in Amazon EC2 (c3.large, Amazon Linux). This application processes work at a very consistent incoming rate. When I build the application against JDK 8u31, the EC2 CPU load is much higher than the same application built against JDK 7u75.

The application originally ran with the default JRE on EC2, and I added the OpenJDK 1.8.0.31 to take advantage of the Java 8 Process waitFor(long timeout, TimeUnit unit). The main work this application does involves invoking an application using 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

Example load average when the application is built against 1.7:

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

Example load average when the application is built against 1.8:

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

It seems like it may be related to the Open JDK 1.8.0.31, but I don't know how to debug this. There are no code changes, I'm only changing the compliance level and build between 1.7 and 1.8 in Eclipse Luna. Any idea why the load would be so much different?

UPDATE:

I see similar high CPU load when I use the Oracle JDK on EC2.

$ 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

Load average:

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

You've described symptoms, but I don't think this is enough to go on, if only because it will be impossible to search for things like "java 8 high CPU" anywhere (google, the java bug parade, etc.) and find useful results. Unfortunately, you need to collect more information about what's using CPU. Here are some thoughts on how to do so:

  1. Profile with a tool such as VisualVM. The load differences are extreme, so you might just be able to spot what's using the CPU.
  2. Find the busy threads. You can take a bunch of thread snapshots and eyeball it, or try a tool such a jvmtop.
  3. Check what the garbage collector is doing, either by enabling GC logging or with a tool such as jstat.
  4. Use strace to trace the execution of system calls.