Question

Cette question est liée à Java refuse de démarrer - Impossible Resrve assez d'espace pour objet Heap et devrait être assez facile à comprendre. Pourtant; mes recherches n'ont pas donné quelque chose d'utile.

Nous avons essentiellement 2 32 bits OS (RedHat et SuSE) sur des machines différentes avec le même matériel. Les deux utilisent la même machine virtuelle Java à la fois l'exécution de la même ligne de commande. RedHat fonctionne parfaitement bien, mais les rapports SuSE il n'y a pas assez de mémoire.

Nous avons juste besoin de savoir si cela est une limitation de la version de SuSE nous utilisons ou si elle est autre chose.

'cat / proc / version' nous donne:

Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

'uname -a nous donne ce qui suit sur les deux types de machines:

UTC 2005 i686 i686 i386 GNU/Linux
Était-ce utile?

La solution

La limite de mémoire JVM est liée le plus grand libre contigu bloc disponible, pas la quantité de mémoire libre. La limite varie d'environ 1,4 Go à un peu plus de 2,0 Go, et dépend de l'endroit où votre système d'exploitation met diverses choses en mémoire. Je ne connais pas les détails de l'endroit où des choses de charge RedHat ou SuSE en mémoire, mais il se pourrait que SuSE une bibliothèque à cartographier une adresse au milieu de RAM, où Redhat pourrait la carte à la fin (spéculant).

Et rappelez-vous que votre utilisation de la mémoire réelle en java est plus ce que vous spécifiez pour Xmx. Les autres paramètres de mémoire affectent également la taille de votre tas (comme PermGen). Ainsi, il se pourrait aussi que l'permgen sur Suse a une valeur par défaut de LARGET que sur Redhat.

En outre, en fonction du profil d'allocation de mémoire de votre application, vous pouvez vous en sortir avec une plus petite taille du tas et différentes options de collecte de déchets. Il y a quelques détails ici ( http://java.sun.com/performance/ référence / whitepapers / tuning.html ) et d'autres endroits. Par exemple, si vous allouez beaucoup de petits blocs temporaires, vous voulez différents paramètres du GC que si vous avez beaucoup de bits, des objets de longue durée.

En ce qui concerne la question liée, pourquoi ne pas utiliser Redhat? Cela pourrait être une solution simpliste, mais je vous garantis que ça va résoudre votre problème plus rapidement que profondément dans le plonger monde mystérieux de l'accord java et OS gestion de la mémoire: P

Autres conseils

Tout d'abord, vous êtes fou d'être en cours d'exécution d'un système d'exploitation 32 bits lorsque vous avez autant la pression de l'espace d'adressage. Migrer vers une machine virtuelle Java 64 bits sur Linux 64 bits. Combien de temps avez-vous déjà gaspillée en essayant de diagnostiquer ce problème que vous devez avoir soupçonné dès le départ disparaîtrait avec l'espace d'adressage plus d'un système 64 bits?

En second lieu, il est bien connu que de tous les fournisseurs de Linux Red Hat a le plus d'ingénieurs du noyau sur le personnel et fait quelques modifications sérieuses pour les noyaux dans leurs produits RHEL. Ceux-ci comprennent souvent des correctifs pour les grandes charges de travail comme le vôtre (bien, il est une grande charge de travail pour un système 32 bits, il est rien de spécial sur 64 bits). Donc, il y a une chance en fin de compte la raison est que RHEL a d'autres clients qui font la même chose folle que vous et vous bénéficier du travail qu'ils ont fait pour soutenir ces clients.

Enfin si, puisque je pense que vous allez insister pour essayer de trouver un moyen de le faire sur SuSE 32 bits Je signale que Linux offre une variété de compromis de l'espace d'adressage sur 32 bits x86, et il est possible (mais pas certain) que vos systèmes de SuSE ont juste un autre arrêt du commerce sélectionné. Si vous pouvez afficher la configuration des noyaux en cours d'exécution (souvent dans / boot / config ....), vous pouvez comparer les paramètres comme highmem.

L'option classique jusqu'à ce que quelques années il y a 2: 2 scission, qui est l'espace utilisateur est limité à 2GiB de l'espace d'adressage, une solution facile à programmer et il a un rendement décent, mais dans ce scénario, vous ne peut évidemment pas avoir votre demandé tas car il ne laisserait pas de place pour le texte du programme, pile, etc. Plus récemment, la tendance a été de 3: 1 (similaire au commutateur de Windows / 3GB) qui élargit l'espace d'adressage userspace au prix de bachotage le noyau du système d'exploitation lui-même en moins l'espace qui provoque potentiellement ses propres problèmes. Cela pourrait fonctionner, mais il serait très étroit, donc je aussi ne serais pas surpris si elle ne fonctionne pas pour vos travaux. Enfin les noyaux Linux récents offrent également une option où vous obtenez 4GiB 32 bits userspace, ce qui pourrait être suffisant pour faire vos travaux sont exécutés de manière fiable, à un coût de performance significative depuis lors, évidemment les adresses de l'espace utilisateur et noyau ne peuvent pas coexister.

Pour essayer cela, vous aurez besoin d'un nouveau noyau. Vous pourrez peut-être tout simplement installer celui fourni par SuSE (voir si elles offrent d'autres à choisir, par exemple, une option « PAE ») ou vous pouvez avoir à compiler vos propres, auquel cas il annule probablement votre contrat de support.

Mais vraiment, vous devriez juste aller avec l'option 1, passer à une machine virtuelle Java 64 bits et mettre vos pieds.

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