Come posso esportare un file di dump heap Java in un bucket S3?
Ho ricevuto un errore "heap out of memory" nella mia applicazione Java archiviata in Amazon Elastic Container Service (Amazon ECS). Per risolvere l'errore, desidero creare un file .hprof e salvarlo in un bucket Amazon Simple Storage Service (Amazon S3).
Breve descrizione
Il motivo più comune per cui si riceve un'eccezione OutOfMemoryError è perché una Java Virtual Machine (JVM) non è in grado di allocare memoria sufficiente a un heap. Quando un'applicazione Java viene eseguita in un container ECS, un errore "heap out of memory" interrompe l'applicazione e arresta le attività ECS. Tutti i file .hprof salvati dall'applicazione non sono più disponibili. Per risolvere l'errore di eccezione e i problemi di allocazione della memoria, devi creare un file .hprof e salvarlo in un bucket S3.
Risoluzione
Nota: la seguente risoluzione risolve il problema nella maggior parte dei casi in cui si verifica un'eccezione OutOfMemoryError. Per ulteriori informazioni sulla causa degli errori di memoria Java, consulta Understand the OutOfMemoryError exception (Significato dell'eccezione OutOfMemoryError) sul sito web Oracle.
Crea un bucket S3
Utilizza la console Amazon S3 per creare un bucket S3 in cui archiviare il file .hprof.
Crea una definizione dell'attività ECS
Utilizza la console Amazon ECS per creare una definizione dell'attività come modello per l'applicazione Java.
Per la variabile di ambiente, fornisci il nome del bucket S3. I comandi di inizializzazione dell'applicazione utilizzano anche il nome del bucket S3.
Nota: negli esempi di comandi la variabile di ambiente è HEAP_DUMP_BUCKET.
Crea un ruolo IAM per l'attività ECS
Crea un ruolo dell'attività ECS AWS Identity and Access Management (AWS IAM) che includa le autorizzazioni s3:PutObject in modo da poter caricare i file.
Esegui i comandi di inizializzazione
Nella directory di lavoro JVM, viene creato un heap dump predefinito in un file denominato java_pidpid.hprof. Per specificare un altro nome di file o directory, utilizza l'opzione XX:HeapDumpPath= .
Nei seguenti esempi di comandi di inizializzazione l'heap dump viene generato nella directory /tmp/heap_dump.hprof:
CMD ["java", \ "-XX:+HeapDumpOnOutOfMemoryError", \ "-XX:HeapDumpPath=/tmp/heap_dump.hprof", \ "-XX:OnOutOfMemoryError=yum install -y aws-cli > /dev/null && aws s3 mv /tmp/heap_dump.hprof s3://$HEAP_DUMP_BUCKET/'date+%F_%T'.hprof ; kill -9 %p", \ "MemoryApp" \]
Esempio di flusso di comandi di inizializzazione
Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta la sezione Troubleshoot AWS CLI errors. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
L'opzione OnOutOfMemoryError specifica un comando o uno script da eseguire quando ricevi un'eccezione OutofMemoryError. Per ulteriori informazioni sull'opzione OnOutOfMemoryError, consulta Java HotSpot VM command-line options (Opzioni della riga di comando della VM Java HotSpot) sul sito web Oracle.
Completa i seguenti passaggi per il flusso di comandi OnOutOfMemoryError:
- Installa l'Interfaccia della linea di comando AWS (AWS CLI) all'interno di -y senza alcuna interazione. L'output del comando viene salvato in un file temporaneo in /dev/null in modo che le informazioni non necessarie sull'installazione di AWS CLI non vengano aggiunte ai log del container.
- Carica il file .hprof nel bucket S3 con le autorizzazioni del ruolo dell'attività ECS. Il file .hprof viene rinominato in modo da seguire lo schema date+%F_%T.hprof.
- Esamina i dati di log di Amazon CloudWatch:
2023-05-02T17:02:37.748+01:00 Hello, world! Hello Java! Good bye memory... 2023-05-02T17:02:37.748+01:00 Going to sleep for 2 ms... 2023-05-02T17:02:39.748+01:00 Wake now, lets heap the memory... 2023-05-02T17:02:39.748+01:00 java.lang.OutOfMemoryError: Requested array size exceeds VM limit 2023-05-02T17:02:39.748+01:00 Dumping heap to /tmp/heap_dump.hprof ... 2023-05-02T17:02:39.756+01:00 Heap dump file created [2893599 bytes in 0.008 secs] 2023-05-02T17:02:39.756+01:00 # 2023-05-02T17:02:39.757+01:00 # java.lang.OutOfMemoryError: Requested array size exceeds VM limit 2023-05-02T17:02:39.757+01:00 # -XX:OnOutOfMemoryError="yum install -y aws-cli > /dev/null && aws s3 mv /tmp/heap_dump.hprof s3://$HEAP_DUMP_BUCKET/`date +%F_%T`.hprof ; kill -9 %p" 2023-05-02T17:02:39.757+01:00 # Executing /bin/sh -c "yum install -y aws-cli > /dev/null && aws s3 mv /tmp/heap_dump.hprof s3://$HEAP_DUMP_BUCKET/`date +%F_%T`.hprof "... 2023-05-02T17:02:54.663+01:00 Completed 256.0 KiB/2.8 MiB (2.2 MiB/s) with 1 file(s) remaining Completed 512.0 KiB/2.8 MiB (4.4 MiB/s) with 1 file(s) remaining Completed 768.0 KiB/2.8 MiB (6.6 MiB/s) with 1 file(s) remaining Completed 1.0 MiB/2.8 MiB (8.7 MiB/s) with 1 file(s) remaining Completed 1.2 MiB/2.8 MiB (10.8 MiB/s) with 1 file(s) remaining Completed 1.5 MiB/2.8 MiB (12.9 MiB/s) with 1 file(s) remaining Completed 1.8 MiB/2.8 MiB (15.0 MiB/s) with 1 file(s) remaining Completed 2.0 MiB/2.8 MiB (17.0 MiB/s) with 1 file(s) remaining Completed 2.2 MiB/2.8 MiB (19.1 MiB/s) with 1 file(s) remaining Completed 2.5 MiB/2.8 MiB (21.1 MiB/s) with 1 file(s) remaining Completed 2.8 MiB/2.8 MiB (23.1 MiB/s) with 1 file(s) remaining Completed 2.8 MiB/2.8 MiB (13.0 MiB/s) with 1 file(s) remaining move: ../tmp/heap_dump.hprof to s3://fargate-test-cluster-logs/2023-05-02_16:02:53.hprof 2023-05-02T17:02:54.705+01:00 Executing /bin/sh -c "kill -9 1"... 2023-05-02T17:02:54.707+01:00 Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit 2023-05-02T17:02:54.707+01:00 at MemoryApp.main(MemoryApp.java:13)
Il precedente esempio di dati di log utilizza yum install per AWS CLI in un container che esegue l'immagine Amazon Corretto 17. Se l'immagine del container è basata su un sistema operativo diverso, il comando cambia. Di seguito sono riportati alcuni esempi di comandi per diversi sistemi operativi:
- Fedora Linux: dnf install -y awscli
- Debian: apt-get install -y awscli
- Alpine Linux: apk add aws-cli
Nota: con qualunque sistema operativo, devi utilizzare un comando equivalente al comando yum install che installa AWS CLI fornito a titolo di esempio.
- Argomenti
- ContainersStorageJava Development
- Lingua
- Italiano
