Как может куча Java объемом 1 Гб на 64-битной машине использовать 3 Гб пространства VIRT? - PullRequest
1 голос
/ 19 мая 2010

Я запускаю тот же процесс на 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

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

Думайте о виртуальном пространстве как о памяти, которую когда-либо сможет использовать программа. Это не память, которую он на самом деле использует. В 64-битных ОС виртуальная память практически бесконечна, ограничения в 2 Гб нет, как в 32-битных, поэтому разработчики могут выбирать любой виртуальный размер. Здесь не о чем беспокоиться. RES - это фактически используемая физическая память.

0 голосов
/ 19 мая 2010

Не все настройки памяти одинаковы - в частности, посмотрите на MaxNewSize, что отрицательно в 64-битной версии. Кроме того, в 64-битной виртуальной памяти практически нет ограничений для программ, написанных для современных компьютеров, и это не то, о чем нужно беспокоиться. Фактическое использование памяти 64-битной виртуальной машины ниже, чем 32-битной.

...