Comment faire pour accélérer la machine virtuelle Java (JVM) temps de démarrage?
Je suis à l'exécution de tests démarrer plusieurs JVM processus. Résumé de l'heure de démarrage de la Jvm est tout à fait significative par rapport à l'heure de tests réels qui fonctionnent à l'intérieur de la JVM. Comment puis-je accélérer les choses?
J'ai utilisé "client" option déjà, cela ne l'aide pas, mais comme je le souhaitais. Est-il un autre moyen, disons préchargement des tas de machines virtuelles et de les réutiliser en quelque sorte?
Vous devez vous connecter pour publier un commentaire.
Si vous ne souhaitez réutiliser les machines virtuelles, le "quelque part" pourrait être Nailgun. Nailgun garde une JVM en cours d'exécution, puis utilise une lumière native client pour démarrer une classe en particulier et de la poignée de la console io. C'est bon pour le fonctionnement en ligne de commande Java utilitaires, mais comme il réutilise la même JVM peut accumuler l'état.
Pour travailler autour de l'état de l'accumulation, au prix d'exécuter plusieurs machines virtuelles, une autre option est Goutte à goutte. Goutte à goutte conserve une nouvelle JVM lancé dans la réserve avec le bon chemin de classe et d'autres options JVM de sorte que vous pouvez vous connecter rapidement et servir en cas de besoin, puis le jeter. Goutte à goutte hachages les options de la JVM, et stocke des informations sur la façon de se connecter à la JVM dans un répertoire avec la valeur de hachage comme son nom l'.
JVM de démarrage de la performance peut être améliorée de plusieurs façons: CD, straight up tuning, CPU épinglage et jlink (depuis JDK 9) peuvent être de bonnes options. AOT JDK (9, Linux uniquement) a certains angles, mais peut être réglé à l'aide de petites applications.
CD
Classe de Partage des Données a été développé pour le client VM de retour dans la version 1.5, mais a été beaucoup améliorée depuis de travailler sur toutes les variantes de zone (tous les GCs depuis 8), ce qui porte un coup de pouce important pour les performances de démarrage lorsqu'il est activé.
CD est toujours activée sur 32 bits JRE client installe, mais peut avoir besoin de certaines étapes manuelles pour être activé ailleurs:
java -Xshare:dump
pour générer un CD partagé archive-Xshare:auto
de votre commande pour vous assurer qu'il est utiliséAutres tuning
Tout
-client
peut ou ne peut pas faire quoi que ce soit (la JVM sur de nombreux systèmes n'a pas été livré avec un client VM - aucune depuis 9, en fait), il existe de nombreuses méthodes pour paramétrer un point d'accès de serveur de la JVM à se comporter plus comme un client VM:-XX:TieredStopAtLevel=1
-XX:CICompilerCount=1
-XX:+UseSerialGC
-Xmx512m
Cela devrait être suffisant pour booster de démarrage pour un petit court-application en cours d'exécution, mais peut avoir des effets très négatifs sur la performance de pointe. Bien sûr, vous pouvez obtenir encore plus par la désactivation des fonctionnalités que vous pourriez ne pas être en utilisant, comme
-XX:-UsePerfData
(désactive certaines informations d'exécution récupérable à l'aide de MXBeans et jvmstat).Avancé
jlink est un nouvel outil en Java 9 qui vous permet de personnaliser l'exécution d'images. Si votre application console utilise seulement un petit sous-ensemble de JDK modules, une coutume d'exécution peuvent être de très petite taille, ce qui peut améliorer le temps de démarrage plus loin. Un minimum d'image comprenant uniquement le java.module de base, et peut stimuler les temps de démarrage de ~10-20ms en fonction du matériel et d'autre de réglage:
$JAVA_HOME/bin/jlink --add-modules java.base --module-path $JAVA_HOME/jmods --output jbase
(Linux uniquement) Java 9 introduit un dispositif expérimental AOT compilateur,
jaotc
, qui peut être utilisé pour aider les applications de démarrage plus rapide et passent beaucoup moins de cycles de le faire. Out-of-the-box, il pourrait ralentir immédiate de démarrage (depuis le AOT aimerais code est une bibliothèque partagée qui ajoute ses propres I/O frais généraux, ne prend pas en charge la Série GC..), mais avec un réglage minutieux nous l'avons vu, de réduire les temps de démarrage de petites applications en 15 à 30%.CPU épingler: sur les gros systèmes, nous avons vu les effets qui découlent de cohérence de cache de la circulation entre les prises de courant, et la liaison à un seul PROCESSEUR nœud peut couper les temps de démarrage considérablement. Sur Linux quelque chose comme
numactl --cpunodebind=0 $JAVA_HOME/bin/java ...
devrait faire l'affaire.Dans l'ensemble, nous avons été en mesure d'obtenir minimale des applications à exécuter en aussi peu que 35ms (JDK 9 GA). Divers de démarrage des optimisations a disparu dans la JDK10 branche et je suis en train de voir chiffres aussi bas que 28ms.
Pourquoi ne pas charger tous les tests dans une JVM ? Pouvez-vous faire une ou plusieurs des situations suivantes ?
Class.forName()
?Si l'allocation de mémoire est importante, elle peut accélérer les choses en spécifiant la mémoire JVM de démarrage taille de la même figure que le maximum pouvant être affectés de la mémoire (
-Xms
vs-Xmx
), qui permettra de sauver la JVM d'avoir à revenir à l'OS pour plus de mémoire. Toutefois, dans ce scénario, je pense que c'est peu être le problème.À ajouter à ce qui a été dit par d'autres, la prochaine version de Java (
Java 7Java 8Java 9) devrait ajouter une nouvelle amélioration de la JVM temps de démarrage, en raison de la modularité de la plate-forme, selon ce lien.Citation:
Exécuter les tests avec Java 5 ou mieux. Le temps de démarrage a été réduit de manière significative pour Java 5.
Vous ne pouvez pas obtenir beaucoup plus rapide, à moins que vous pouvez réutiliser l'exécution d'un VM: Prestarting beaucoup d'entre eux et l'exécution d'un test unique dans chacun de ne pas faire vos tests plus rapidement.
Si vous avez besoin de trouver un moyen d'exécuter plusieurs tests dans une machine virtuelle.
Si c'est vraiment nécessaire pour vous de commencer un ordinateur virtuel distincte pour chaque test, votre meilleure option est probablement assurez-vous que vous utilisez l'un des plus récents VM communiqués de Soleil. Le temps de démarrage a diminué un peu plus les dernières versions de Java et avec 1.6.0_16, un simple "Hello world" programme prend environ 0,2 s pour fonctionner sur mon système.
Si votre question plutôt été ment être "comment faire pour exécuter plusieurs tests dans une machine virtuelle", l'approche la plus simple dépend de la structure de test que vous utilisez (si vous n'êtes pas l'utilisation d'un framework, vous devriez vraiment prendre en considération). Avec JUnit et, éventuellement, la cible ant pour JUnit, vous pouvez utiliser des modèles pour correspondre à l'tests que vous souhaitez exécuter ou, alternativement, d'inscrire dans les différentes classes de test dans une suite de test, qui peut ensuite être exécuté dans une machine virtuelle.