La machine virtuelle Java peut-elle assurer la persistance des instantanés?

StackOverflow https://stackoverflow.com/questions/611134

  •  03-07-2019
  •  | 
  •  

Question

Est-il possible de vider une image d'une machine virtuelle Java en cours d'exécution et de restaurer ultérieurement l'état précédent en chargeant l'image dans la machine virtuelle Java? Je suis presque certain que la réponse est négative, mais j'aimerais avoir tort.

Avec tous les langages dynamiques disponibles pour la machine virtuelle Java, l'interactivité augmente, pouvoir enregistrer une session de codage permettrait de gagner du temps en restaurant manuellement la machine virtuelle dans une session précédente.

Était-ce utile?

La solution

Un JSR 323 a été proposé à cet effet il y a quelque temps, mais il a été rejeté . . Vous pouvez trouver des liens dans ces articles sur la recherche et sur ce que cela prendrait. Elle a surtout été rejetée en tant qu’idée trop immature.

J'ai entendu parler d'au moins une startup (qui ne me rappelle malheureusement pas son nom) travaillait sur une technologie de virtualisation utilisant un hyperviseur (probablement Xen) qui était sur le point de pouvoir déplacer des machines virtuelles, y compris même des éléments tels que références du système de fichiers et points de terminaison de socket. Comme ils étaient au niveau de l'hyperviseur, ils avaient accès à tout cela. En accroissant cela et la JVM, ils avaient la plupart des pièces. Je pense qu’ils auraient peut-être disparu sous.

La meilleure chose que vous puissiez obtenir aujourd’hui est Terracotta , qui vous permet de mettre en cluster une partie de votre segment de mémoire JVM et de le stocker. dans un tableau de serveurs, ce qui peut être rendu persistant. Au démarrage de la machine virtuelle Java, vous vous connectez au cluster et pouvez continuer à utiliser les portions de votre segment de mémoire spécifiées comme étant en cluster. Les objets réels sont incriminés au besoin.

Autres conseils

Pas possible pour le moment. En général, mettre en pause et redémarrer une image mémoire d'un processus dans un contexte différent est extrêmement difficile à réaliser: qu'allez-vous faire avec des ressources de système d'exploitation ouvertes? Transferts vers des machines avec différents jeux d'instructions? connexions à la base de données?

De plus, les images de la machine virtuelle Java en cours d'exécution sont probablement très grandes - peut-être beaucoup plus grandes que le sous-ensemble de l'état qui vous intéresse réellement. Ce n'est donc pas une bonne idée du point de vue des performances.

Une stratégie bien meilleure consiste à disposer du code qui persiste et recrée l'état de l'application : cela est relativement faisable avec la plupart des langages dynamiques JVM. Je fais des choses similaires à Clojure, où vous avez un environnement interactif (REPL) et il est tout à fait possible de créer et d’exécuter une séquence d’opérations qui reconstruit l’état de l’application souhaité dans une autre machine virtuelle.

Cela n’est actuellement possible dans aucune des machines virtuelles que je connais. Il ne serait pas très difficile d'implémenter quelque chose comme ceci dans la JVM si les programmes sont exécutés de manière déconnectée de leurs environnements. Cependant, de nombreux programmes ont des liens avec leur environnement (identifient des descripteurs de fichiers, des connexions de base de données), ce qui rendrait très complexe l’implémentation de ce genre de choses.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top