Comment puis-je désactiver Java garbage collector?


Nous avons une webapp PHP qui appelle un binaire java pour produire un rapport pdf (avec jasperreport), la sortie binaire java pdf à la sortie standard et se termine, le php envoie ensuite le pdf au navigateur. Cette commande java dure environ 3 à 6 secondes, je pense que quand elle dure 6 secondes, c'est parce que le GC entre en jeu, donc je voudrais le désactiver car de toute façon lorsque la commande se termine, toute la mémoire est renvoyée..

Je voudrais savoir comment désactiver Java 1.4.2 et pour Java 1.6.0 parce que nous sommes teste actuellement les deux JVM pour voir ce qui fonctionne plus rapidement..

Merci

Author: Nelson, 2010-05-28

8 answers

Il n'y a aucun moyen de désactiver complètement la récupération de place. La récupération de place n'est exécutée 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). Garbage collection ne prendra pas 3 secondes pour une JVM 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 comprendre ce qui prend beaucoup de temps.

 26
Author: Ceilingfish, 2011-06-22 22:12:29

On dirait que vous essayez de gagner du temps, mais que vous vous y prenez dans le mauvais sens. 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 pouvez envisager de lancer un processus Java que vous pouvez demander plusieurs fois pour effectuer le travail dont vous avez besoin si les performances d'exécution sont votre objectif.

 35
Author: Paul Jowett, 2010-05-28 08:03:56

GC n'intervient que lorsque la JVM manque de mémoire, donc vous êtes GC ou mourez. Essayez d'activer verbose GC et voyez si cela prend réellement beaucoup de temps.

java -verbose:gc
 26
Author: unbeli, 2010-05-28 07:53:41

Vous pouvez utiliser l'option -Xmx pour définir la taille maximale du tas; l'utilisation d'un tas plus grand devrait empêcher la machine virtuelle de manquer de mémoire et, par conséquent, de nécessiter une récupération de place si tôt.

 2
Author: Michael Aaron Safyan, 2010-05-28 07:59:32

Êtes-vous sûr que c'est la collecte des ordures qui cause le ralentissement? Avez-vous exécuté java avec-verbose:gc pour voir ce qui se passe?

Vous ne pouvez pas désactiver la récupération de place sur la JVM. Vous pouvez cependant regarder tuning le garbage collector pour de meilleures performances.

 1
Author: Mark, 2010-05-28 07:56:30

Java 11 est livré avec un no-op garbage collector.

Il peut être activé par l'option -XX:+UseEpsilonGC au démarrage de la JVM.

Selon la description 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 compter sur une sortie rapide pour libérer les ressources (par exemple, la mémoire de tas). Dans ce cas, accepter le cycle GC pour nettoyer inutilement le tas est un gaspillage de temps, parce que le tas serait libéré à la sortie de toute façon. 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.

 1
Author: aventurin, 2018-09-22 17:50:23

Comme tout le monde l'a dit, vous ne pouvez pas désactiver le GC dans la JVM, ce qui est logique, car si vous le pouviez, il y aurait des fuites de mémoire car java n'a pas de moyen explicite pour le développeur de supprimer les données du tas.

Avez-vous accès à la source de ce binaire java? Si c'est le cas, il pourrait être utile de l'analyser et de voir s'il existe des goulots d'étranglement qui pourraient être mieux écrits pour réduire l'activité du GC. Cela pourrait être fait avec la plupart des profileurs java, comme JProbe par exemple.

 0
Author: display101, 2010-05-28 08:23:15

Pour éviter que le garbage collector libère une variable ou une propriété de n'importe quel objet, vous devez définir cette propriété (publié par gc) comme statique dans votre classe c'était ma solution.

Exemple:

Chaîne statique privée myProperty;

 0
Author: Rodrigo Hernandez, 2016-08-15 07:41:58