Я запускаю тот же процесс на 32-битной машине, что и на 64-битной машине с теми же настройками виртуальной памяти (-Xms1024m -Xmx1024m) и аналогичной версией виртуальной машины (1.6.0_05 против 1.6.0_16). Однако виртуальное пространство, используемое 64-битной машиной (как показано сверху в разделе «VIRT»), почти в три раза больше, чем в 32-битной!
Я знаю, что 64-битные виртуальные машины будут использовать немного больше памяти для больших ссылок, но как это может быть в три раза больше? Я неправильно читаю VIRT?
Полные данные показаны ниже, показывая top и затем результат jmap -heap, сначала для 64-битной, затем для 32-битной. Обратите внимание, что VIRT для 64-битной версии составляет 3319 м, для 32-битной - 1220 м.
* 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
* 32 бита *
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