Maximum Java taille de segment de mémoire d'une JVM 32 bits sur un OS 64 bits
La question n'est pas sur la taille maximale du tas sur un 32-bit OS, étant donné que 32 bits des Systèmes d'exploitation ont un maximum de mémoire adressable de 4 go, et que la JVM max taille de segment de mémoire dépend de la façon dont beaucoup contigu de mémoire libre peuvent être réservés.
Je suis plus intéressé à en savoir le maximum (à la fois théorique et pratiquement réalisable) taille de segment de mémoire pour une JVM 32 bits s'exécutant dans un OS 64 bits. En gros, je suis à la recherche des réponses similaires à les chiffres en question sur soi.
Pourquoi une JVM 32 bits est utilisé au lieu de 64-bit, la raison n'est pas technique, mais plutôt administrative et bureaucratique, il est probablement trop tard pour installer une JVM 64 bits dans l'environnement de production.
Vous devez vous connecter pour publier un commentaire.
32 bits Jvm qui s'attendent à avoir un seul grand morceau de la mémoire et utiliser des pointeurs ne peut pas utiliser plus de 4 Go (puisque c'est le 32 bits limite qui s'applique également à des pointeurs). Cela comprend le Soleil et je suis assez sûr - aussi d'IBM mise en œuvre. Je ne sais pas si par exemple, JRockit ou d'autres ont une mémoire de grande capacité en option avec leurs 32 bits implémentations.
Si vous vous attendez à être atteint cette limite, vous devriez sérieusement envisager de commencer une voie parallèle de la validation d'une JVM 64 bits pour votre environnement de production, vous avez donc qu'prêt pour quand la version 32 bits de l'environnement se décompose. Sinon, vous devrez le faire travailler sous pression, ce qui n'est jamais agréable.
Modifier 2014-05-15: Oracle FAQ:
Le montant maximum théorique de segment de limite pour la JVM 32 bits est la 4G. En raison de diverses contraintes supplémentaires telles que le swap disponible, espace d'adressage du noyau de l'utilisation, de fragmentation de la mémoire et de traitement de l'ordinateur virtuel, dans la pratique, la limite peut être beaucoup plus faible. Sur les systèmes Windows 32 bits la taille maximale du tas sera de 1,4 G à 1,6 G. Sur 32 bits Solaris grains de l'espace d'adressage est limitée à la 2G. Sur 64 bits des systèmes d'exploitation 32 bits VM, le max de la taille du segment peut être plus élevé, à l'approche de la 4G sur de nombreux systèmes Solaris.
(http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit)
mov eax,[ebx*8+28]
? Pour les projets qui avaient besoin entre 4 GO et ~32 GO de mémoire, qui semble plus efficace que d'utiliser encombrants 64 bits références.Vous pouvez demander à la Java Runtime:
Cela permettra de signaler le "Max de la Mémoire", sur la base par défaut de l'allocation de tas. Si vous avez encore besoin de jouer avec
-Xmx
(sur HotSpot). J'ai trouvé ce qui marche sur Windows 7 Entreprise 64 bits, mon 32 bits JVM HotSpot peut allouer jusqu'à 1577MiB:Alors qu'avec un 64 bits de la JVM sur le même OS, bien sûr, c'est beaucoup plus élevée (environ 3TiB)
Comme d'autres l'ont déjà mentionné, il dépend de l'OS.
Pour un 64 bits de l'OS hôte, si la JVM est en 32 bits, ça va encore dépendre, le plus probable, comme ci-dessus comme l'a démontré.
-- Mise à JOUR 20110905: je voulais juste souligner un certain nombre d'autres observations /détails:
Runtime.MaxMemory
qui peut être alloué dépend aussi du système d'exploitation jeu de travail. Une fois, j'ai couru ce, alors que j'avais aussi VirtualBox en cours d'exécution et trouvé que je pouvais pas réussir le démarrage de la JVM HotSpot avec-Xmx1590M
et a dû aller plus petites. Cela implique également que vous pouvez obtenir plus de 1590M en fonction de votre taille du jeu de travail à l'époque (même si je maintiens ce sera sous 2GiB pour 32 bits, car de Windows " design)Vous ne spécifiez pas qui OS.
Sous Windows (pour mon application une longue application de gestion des risques), nous avons observé que l'on pouvait aller plus loin que du 1280 MO sur Windows 32 bits. Je doute que la gestion d'une JVM 32 bits sous 64 bits ne fait aucune différence.
Nous avons porté l'application pour Linux et nous sommes en cours d'exécution d'une JVM 32 bits sur 64 bits du matériel et de 2,2 GO VM en cours d'exécution assez facilement.
Le plus grand problème que vous pouvez avoir est de GC en fonction de ce que vous êtes en utilisant de la mémoire pour les.
De 4.1.2 Tas De Dimensionnement:
Trouvé une assez bonne réponse ici: Java maximale de la mémoire sous Windows XP.
Nous avons récemment eu une certaine expérience avec ce. Nous avons porté à partir de Solaris (x86-64 Version 5.10) pour Linux (RedHat x86-64) récemment et avons réalisé que nous avons moins de mémoire disponible pour un 32 bits, processus de JVM sur Linux que Solaris.
Pour Solaris ce presque est à 4 GO (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit).
Nous avons couru notre app avec -Xms2560m -Xmx2560m -XX:MaxPermSize=512m -XX:PermSize=512m avec pas de questions sur Solaris pour les deux dernières années. Tenté de passer à linux et nous avons eu des problèmes avec aléatoire des erreurs de mémoire insuffisante sur démarrer. Nous ne pouvions obtenir de toujours démarrer sur -Xms2300 -Xmx2300. Ensuite, nous avons été informés de ce soutien.
Les limites d'une JVM 32 bits sur un OS 64 bits sera exactement le même que les limites d'une JVM 32 bits sur un 32-bit OS. Après tout, la JVM 32 bits En 32 bits et la machine virtuelle (dans le sens de virtualisation) de sorte qu'il ne sait pas qu'il est en cours d'exécution sur un système d'exploitation 64 bits/ordinateur.
Un avantage à l'exécution d'une JVM 32 bits sur un OS 64 bits contre 32-bit OS que vous pouvez avoir plus de mémoire physique, et par conséquent à la rencontre d'échange/de pagination moins fréquemment. Cet avantage n'est pleinement réalisée que lorsque vous avez plusieurs processus, cependant.
Lorsque je travaillais pour le BEA, nous avons constaté que la moyenne de la demande en fait couru plus lent dans une JVM 64 bits, alors il l'a fait lors de l'exécution dans une JVM 32 bits. Dans certains cas, l'impact sur les performances a été aussi élevé que 25% plus lente. Donc, sauf si votre application a vraiment besoin de tout ce que la mémoire supplémentaire, vous avez été mieux de mettre en place plusieurs serveurs 32 bits.
Que je me souviens, les trois communes les plus techniques, les justifications à l'aide d'un 64 bits que BEA professionnelle du personnel des services couru en étaient:
contrat avec le gouvernement, et ils ne veulent pas prendre le temps et la
frais de retracer la fuite de mémoire. (À l'aide d'un massif de mémoire
tas pourrait augmenter le MTBF et le premier serait toujours payé)
.
La JROCKIT JVM actuellement détenue par Oracle prend en charge les non-contiguë de l'utilisation du tas, permettant ainsi à la JVM 32 bits pour accéder à plus de 3,8 GO de mémoire lorsque la JVM est en cours d'exécution sur une version 64 bits de windows OS. (2,8 GO lors de l'exécution sur un OS 32 bits).
http://blogs.oracle.com/jrockit/entry/how_to_get_almost_3_gb_heap_on_windows
La JVM peut être téléchargé gratuitement (inscription obligatoire) à
http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html
Voici quelques tests sous Solaris et Linux 64 bits
Solaris 10 - SPARC - T5220 machine avec 32 GO de RAM (et environ 9 GO de libre)
BTW: Apparemment, Java ne pas allouer beaucoup de mémoire réelle avec le démarrage. Il semblait prendre à seulement 100 MO par exemple commencé (j'ai commencé à 10)
Solaris 10 x86 - VMWare VM avec 8 GO de RAM (3 GO d'espace libre*)
Les 3 GO de mémoire vive n'est pas vraiment vrai. Il y a une grande partie de la RAM que ZFS caches utiliser, mais je n'ai pas accès à la racine de vérifier combien exactement
RedHat 5.5 - x86 - VMWare VM avec 4 GO de RAM (environ 3,8 GO utilisés - 200 MO dans les tampons et 3.1 GO dans les caches, donc environ 3 GO libre)
Même machine à l'aide de JRE 7
Devrait être beaucoup mieux
Pour une JVM 32 bits s'exécutant sur un hôte 64 bits, j'imagine ce qu'il en reste pour le tas sera quel que soit fragmenté, l'espace virtuel est disponible après la JVM, c'est propre DLL, et tout système d'exploitation 32 bits trucs compatibilité a été chargé. Comme un sauvage suppose que je pense que 3 GO devrait être possible, mais comment beaucoup mieux dépend de la façon dont vous faites en 32 bits-accueil-land.
Aussi, même si vous pouvez faire un géant de 3 GO de tas, vous pourriez ne pas vouloir, ce qui causera la GC s'arrête pour devenir potentiellement gênants. Certaines personnes juste courir plus de la JVM de l'utilisation de la mémoire supplémentaire plutôt qu'un géant. J'imagine qu'ils sont à un réglage de la JVM est en ce moment à mieux travailler avec les géants des tas.
C'est un peu dur de savoir exactement comment beaucoup mieux que vous pouvez faire. Je suppose que votre 32-bit situation peut être facilement déterminée par l'expérience. Il est certainement difficile de prédire de façon abstraite, comme beaucoup de choses facteur, en particulier parce que l'espace virtuel disponible sur 32 bits hôtes est limitée.. Le tas ne doivent exister dans contigu de mémoire virtuelle, de sorte que la fragmentation de l'espace d'adressage pour les dll et l'utilisation interne de l'espace d'adressage par le noyau du système d'exploitation permettra de déterminer l'éventail des possibilités d'affectations.
Système d'exploitation à l'aide de certains de l'espace d'adressage pour la cartographie HW dispositifs et il est propre allocations dynamiques. Tandis que cette mémoire n'est pas mappé dans la java espace d'adressage du processus, le noyau de système d'exploitation ne peut pas accéder à votre espace d'adressage dans le même temps, de sorte qu'il sera de limiter la taille de n'importe quel programme de l'espace virtuel.
Chargement de la DLL dépend de la mise en œuvre et de la libération de la JVM. Le chargement du noyau de système d'exploitation dépend d'un grand nombre de choses, la libération, la HW, combien de choses il a mappé depuis le dernier redémarrage, qui sait...
En résumé
Je parie que vous obtenez de 1 à 2 GO en 32 bits-terre, et sur 3 en 64 bits, donc une amélioration globale d'environ 2x.
Sur Solaris, la limite a été d'environ 3,5 GO depuis Solaris 2.5. (environ 10 ans)
J'ai eu les mêmes problèmes avec la JVM de l'App Inventor pour Android Blocs de l'Éditeur utilise. Il définit le tas à 925m max. Ce n'est pas assez, mais je ne pouvais pas plus que d'environ 1200m d'altitude, en fonction de divers facteurs aléatoires sur ma machine.
J'ai téléchargé tous les Soirs, la bêta du navigateur 64-bit de Firefox, et aussi JAVA 7 64 bits version.
Je n'ai pas encore trouvé mon nouveau segment de limite, mais je viens d'ouvrir une JVM avec une taille de segment de 5900m. Pas de problème!
Je suis sous Win 7 64 bits Ultimate sur une machine avec 24go de RAM.
J'ai essayé de réglage de la taille de segment de mémoire jusqu'à 2200M sur 32 bits Linux de la machine et de la JVM a bien fonctionné. La JVM ne pas démarrer lorsque je l'ai mis à 2300M.
C'est lourd de s'écouler, mais vous pouvez obtenir 3gb tas.
http://www.microsofttranslator.com/bv.aspx?from=&to=en&a=http://forall.ru-board.com/egor23/online/FAQ/Virtual_Memory/Limits_Virtual_Memory.html
un point de plus ici pour hotspot JVM 32 bits:-
le natif de tas de capacité = 4 Gig – Java Heap - PermGen;
Il peut devenir particulièrement difficile pour la JVM 32 bits depuis le Java Tas et des Tas natif sont dans une course. L'
plus votre Java Heap, plus le Tas natif. Tentative d'installation d'un important Segment de mémoire pour un 32 bits VM
e.g .2.5 GO+ augmente le risque de native OutOfMemoryError en fonction de votre demande(s) de l'empreinte,
nombre de Threads etc.
Théorique de 4 go, mais dans la pratique (par JVM IBM):
Gagner 2k8 64, IBM Websphere Application Server 8.5.5 32bit
C:\IBM\WebSphere\AppServer\bin>managesdk.bat -listAvailable -verbose CWSDK1003I: Доступные SDK: CWSDK1005I: Имя SDK: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=windows - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 - com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/win /x86_32/
CWSDK1001I: Задача managesdk выполнена успешно.
C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2036 MaxMemory
JVMJ9GC017E -Xmx слишком мала, должна быть не меньше 1 M байт
JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось инициализи
ровать
Could not create the Java virtual machine.
C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2047M MaxMemory
Total Memory: 4194304 (4.0 MiB)
Max Memory: 2146435072 (2047.0 MiB)
Free Memory: 3064536 (2.9225692749023438 MiB)
C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2048M MaxMemory
JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось создать эк
земпляр кучи; запрошено 2G
Could not create the Java virtual machine.
RHEL 6.4 64, IBM Websphere Application Server 8.5.5 32bit
[bin]./java -Xmx3791M MaxMemory
Total Memory: 4194304 (4.0 MiB)
Max Memory: 3975151616 (3791.0 MiB)
Free Memory: 3232992 (3.083221435546875 MiB)
[root@nagios1p bin]# ./java -Xmx3793M MaxMemory
Total Memory: 4194304 (4.0 MiB)
Max Memory: 3977248768 (3793.0 MiB)
Free Memory: 3232992 (3.083221435546875 MiB)
[bin]# /opt/IBM/WebSphere/AppServer/bin/managesdk.sh -listAvailable -verbose
CWSDK1003I: Available SDKs :
CWSDK1005I: SDK name: 1.6_32
- com.ibm.websphere.sdk.version.1.6_32=1.6
- com.ibm.websphere.sdk.bits.1.6_32=32
- com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java
- com.ibm.websphere.sdk.platform.1.6_32=linux
- com.ibm.websphere.sdk.architecture.1.6_32=x86_32
-com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/linux/x86_32/
CWSDK1001I: Successfully performed the requested managesdk task.