terça-feira, 6 de dezembro de 2016

Java - Gerando threaddump e heapdump em um esgotamento de memória heap da JVM



   Quando forem provisionar algum ambiente de middleware, ou até mesmo para ambiente que apresenta esgotamento de memória heap, apliquem essa configuração abaixo na JVM para que ao ocorrer outofmemory na heap um threaddump e heapdump serão gerados: 


-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=12 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/jvmheap-`date +%Y%m%d%H%M%S`.hprof -XX:OnOutOfMemoryError="$JAVA_HOME/bin/jstack -F pid > /tmp/jvmthread-`date +%Y%m%d%H%M%S`.dmp"


IMPORTANTE: 

1 - O usuário que executará a JVM deve ser root(não faça isso), ou um usuário que não tenha determinadas limitações, exemplos de ajustes no limits.conf e su do pam.d: 

jboss soft nofile 131072
jboss hard nofile 131072
jboss soft nproc 131072
jboss hard nproc 131072
jboss soft core unlimited
jboss hard core unlimited
jboss soft memlock 50000000
jboss hard memlock 50000000

session    required   pam_limits.so

2 - O usuário de execução deve ter permissão de escrita nas pastas em que o heap e thread dump serão gerados; 

3 - A variável $JAVA_HOME deve existir ou ser instanciada antes da chamada da JAVA_OPTS.