Nous avons une application Web PHP qui appelle un binaire Java pour produire un rapport PDF (avec JasperReports). Le binaire Java sort le PDF en sortie standard et quitte; le PHP envoie ensuite le PDF au navigateur. Cette commande Java dure environ 3 à 6 secondes, et je pense que lorsqu'elle dure 6 secondes, c'est parce que le GC entre en jeu. Je voudrais désactiver le GC parce que de toute façon, lorsque la commande se termine, toute la mémoire est retournée.
Je voudrais savoir comment le désactiver pour Java 1.4.2 et pour Java 1.6.0 car nous testons actuellement les deux JVM pour voir laquelle fonctionne plus rapidement ..
Il n'y a aucun moyen de désactiver complètement la récupération de place. Le garbage collection n'est exécuté que lorsque la JVM manque d'espace, vous pouvez donc donner plus de mémoire au programme. Ajoutez ces options de ligne de commande à la commande Java
-Xmx256M -Xms256M
Cela donne au programme 256 Mo de RAM (la valeur par défaut est 64 Mo). Le nettoyage de la mémoire ne prendra cependant pas 3 secondes pour une machine virtuelle Java de taille par défaut, donc vous voudrez peut-être étudier de plus près ce que fait le programme. Yourkit profiler est très utile pour déterminer ce qui prend du temps.
On dirait que vous essayez de gagner du temps, mais que vous vous y trompez. Le temps économisé dans la désactivation de la récupération de place serait trivial (pour une seule tâche) par rapport au temps nécessaire pour lancer et arrêter le processus Java. Vous voudrez peut-être envisager d'avoir un Java que vous pouvez demander plusieurs fois pour effectuer le travail dont vous avez besoin si les performances d'exécution sont votre objectif.
GC ne se déclenche que lorsque JVM manque de mémoire, vous êtes donc GC ou mourez. Essayez d'activer GC détaillé et voyez si cela prend réellement beaucoup de temps.
Java -verbose:gc
Java 11 est livré avec un garbage collector no-op .
Il peut être activé par le -XX:+UseEpsilonGC
option au démarrage de la JVM.
Selon le description du JEP l'un de ses objectifs est de rendre certains emplois de courte durée plus efficaces, quel pourrait être votre cas d'utilisation:
Emplois de très courte durée. Un travail de courte durée peut nécessiter une sortie rapide pour libérer les ressources (par exemple, la mémoire de tas). Dans ce cas, accepter le cycle GC pour nettoyer vainement le tas est une perte de temps, car le tas serait de toute façon libéré à la sortie. Notez que le cycle GC peut prendre un certain temps, car cela dépend de la quantité de données en direct dans le tas, ce qui peut être beaucoup.
Vous pouvez utiliser le -Xmx
option pour définir la taille maximale du tas; l'utilisation d'un segment plus grand devrait empêcher le VM de manquer de mémoire et, par conséquent, d'exiger le ramasse-miettes si tôt.
Êtes-vous sûr que c'est le garbage collection qui provoque le ralentissement? Avez-vous exécuté Java avec -verbose: gc pour voir ce qui se passe?
Vous ne pouvez pas désactiver le garbage collection sur la JVM. Vous pouvez cependant regarder tuning le garbage collector pour de meilleures performances.