2015-02-22 10 views
8

Ho un'applicazione Java sviluppata in Eclipse Luna in Windows che gira in Amazon EC2 (c3.large, Amazon Linux). Questi processi applicativi funzionano con una frequenza in entrata molto consistente. Quando costruisco l'applicazione su JDK 8u31, il carico della CPU EC2 è molto più alto rispetto alla stessa applicazione costruita con JDK 7u75.CPU dell'applicazione Java/carico molto più elevato se costruito contro JDK8

L'applicazione originariamente funzionava con il JRE predefinito su EC2 e ho aggiunto OpenJDK 1.8.0.31 per sfruttare il waitFor di Java 8 Process (timeout lungo, unità TimeUnit). Il lavoro principale di questa applicazione consiste nel richiamo di un'applicazione utilizzando 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 

Esempio carico medio quando l'applicazione è costruita contro 1,7:

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

Esempio carico medio quando l'applicazione è costruita contro 1,8:

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

Sembra che può essere correlata all'Open JDK 1.8.0.31, ma non so come eseguire il debug di questo. Non ci sono modifiche al codice, sto solo cambiando il livello di conformità e costruisco tra 1.7 e 1.8 in Eclipse Luna. Qualche idea sul perché il carico sarebbe così diverso?

UPDATE:

vedo simile elevato carico della CPU quando uso l'Oracle JDK su 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 

carico medio:

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

È possibile riprodurre questo sul proprio computer? – fge

+0

L'ho visto su più istanze EC2 (entrambi OpenJDK). Non riesco a generare il carico di lavoro sul mio computer locale, ma cercherò metodi per simulare il lavoro. – DanielB6

+0

Per discriminare gli effetti del compilatore vs.jre: cosa succede se compili alla conformità 1.7 ed esegui il 1.8 jre? –

risposta

1

La documentazione dice: "L'implementazione predefinita di questo metodi sondaggi l'exitValue per verificare se il processo è terminato implementazioni concrete di questa classe sono fortemente incoraggiati a ignorare questo. metodo con un'implementazione più efficiente. "

Ho il forte sospetto che questa sia la ragione.

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

+0

Penso che sia possibile per il caso in cui viene utilizzato process.waitFor (30, TimeUnit.SECONDS). Non spiega il caso in cui non vi è alcuna modifica del codice, stesso process.waitFor() è utilizzato in 1.7 e 1.8. – DanielB6

+1

Esatto, l'ho perso nel commento. Forse l'implementazione waitFor() è difettosa in 1.8 e chiama la versione con timeout? Questo sembra un caso per una noiosa riduzione ad un esempio minimo ... –

3

Hai descritto i sintomi, ma non credo che questo è sufficiente per andare avanti, se non altro perché sarà impossibile per cercare le cose come "Java 8 elevato della CPU" da nessuna parte (Google , la parodia di java bug, ecc.) e trova risultati utili. Sfortunatamente, è necessario raccogliere ulteriori informazioni su cosa sta utilizzando la CPU. Ecco alcuni pensieri su come farlo:

  1. Profilo con uno strumento come VisualVM. Le differenze di carico sono estreme, quindi potresti essere in grado di individuare cosa sta utilizzando la CPU.
  2. Trova i thread occupati. Puoi scattare una serie di istantanee di thread e ingrandirle, oppure provare uno strumento come jvmtop.
  3. Controllare cosa sta facendo il garbage collector abilitando la registrazione GC o con uno strumento come jstat.
  4. Utilizzare strace per tracciare l'esecuzione delle chiamate di sistema.
+0

Grazie per queste informazioni, guarderò questi strumenti e pubblicheremo i risultati che raccolgo. – DanielB6

Problemi correlati