java - utilité - optimiser et défragmenter le lecteur




Outils pour afficher/résoudre la fragmentation de la mémoire de Windows XP (4)

Nous avons un programme java qui nécessite une grande quantité d'espace de tas - nous le démarrons avec (parmi d'autres arguments de ligne de commande) l'argument -Xmx1500m, qui spécifie un espace de tas maximum de 1500 Mo. Lorsque vous démarrez ce programme sur une boîte Windows XP qui a été récemment redémarrée, il démarre et s'exécute sans problème. Mais si le programme a fonctionné plusieurs fois, l'ordinateur a été levé pendant un certain temps, etc., quand il essaie de démarrer, je reçois cette erreur:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Je soupçonne que Windows lui-même souffre de la fragmentation de la mémoire, mais je ne sais pas comment confirmer cette suspicion. Au moment où cela se produit, Task Manager et sysinternals procexp rapport 2000 Mo de mémoire libre. J'ai regardé cette question liée à la fragmentation interne

Donc, la première question est: Comment puis-je confirmer mes soupçons? La deuxième question est la suivante: si mes soupçons sont corrects, quelqu'un connaît-il des outils pour résoudre ce problème? J'ai regardé un peu autour de moi, mais je n'ai rien trouvé qui aide, à part les redémarrages périodiques de la machine.

ps - la modification des systèmes d'exploitation n'est pas non plus une option viable à l'heure actuelle.


D'accord avec Torlack, cela s'explique en grande partie par le fait que d'autres DLL sont chargées et vont dans certains endroits, ce qui réduit la quantité de mémoire que vous pouvez obtenir pour la VM en un seul gros morceau.

Vous pouvez faire un peu de travail sur WinXP si vous avez plus de 3G de mémoire pour déplacer certaines choses Windows, cherchez PAE ici: http://www.microsoft.com/whdc/system/platform/server/PAE/ PAEdrv.mspx

Votre meilleur pari, si vous avez vraiment besoin de plus de 1,2 Go de mémoire pour votre application Java, est de regarder 64 bits Windows ou Linux ou OSX. Si vous utilisez n'importe quel type de bibliothèque native avec votre application, vous devrez les recompiler en 64 bits, mais cela sera beaucoup plus facile que d'essayer de rebaser des DLL et des choses pour maximiser la mémoire que vous pouvez obtenir sur les fenêtres 32 bits .

Une autre option serait de diviser votre programme en plusieurs VM et de les faire communiquer entre elles via RMI ou messagerie ou quelque chose comme ça. De cette façon, chaque VM peut avoir un sous-ensemble de la mémoire dont vous avez besoin. Sans savoir ce que votre application fait, je ne suis pas sûre que cela puisse vous aider d'une quelconque façon, cependant ...


L'utilisation de Minimem ( http://minimem.kerkia.net/ ) pour cette application peut résoudre votre problème. Cependant, je ne suis pas sûr que ce soit la réponse que vous cherchez. J'espère que ça aide.


Sauf si vous manquez d'espace fichier, ce problème n'est pas que l'ordinateur manque de mémoire. Le but de la mémoire virtuelle est de permettre aux processus d'utiliser plus de mémoire virtuelle que ce qui est physiquement disponible.

Ne sachant pas comment la JVM gère le tas, il est un peu difficile de dire exactement quel est le problème, mais l'un des problèmes communs est qu'il n'y a pas assez d'espace libre disponible dans votre processus pour permettre l'extension du tas . Pourquoi ce serait un problème après que la machine ait fonctionné pendant un moment est un peu déroutant.

J'ai travaillé sur un problème similaire au travail. J'ai découvert que l'exécution du programme à l'aide de WinDBG et l'utilisation des commandes "! Address" et "! Address -summary" ont été d'une aide inestimable pour déterminer pourquoi l'espace d'adressage virtuel d'un processus est fragmenté. Vous pouvez également essayer d'exécuter le programme après le redémarrage et en utilisant la commande "! Adresse" pour prendre une photo de l'espace d'adressage, puis faites de même lorsque le programme ne fonctionne plus. Cela pourrait vous aider à comprendre le problème. Peut-être que quelque chose de simple comme un chargement supplémentaire de DLL pourrait causer le problème.


Utilisez vmmap des outils SysInternals de Microsoft pour afficher la fragmentation de l'espace d'adressage virtuel et identifier ce qui se passe dans l'espace





windows-xp