Question

Nous avons un programme Java qui nécessite une grande quantité d’espace de mémoire. Nous le démarrons avec (entre autres arguments de ligne de commande) l’argument -Xmx1500m, qui spécifie un espace de pile maximal de 1 500 Mo. Lors du démarrage de ce programme sur un ordinateur Windows XP qui vient d'être redémarré, il démarrera et s'exécutera sans problème. Mais si le programme a été exécuté plusieurs fois, l'ordinateur est en marche depuis un moment, etc., lorsqu'il essaie de démarrer, j'obtiens 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 ce soupçon. Au moment où cela se produit, le gestionnaire de tâches et sysinternals procexp signalent 2 000 Mo de mémoire disponible. J'ai consulté cette question relative à la fragmentation interne

.

La première question est donc: comment puis-je confirmer mes soupçons? La deuxième question est, si mes soupçons sont corrects, quelqu'un connait-il des outils pour résoudre ce problème? J'ai jeté un coup d'œil autour de moi, mais je n'ai rien trouvé qui puisse aider, mis à part les redémarrages périodiques de la machine.

ps - le changement de système d'exploitation n'est pas non plus une option viable à l'heure actuelle.

Était-ce utile?

La solution

D'accord avec Torlack, cela tient en grande partie au fait que d'autres DLL sont en train de se charger et se placent à certains endroits, décomposant ainsi la quantité de mémoire que vous pouvez obtenir pour la machine virtuelle en un seul bloc.

Vous pouvez travailler sur WinXP si vous avez plus de 3 Go de mémoire pour déplacer certains éléments de Windows, consultez PAE ici: http://www.microsoft.com/whdc/system/ plate-forme / serveur / 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 Windows 64 bits, Linux ou OSX. Si vous utilisez n'importe quel type de bibliothèques natives avec votre application, vous devrez les recompiler en 64 bits, mais cela sera beaucoup plus facile que d'essayer de rebaser des dlls et d'autres choses pour maximiser la mémoire que vous pouvez obtenir sur des fenêtres 32 bits. .

Une autre option serait de scinder votre programme en plusieurs machines virtuelles et de les faire communiquer entre elles via RMI, messagerie ou autre. Ainsi, chaque machine virtuelle peut disposer d’un sous-ensemble de la mémoire dont vous avez besoin. Sans savoir ce que fait votre application, je ne suis pas sûr que cela puisse vous aider de quelque manière que ce soit, bien que ...

Autres conseils

Sauf si vous manquez d'espace disque, ce n'est pas parce que l'ordinateur manque de mémoire. L’intérêt 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 machine virtuelle Java gère le tas, il est un peu difficile de dire exactement quel est le problème, mais l'un des problèmes courants est qu'il n'y a pas assez d'espace d'adressage libre contigu disponible dans votre processus pour permettre au tas être étendu. Pourquoi ce serait un problème après que la machine ait fonctionné pendant un moment est un peu déroutant.

Je travaille sur un problème similaire au travail. J'ai constaté que l'exécution du programme à l'aide de WinDBG et de l'adresse "! Address" et "! address -summary " Les commandes ont été précieuses pour comprendre pourquoi l'espace d'adressage virtuel d'un processus est devenu fragmenté. Vous pouvez également essayer de lancer le programme après le redémarrage et d’utiliser l’adresse "! Adresse". commande pour prendre une photo de l'espace d'adressage et ensuite faire la même chose lorsque le programme ne s'exécute plus. Cela pourrait vous renseigner sur le problème. Peut-être que quelque chose de simple, comme une DLL supplémentaire qui se charge, pourrait causer le problème.

Je soupçonne que le problème est la fragmentation de la mémoire Windows. Il y a une autre question ici sur StackOverflow appelée Mémoire Java maximale sous Windows XP qui mentionne en utilisant Process Explorer pour voir où les DLL sont mappées en mémoire, puis pour résoudre le problème en rebasonnant les DLL afin qu'elles soient chargées en mémoire de manière plus compacte.

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

Peut-être devriez-vous envisager de démarrer le programme en réservant la mémoire et non mettre fin à la machine virtuelle après chaque exécution. Recherchez différentes options de GC et libérez vos objets.

Utilisez vmmap à partir des outils SysInternals de Microsoft pour afficher la fragmentation de l'espace d'adressage virtuel et identifier ce qui le divise

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