热点默认最大堆大小

4
根据以下文档 http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.ergonomics.default_size,并行GC的默认最大堆大小是使用公式MIN(memory / 4, 1GB)来选择的。从公式中可以看出,但文档仍然指出“无论机器上安装了多少内存, 默认最大堆大小都不会超过1GB。”为了验证这一点,我编写了以下程序。
    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); } }

我在16Gb RAM的计算机上运行了此程序。

[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
正在附加到进程 ID 9291,请稍候...
调试器已成功附加。
检测到服务器编译器。
JVM 版本为 20.1-b02
使用线程本地对象分配。 启用 8 个线程的并行 GC。
堆配置: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 4208984064 (4014.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB)
堆使用情况: 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) used = 2147483664 (2048.000015258789MB) 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]$

这里的2GB数组是分配在老年代中的。MaxHeapSize为4GB,占用了系统内存的1/4。为什么JVM会为堆保留4GB呢?

1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接