2010-05-19 13 views
1

Je exécute le même processus sur une machine 32 bits que sur une machine 64 bits avec les mêmes paramètres VM mémoire (-Xms1024m -Xmx1024m) et une version VM similaire (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 en 32 bits! Je sais que les machines virtuelles 64 bits utiliseront un peu plus de mémoire pour les grandes références, mais comment peut-elle être trois fois plus grande? Suis-je lire VIRT en haut incorrectement?Comment un tas Java 1Gb sur une machine 64 bits peut-il utiliser 3Gb de l'espace VIRT?

Les données complètes montrées ci-dessous, montrant le 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 

Répondre

3

espace virtuel Pensez que la mémoire que le programme ne sera jamais en mesure d'utiliser. Ce n'est pas la mémoire qu'il utilise réellement. Sur le système d'exploitation 64 bits, la mémoire virtuelle est virtuellement illimitée, il n'y a pas de limitation de 2 Go comme en 32 bits, donc les développeurs sont libres de choisir n'importe quelle taille virtuelle. Il n'y a pas de quoi s'inquiéter. Le RES est la RAM physique réelle utilisée.

0

Tous les paramètres de mémoire ne sont pas identiques - en particulier, consultez MaxNewSize, qui est négatif dans la version 64 bits. En outre, 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 d'inquiétant. L'utilisation réelle de la mémoire de la machine virtuelle 64 bits est inférieure à 32 bits.