Perché Java consuma il 100% della CPU sulla mia macchina?

4

Ho un iMac (inizio 2010) che esegue 10.7.2 ma il problema è stato visto anche su 10.6.x. Il sintomo è semplice, uno dei miei 2 core è al 100% di utilizzo con il processo Java responsabile dell'uso eccessivo.

Che cosa ho fatto per risolvere il problema?

  • Riavvia : il processo java si riavvia semplicemente e viene visualizzata la stessa condizione.
  • Elimina il processo Java - Come con un riavvio.
  • Disinstalla e reinstalla Java - Subito dopo l'installazione di Java, la CPU torna al 100%.
  • Usando ps "process id" Posso vedere che sta lanciando spawn il processo e che il comando utilizzato per avviare il processo è :

    java -Djava.awt.headless=true -jar /tmp/ics29586
    
  • Il file ics29586 è un file binario da 11mb.

  • Eliminato il file ics29586 - Il file viene ricreato al successivo riavvio del processo e viene visualizzata la stessa condizione
  • Creato un nuovo account utente, riavviato e connesso come nuovo utente - La stessa condizione è visibile.
  • Riprodotto con le impostazioni Java e riavviato il processo dopo ogni modifica - Stessa condizione vista
  • Completa ricostruzione della macchina - Subito dopo l'installazione di Java, la CPU torna al 100%.

Quindi, qualcuno ha ricevuto la risposta per ciò che sta causando e come risolverlo o qualche consiglio su come risolvere ulteriormente il problema?

In risposta ad alcuni dei commenti che richiedono maggiori informazioni:

  • Non eseguo crashplan.
  • Non riuscivo a capire come ottenere Activity Monitor per mostrarmi i file aperti, ma googling suggerito LSOF era una buona partita per quello che volevi sapere. Non ha mostrato file aperti:

    Deep-Desk:LaunchAgents photo$ sudo lsof -c java
    Deep-Desk:LaunchAgents photo$ 
    
  • Al momento sono disponibili 220 porte per il processo Java

  • L'unico file di interesse nelle cartelle LaunchDaemons o LaunchAgents è:

    -rw-r--r--   1 root  wheel   568B 10 Mar  2011 com.microsoft.office.licensing.helper.plist     
    
  • Tutto il resto è com.apple o ha una data dopo che il problema si è manifestato per la prima volta. Per mezzo di un test ho rinominato il file com.microsoft su old.com.microsoft ma non ha fatto alcuna differenza. Ho anche spostato il file completamente fuori dalla directory LaunchDaemon e questo non ha fatto alcuna differenza, il processo si respawn, non funziona molto per pochi minuti, quindi perde il controllo e consuma tutta la CPU su 1 core.

posta Slyinthefield 06.01.2012 - 15:36
fonte

3 risposte

2

Capito. Dopo l'aiuto di due amici, posso dire quanto segue.

  • in / etc / crontab c'era una voce:

    */5 * * * * root /usr/bin/adjkerntz
    

    -in / usr / bin c'era un programma chiamato adjkerntz. Credo che questo sia un vero nome per un binario valido in alcune implementazioni unix / linux, ma non OSX. Ha anche permessi diversi per ogni altro eseguibile in / us / bin:

    -rwxr-xr-x    1 root   wheel     74688 18 Sep 00:26 addftinfo
    -rwx------    1 root   wheel   2841604 18 Sep 20:49 adjkerntz
    -rwxr-xr-x    1 root   wheel    223312 18 Sep 00:26 afconvert
    
  • Ho cancellato la voce cron e ho ucciso il processo java e hey presto nessun altro problema.

  • Ho anche eliminato adjkerntz e su suggerimento dei miei amici eccellenti, ho fatto quanto segue per assicurarmi che non si ripresenti:

    sh-3.2# touch adjkerntz
    sh-3.2# chflags schg adjkerntz
    
  • Ciò rende il file immutabile e anche root non può modificare quel file.

Questo lascia la domanda su come questo sia arrivato in primo luogo, ma immagino che Internet possa essere un posto pericoloso. Grazie a tutti coloro che hanno contribuito con il loro tempo ad aiutarmi ad andare fino in fondo.

    
risposta data 07.01.2012 - 23:52
fonte
4

Non lo so neanche io, ma ecco come scoprirne di più

In caso di file binari completamente sconosciuti, stringhe (1) è spesso utile per ottenere un suggerimento su cosa potrebbe essere il file

strings /tmp/ics29586 | less

Dai un'occhiata all'output e verifica se è familiare.

In caso contrario, trova il lavoro di avvio da cui viene avviato:

launchctl list|awk '{id=$3; print "### " id; system("launchctl list " id)}'|awk '/^###/ {id=$2} /.*ics29586.*/ {print id}'

Questo dovrebbe generare uno o più tag di lavoro nella forma di (ad esempio) com.apple.scrod (e alcuni errori, che puoi ignorare).

Una volta ottenuti i tag del processo, ottenere la configurazione di launchd per un processo eseguendo:

launchctl list com.apple.scrod    # insert your tag instead

Questo (e il tag stesso, che spesso contiene un nome di dominio internet nella notazione inversa) dovrebbe darti qualche informazione in più su cosa sia questo processo. Sentiti libero di postarlo qui se hai bisogno di ulteriore aiuto.

Aggiornamento: Ho dimenticato di dirlo, ma dato che si tratta di un file jar, puoi copiarlo da qualche parte e decomprimerlo (i file jar sono in realtà solo file zip) e dare un'occhiata a quale tipo di Java le classi sono lì dentro.

    
risposta data 06.01.2012 - 20:29
fonte
3

Se cadi nel terminale, puoi digitare ps -ef | grep java

Vedrai tutti i processi con "java" nelle loro descrizioni e dettagli sul processo che ha lanciato ciascuno di essi.

Nel mio caso, CrashPlan sta eseguendo un ripristino e l'app client è basata su Java. Vedo:

0    85     1   0 10:35PM ??        98:28.26 /usr/bin/java -Dapp=**CrashPlanService** -Xmn10m -Xms15m -Xmx512m -DappBaseName=**CrashPlan** -Djava.awt.headless=true -...

Una volta che sai chi lo sta usando, puoi decidere se è qualcosa che vuoi rimuovere o meno ...

    
risposta data 28.12.2012 - 15:04
fonte

Leggi altre domande sui tag