Согласно следующему документу http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.ergonomics.default_size максимальный размер кучи по умолчанию для Parallel GC выбирается по формуле MIN (memory / 4, 1GB). Из формулы видно, что в документе все еще отмечается, что «максимальный размер кучи по умолчанию не будет превышать 1 ГБ, независимо от того, сколько памяти установлено на машине». Чтобы убедиться, что я написал следующую программу
public class Allocate{
public static void main(String[] args) throws Exception {
long megabytes = Long.valueOf(args[0]);
long bytes = megabytes * 1024 * 1024;
int longs = (int) (bytes / 8);
long[] arr = new long[longs];
Thread.sleep(Long.MAX_VALUE);
System.out.println(arr.length);
}
}
Я выполнил эту программу на коробке с 16 ГБ ОЗУ.
smeldris@us4nrsdn01 allocation]$ /usr/java/jdk1.6.0_26/bin/java Allocate 2048 &
[1] 9291
[smeldris@us4nrsdn01 allocation]$ /usr/java/jdk1.6.0_26/bin/jmap -heap 9291
Attaching to process ID 9291, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.1-b02
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
<b>MaxHeapSize = 4208984064 (4014.0MB)</b>
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 65798144 (62.75MB)
used = 1315976 (1.2550125122070312MB)
free = 64482168 (61.49498748779297MB)
2.0000199397721614% used
From Space:
capacity = 10944512 (10.4375MB)
used = 0 (0.0MB)
free = 10944512 (10.4375MB)
0.0% used
To Space:
capacity = 10944512 (10.4375MB)
used = 0 (0.0MB)
free = 10944512 (10.4375MB)
0.0% used
PS Old Generation
capacity = 2322923520 (2215.3125MB)
<b>used = 2147483664 (2048.000015258789MB)</b>
free = 175439856 (167.31248474121094MB)
92.44745449045176% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606752 (2.485992431640625MB)
free = 19151200 (18.264007568359375MB)
11.980686417545181% used
[smeldris@us4nrsdn01 allocation]$
Массив 2 ГБ был выделен в старом поколении. MaxHeapSize составляет 4 ГБ, что составляет 1/4 от системной памяти. Почему JVM зарезервировала 4 ГБ для кучи?