Domanda

Ho un processo critico in esecuzione in Java (1.6), con un gancio di arresto registrato. In qualche caso dove ho un problema OOM (maggiori dettagli qui sotto sulla questione), il processo si interrompe improvvisamente, non ottengo nessuna delle mie tronchi, il mio fermo (Throable x) non sta recuperando l'eccezione.

Ma le opere gancio di arresto. Quindi, se ci fosse un modo per sapere che il processo sta per spegnimento a causa di qualche brutta OOM, potrei accedo informazioni necessarie prima di uscire.

C'è un modo per fare questo?

Chi l'OOM : Non so che cosa è l'eccezione, perché, come ho detto che non rimanga impigliato. So che è un OOM perché comincio il processo con

-XX:+HeapDumpOnOutOfMemoryError

e ottengo un file di dump heap. In altri casi catturata un'eccezione, ed è un ava.lang.OutOfMemoryError: limite GC testa superato. Ma non sono sicuro che è sempre questo caso.

Modifica

Nel caso in cui non è chiaro: non sto cercando di impedire l'OOM come può accadere per validi motivi, in un certo scenario, voglio solo per assicurarsi che sia chiaro nei file di log app

La mia domanda è :? È possibile scoprire processo si sta spegnendo a causa di un OOM mentre nel gancio di arresto

Ho bisogno di fare questo programatically e dallo stesso processo .

Per ora l'approccio migliore è vedere se esiste un file di heap dump java_pid_pid di process_.hprof (so che il PID) con data recente e dedurre c'era un OOM. Credo che avrei potuto provare Runtime.getRuntime (). FreeMemory () e segnalare il problema se la memoria disponibile è molto bassa, ma non sapete come attendibile è che, forse quando il processo si sta spegnendo lo ha già rilasciato quantità di memoria, l'approccio sopra è meglio credo.

È stato utile?

Soluzione

Ooms sono ingannevoli perché se JVM è esaurito la memoria potrebbe non correre il codice di gestione eccezioni a causa di una nuova OOM essere gettato.

Prova a impostare default non rilevata gestore di eccezioni . Sarà catturare tutte le eccezioni non gestite fanno.

Altri suggerimenti

È probabilmente può eseguire un altro processe quel monitor il file di registro per OOE (o il monitor se il processo viene ucciso) e quindi riavviare il processo.

Forse mettere la vostra applicazione come demone Unix o servizio Windows sarà più appropriato.

Ma, che dire indagando la perdita di memoria con profilatura strumenti, invece?

jvisualvm è una buona

Si potrebbe voler esaminare la -XX:OnOutOfMemoryError="cmd_with_pid_arg %p" opzione (la stringa di comando è simile a -XX:OnError ).

Utilizza strumenti di monitoraggio come jvisualvm o jconsole .

possono (tecnicamente) OutOfMemoryErrors di cattura, ma non è sicuro che sarete in grado di eseguire il codice nel blocco catch, se non c'è memoria di sinistra.

Forse vale la pena di provare a (1) prendere l'OOM, garbage collection (2) grilletto (System.gc()) e cercare di scrivere qualcosa per accedere o console. Nessuna garanzia ma non rompere nulla.

Si dovrebbe risolvere il problema, piuttosto che tentativo di compensare per esso.

L'heap dump vi mostrerà i tipi di oggetti che consumano la maggior parte della memoria. Dovreste essere in grado di capire dove questi oggetti sono allocati, o perché sono rimasto dopo che devono essere eliminati.

Per quanto riguarda l'errore specifico che si sta ricevendo, date un'occhiata a questa domanda SO: java.lang.OutOfMemoryError Errore: GC limite in testa superato - sembra che la soluzione più semplice è quello di aumentare la dimensione heap

.

Anche in questo caso, utilizzando jvisualvm (JDK 6, nella cartella bin) come suggeste da altri o altri strumenti di profilazione è il modo migliore per risolvere il problema, piuttosto che gestirlo, ma assumendo si separatamente indagare sulle cause OOM, e cercare di sradicarle, vorrei prendere in considerazione nel seguente modo POC, (vedi anche Alois risposta)

Come su esecuzione di un processo Java che vi avvolgerà la chiamata del processo OOM lancio?

È possibile prendere qualunque risultato che viene inviato al flusso di output del processo chiamato, e vedere se c'è un codice di uscita coerente / traccia dello stack è possibile utilizzare per identificare Ooms

Sono sicuro che ci sono più si avvicina, ma questo mi sembra un buon punto di partenza programmatico

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top