MacOS inclut /usr/libexec/java_home
pour configurer JAVA_HOME
:
export JAVA_HOME=$(/usr/libexec/java_home)
Une bonne introduction au concept d'Observability qui englobe Logging, Monitoring, Tracing et Visualization.
Plein de paramètres java intéressants pour limiter les resources utilisées par une JVM dans un container.
Always set the -Xmx
parameter when you run a JVM inside a container:
- if not specified, the JVM will try to use up to 1/4 of the total memory of the container host
- if you only specify container memory limits, docker will kill the JVM process if it tries to grow above the container limits
A partir de Java8, la Metaspace qui remplace la PermGen n'est plus dans la Heap Java mais dans la mémoire native de l'OS.
Par défaut le HeapDump ne fournit donc plus d'infos sur la Metaspace.
Solution:
jmap -clstats PID to dump class loader statistics;
jcmd PID GC.class_stats to print the detailed information about memory usage of each loaded class. The latter requires -XX:+UnlockDiagnosticVMOptions.
Pour analyser le contenu d'un thread dump
Pour générer un thread dump:
jstack -l <JVM_PID>
Ce guide explique le fonctionnement interne de la JVM et des différents Garbage Collectors et donne des piste de troubleshooting et de profiling avec VisualVM et autres outils d'analyse de dump.
Avec Java8, la PermGen est remplacée par la Metaspace.
Alors que l'espace occupé par la PermGen faisait partie de la Heap (memoire allouée à la JVM avec les parametres -Xms et -Xmx), la Metaspace fait partie de l'espace mémoire du process (en dehors de la Heap).
Avant de mettre en production, il faut limiter la taille max de la Metaspace avec -XX:MetaspaceSize.
Lors d'une migration depuis Java7, il peut être nécessaire de réduire la Heap comme la Metaspace sera en dehors de la Heap
Paramètres JVM pour loguer l'activité du Garbage Collector dans un fichier:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
Optimisation et Troubleshooting de JVM pour Java mises à jour pour Java8
Maven expliqué avec notamment la liste de plugins utiles pour gérer les différentes étapes du build aux tests d'intégration et au déploiement
Introduction au concept de repository Maven et au repository manager Nexus
Tous les raccourcis claviers pour l'IDE java IntelliJ
Un classement de tutos pour différents langages (ruby, python, ...) et outils (git, puppet, chef, aws ec2, ...)
Dans un contexte d'architecture microservices utilisant des containers et le concept ImmutableServer, l'utilisation d'un serveur d'application java (tomcat...) fournit uniquement le framework (servlets, ...) nécessaire à l'application java.
Les fonctionnalités de gestion des applications (plusieurs applis dans la même JVM, déploiement à chaud, ...) sont en effet directement gérées au niveau containers (1 applis = 1 JVM = 1 container, déploiement d'un nouveau container en cas de mise à jour de l'applis).
En fin d'article, il est également question de SpringBoot (http://projects.spring.io/spring-boot/) et CamelBoot (https://camel.apache.org/camel-boot) qui permettent de démarrer directement une JVM avec son framework sans toute la lourdeur du serveur d'application.
-
Pour activer les Heap Dump en cas de OOM:
dans catalina.sh:JAVA_OPTS='-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dir'
-
code servlet java qui créé un OOM pour tester la création du Heap Dump:
ArrayList<String> a = new ArrayList<String>(); while(true) { a.add("asdfasdjf;lasdkjfl;SJF;LAJFDL;ASJDFL;ASJDFL;AJSDFL;JSLFJSDL;FJS;LFJA;LSDKJ;ksdjflsjdf;lasjdlfkj"); }
Une liste des options de la JVM utiles en production
Ça permet d'aller un peu plus loin que le traditionnel -Xms/-Xmx pour dimensionner la Heap.