2010-01-31 8 views
10

Sto tentando di fare in modo che Tomcat, che è attualmente in esecuzione come servizio su una casella di Windows 2003, esegua il dump dello stack su un OutOfMemoryError.Posso ottenere che Tomcat sia in esecuzione come servizio per eseguire il dump dell'heap?

(Tomcat è in esecuzione Hudson, che segnala un problema di spazio di heap alla fine della coda della mia generazione. L'esecuzione del costruire produce manualmente senza tale errore. I ragazzi Hudson hanno bisogno di un heap dump per iniziare.)

Come indicato altrove, ho detto ad Apache Service Monitor di configurare la JVM che usa per eseguire Tomcat per fare il dump quando si incontra uno OutOfMemoryError aggiungendo quanto segue alle opzioni JVM: -XX: + HeapDumpOnOutOfMemoryError Quindi eseguo la build ancora. Abbastanza sicuro, riporta che c'era un errore di heap. Esamino l'intero disco cercando il file predefinito java_pid123.hprof (dove ovviamente 123 viene sostituito dal PID della JVM). Nessun file .hprof esiste ovunque.

Sono impigliato in una presa 22: ho bisogno della discarica dell'heap per i ragazzi di Hudson per sistemare la perdita di memoria, ma non riesco a scaricare l'heap se eseguo Hudson sotto Tomcat.

C'è qualche modo speciale, quando Tomcat è in esecuzione come servizio Windows, per ottenere un dump dell'heap da esso su un OutOfMemoryError?

L'altra cosa che ho provato è di dirlo, nelle schede Avvio e Arresto, per utilizzare l'opzione "Java" anziché l'opzione "jvm". Credo che questo dovrebbe dire al Service Manager di tentare di avviare Tomcat con un comando eseguibile Java invece di avviare direttamente lo jvm.dll. Quando lo faccio, il servizio non verrà avviato.

Sicuramente qualcun altro ha avuto un problema simile?

+0

Devo dire che mi sono collegato a Tomcat con jconsole e ho osservato che l'utilizzo dell'heap non sale mai sopra i 60MB. –

risposta

5

Dopo aver finalmente mettere questo a letto, ho voluto rispondere a questa per gli altri che potrebbero avere lo stesso problema.

Innanzitutto, se si installa Tomcat su Windows, non utilizzare il programma di installazione .exe, anche se è promosso da Apache. Non ti consentirà di eseguire Tomcat come altro oltre all'account di sistema, indipendentemente da ciò che fai. Sembra che l'account di sistema non disponga dei privilegi per scrivere i file .hprof nella directory corrente, e nessuna modifica del tweaking della sicurezza di Windows sembra risolvere il problema.

OK, quindi hai installato Tomcat dalla distribuzione .zip. Installalo come servizio usando lo script service.bat. Assicurati che sia impostato per l'esecuzione come utente specifico creato appositamente per questo scopo. Assicurati inoltre che la cartella a cui Tomcat deve scrivere in caso di un dump dell'heap sia scrivibile da quell'utente.

Modificare il file service.bat per includere lo -XX:+HeapDumpOnOutOfMemoryError e le opzioni -XX:HeapDumpPath=C:\whatever nella posizione corretta (dove è possibile inserire le opzioni JVM). Questo dovrebbe fare il trucco.

0

I file .hprof vengono scaricati nella directory corrente. Esattamente quello che significa per un servizio di Windows è da indovinare, presumendo che significhi qualcosa.

Suggerisco di postare una nuova domanda (su http://superuser.com) chiedendo cosa significa "directory corrente" per un servizio Windows.

+0

La directory corrente, forse, ma nessun file .hprof è presente sulla macchina. –

+0

Quindi è possibile che i servizi Windows non abbiano la "directory corrente" e Windows stia scaricando il file nel vuoto. Il mio suggerimento per saperne di più sugli stand dei servizi Windows. – skaffman

+0

Il monitor di servizio dichiara che la directory corrente è C: \ Programmi \ Apache Tomcat \ Tomcat 6.0. Ho scritto un servlet che invia un file alla directory corrente e il file si presenta in quella directory. –

0

From 20 Tips for Using Tomcat in Production

Aggiungere il seguente ai vostri JAVA_OPTS in catalina.sh (o catalina.bat per Windows): - XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/j2ee/heapdumps

+0

Il problema, naturalmente, è che nessuno dei due script è invocato dal monitor del servizio. –

1

ho trovato il seguente link, che viene descritto come configurare il servizio tomcat (include l'impostazione dei parametri java). Non sono sicuro se si applica alla versione che stai utilizzando.

http://tomcat.apache.org/tomcat-5.5-doc/windows-service-howto.html

+0

Grazie; questo è davvero utile, ma avrei dovuto dire che sto utilizzando Tomcat 6. –

0

se è stato installato tomcat con .exe è possibile configurare il servizio tomcat per utilizzare account diverso dall'account di sistema locale ed è possibile assegnare tali diritti utente alla directory "c: \ qualunque" in cui si sta creando il file di dump. una cosa qui da ricordare è che il servizio Tomcat non funziona con account con privilegi amministrativi. quindi crea un utente semplice in windows (membro del gruppo utenti) e imposta i servizi tomcat per l'utente di questo account. e dare i diritti utente sulla directory "c: \ whatever". Questo risolve il problema dei diritti delle directory utente, ma devi configurare tomcat per gli errori di dump della memoria.

0

Quando il processo Java in esecuzione come servizio finestra è possibile generare il heapDump utilizzando i passaggi qui sotto,

  1. Eseguire il console dei comandi come amministratore
  2. versione del JDK (per il comando jmap) e JRE (ambiente app eseguire Java) dovrebbe essere lo stesso.
  3. ottenere il PID non di correre processo finestra per l'applicazione java da Task Manager
  4. Eseguire sotto comando

jmap -dump: file = d: \ heapDump \ myHeapDump.hprof -F #PID_No #

Se avuto alcuna eccezione con JDK/JRE 7 provare lo stesso con JDK/JRE 8 in realtà ho dovuto affrontare qualche problema in jmap con JDK 7, ma quando mi sono trasferito a JDK 8, fossi in grado di generare con successo il dump dell'heap usando lo stesso comando

Problemi correlati