Comment un tas 1Go Java sur une machine 64bit utilisation 3 Go d'espace VIRT?
-
30-09-2019 - |
Question
Je lance le même processus sur une machine 32 bits comme sur une machine 64 bits avec la même mémoire les paramètres VM (-Xms1024m -Xmx1024m) et similaire VM version (1.6.0_05 vs 1.6.0_16). Cependant, l'espace virtuel utilisé par la machine 64 bits (comme indiqué en haut sous « VIRT ») est presque trois fois plus grand que celui 32bit!
Je sais que les machines virtuelles 64 bits utilisera une mémoire peu plus pour les références plus grandes, mais comment peut-il être trois fois plus grand? Suis-je lire VIRT en haut de manière incorrecte?
Les données complètes présentées ci-dessous, montrant haut, puis le résultat de jmap -heap, d'abord pour 64bit, puis pour 32bit. Notez le VIRT pour 64bit est 3319m pour 32bit est 1220m.
* * 64bit
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 22534 agent 20 0 3319m 163m 14m S 4.7 2.0 0:04.28 java $ jmap -heap 22534 Attaching to process ID 22534, please wait... Debugger attached successfully. Server compiler detected. JVM version is 10.0-b19 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 2686976 (2.5625MB) MaxNewSize = -65536 (-0.0625MB) OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 268500992 (256.0625MB) used = 247066968 (235.62142181396484MB) free = 21434024 (20.441078186035156MB) 92.01715277089181% used From Space: capacity = 44695552 (42.625MB) used = 0 (0.0MB) free = 44695552 (42.625MB) 0.0% used To Space: capacity = 44695552 (42.625MB) used = 0 (0.0MB) free = 44695552 (42.625MB) 0.0% used PS Old Generation capacity = 715849728 (682.6875MB) used = 0 (0.0MB) free = 715849728 (682.6875MB) 0.0% used PS Perm Generation capacity = 21757952 (20.75MB) used = 16153928 (15.405586242675781MB) free = 5604024 (5.344413757324219MB) 74.24378912132907% used
* * 32bit
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 30168 agent 20 0 1220m 175m 12m S 0.0 2.2 0:13.43 java $ jmap -heap 30168 Attaching to process ID 30168, please wait... Debugger attached successfully. Server compiler detected. JVM version is 14.2-b01 using thread-local object allocation. Parallel GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 1048576 (1.0MB) MaxNewSize = 4294901760 (4095.9375MB) OldSize = 4194304 (4.0MB) NewRatio = 8 SurvivorRatio = 8 PermSize = 16777216 (16.0MB) MaxPermSize = 67108864 (64.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 89522176 (85.375MB) used = 80626352 (76.89128112792969MB) free = 8895824 (8.483718872070312MB) 90.0629940005033% used From Space: capacity = 14876672 (14.1875MB) used = 14876216 (14.187065124511719MB) free = 456 (4.3487548828125E-4MB) 99.99693479832048% used To Space: capacity = 14876672 (14.1875MB) used = 0 (0.0MB) free = 14876672 (14.1875MB) 0.0% used PS Old Generation capacity = 954466304 (910.25MB) used = 10598496 (10.107513427734375MB) free = 943867808 (900.1424865722656MB) 1.1104107034039412% used PS Perm Generation capacity = 16777216 (16.0MB) used = 11366448 (10.839889526367188MB) free = 5410768 (5.1601104736328125MB) 67.74930953979492% used
La solution
Pensez à l'espace virtuel en mémoire ce programme sera jamais en mesure d'utiliser. Il n'est pas la mémoire qu'il utilise en fait. 64 bits OS mémoire virtuelle est pratiquement sans fin, il n'y a pas de limitation 2Gb comme dans 32 bits, afin que les développeurs sont libres de choisir une taille virtuelle. Il n'y a pas de quoi s'inquiéter. Le RES est RAM physique utilisé.
Autres conseils
ne sont pas tous les paramètres de mémoire sont les mêmes - en particulier, regardez MaxNewSize, ce qui est négatif dans la version 64 bits. De plus, en 64 bits, la mémoire virtuelle est effectivement illimitée pour les programmes écrits pour les ordinateurs d'aujourd'hui, et ce n'est pas quelque chose à se préoccuper. L'utilisation de la mémoire réelle de la 64bit VM est inférieure à 32 bits.