44 votes

Comment accélérer le temps de démarrage de la Java VM (JVM) ?

J'exécute des tests qui lancent plusieurs processus JVM. Le temps de démarrage sommaire des JVM est assez important par rapport au temps des tests réels qui s'exécutent dans la JVM. Comment puis-je accélérer les choses ?

J'ai déjà utilisé l'option "-client", cela aide mais pas autant que je le voulais. Existe-t-il un autre moyen, par exemple en préchargeant un ensemble de JVM et en les réutilisant d'une manière ou d'une autre ?

38voto

Pete Kirkham Points 32484

Si vous voulez réutiliser les JVM, le "quelque part" pourrait être Pistolet à clous . Nailgun fait tourner une JVM, puis utilise un client natif léger pour lancer une classe particulière et gérer l'entrée/sortie de la console. C'est une bonne solution pour exécuter de petits utilitaires Java en ligne de commande, mais comme elle réutilise la même JVM, elle peut accumuler de l'état.

Pour contourner l'accumulation d'états, au prix de l'exécution de plusieurs JVM, une autre option consiste à Goutte à goutte . Drip garde une JVM fraîche en réserve avec le bon classpath et d'autres options de JVM afin que vous puissiez vous connecter rapidement et l'utiliser en cas de besoin, puis la jeter. Drip hash les options de la JVM et stocke les informations sur la façon de se connecter à la JVM dans un répertoire dont le nom est la valeur de hash.

0 votes

Nailgun est en effet uber-awesome.

0 votes

@Pete Nailgun est incroyable mais il n'est pas sécurisé !

2voto

Brian Agnew Points 143181

Pourquoi ne pas charger tous les tests dans une seule JVM ? Pouvez-vous faire une ou plusieurs des choses suivantes ?

  1. charger tous les tests via une classe de niveau supérieur ?
  2. spécifier les classes de test dans une liste (fichier de configuration) et charger chacune d'entre elles en séquence via Class.forName() ?
  3. si l'isolation est importante, vous pouvez créer un chargeur de classe différent pour chaque test.

Si l'allocation de mémoire est importante, on peut accélérer les choses en spécifiant la taille de démarrage de la mémoire de la JVM au même chiffre que la mémoire maximale allouable ( -Xms vs -Xmx ), ce qui évitera à la JVM de devoir retourner au système d'exploitation pour obtenir plus de mémoire. Cependant, dans ce scénario, je pense qu'il est peu probable que ce soit le problème.

2voto

Cyrille Ka Points 8845

Pour ajouter à ce qui a été dit par d'autres, la prochaine version de Java ( Java 7 Java 8 Java 9) devrait apporter une nouvelle amélioration des temps de démarrage des JVM, en raison de la modularisation de la plate-forme, selon ce lien .

Citation :

L'un des avantages de la modularisation est que la plateforme est un téléchargement plus petit, ce qui peut améliorer les performances performances au démarrage. La réduction de l'empreinte mémoire mémoire permet également d'importantes performances, en particulier pour les pour les applications de bureau.

5 votes

Apparemment, cela a été reporté jusqu'au JDK 8 (source : openjdk.java.net/projets/jdk7/caractéristiques )

2 votes

J'aimerais vraiment que le projet Coin ou ce qu'ils utilisent pour modulariser les bibliothèques de base ne soit pas toujours repoussé. J'aimerais voir la réduction du code des bibliothèques de base en abandonnant l'énumération et autres faux départs.

1 votes

Après "un certain" temps, il arrive enfin à Java 9 :D

1voto

Aaron Digulla Points 143830

Exécutez 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 aller beaucoup plus vite si vous ne pouvez pas réutiliser une VM en cours d'exécution : Redémarrer un grand nombre de machines virtuelles et exécuter un seul test dans chacune d'elles ne rendra pas vos tests plus rapides.

Vous devez donc trouver un moyen d'exécuter plusieurs tests dans une seule VM.

0voto

jarnbjo Points 18238

S'il est vraiment nécessaire de démarrer une VM séparée pour chaque test, la meilleure option est probablement de s'assurer que vous utilisez l'une des plus récentes versions de VM de Sun. Le temps de démarrage a considérablement diminué au cours des dernières versions de Java et avec la version 1.6.0_16, un simple programme "Hello world" prend environ 0,2s pour s'exécuter sur mon système.

Si votre question était plutôt "comment exécuter plus de tests dans une VM", l'approche la plus simple dépend du framework de test que vous utilisez (si vous n'utilisez pas de framework, vous devriez vraiment y penser). Avec JUnit et éventuellement la cible ant pour JUnit, vous pouvez soit utiliser des modèles pour faire correspondre les tests que vous voulez exécuter, soit joindre différentes classes de test dans une suite de tests, qui peut ensuite être exécutée dans une seule VM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X