java utilité Outils pour afficher/résoudre la fragmentation de la mémoire de Windows XP




optimiser et défragmenter le lecteur (5)

Peut-être que vous devriez envisager de démarrer le programme et de réserver la mémoire et ne pas mettre fin à la VM après chaque exécution. Recherchez les différentes options de GC et libérez vos objets.

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.


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


Je suspecte que le problème est la fragmentation de mémoire de Windows. Il y a une autre question sur appelée Java Maximum Memory sur Windows XP qui mentionne l'utilisation de Process Explorer pour voir où les DLL sont mappées en mémoire, puis pour résoudre le problème en rebasant les DLL pour les charger dans la mémoire de manière plus compacte.







windows-xp