Java 热点默认最大堆大小

Java 热点默认最大堆大小,java,jvm,memory-management,jvm-hotspot,Java,Jvm,Memory Management,Jvm Hotspot,根据以下文档,并行GC的默认最大堆大小是使用公式MIN(memory/4,1GB)选择的。从公式中可以明显看出,但文档仍然指出“默认最大堆大小不会超过1GB,无论机器上安装了多少内存。”为了验证我编写了以下程序 public class Allocate{ public static void main(String[] args) throws Exception { long megabytes = Long.valueOf(args[0]);

根据以下文档,并行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); } } 公共类分配{ 公共静态void main(字符串[]args)引发异常{ long兆字节=long.valueOf(args[0]); 长字节=兆字节*1024*1024; int longs=(int)(字节/8); long[]arr=新的long[long]; 线程睡眠(长.MAX_值); 系统输出打印长度(arr.length); } } 我在一个有16Gb内存的盒子上执行了这个程序

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 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) 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) 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]$ smeldris@us4nrsdn01分配]$/usr/java/jdk1.6.0_26/bin/java分配2048& [1] 9291 [smeldris@us4nrsdn01分配]$/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) 新比率=2 生存率=8 PermSize=21757952(20.75MB) MaxPermSize=85983232(82.0MB) 堆使用情况: 年轻一代 伊甸园空间: 容量=65798144(62.75MB) 使用=1315976(1.255012512122070312MB) 自由=64482168(61.49498748779297MB) 2.0000199397721614%已使用 从太空: 容量=10944512(10.4375MB) 已使用=0(0.0MB) 自由=10944512(10.4375MB) 使用率为0.0% 到空间: 容量=10944512(10.4375MB) 已使用=0(0.0MB) 自由=10944512(10.4375MB) 使用率为0.0% 老一代 容量=2322923520(2215.3125MB) 已使用=2147483664(2048.000015258789MB) 自由=175439856(167.3124847412094MB) 92.44745449045176%已使用 PS-Perm生成 容量=21757952(20.75MB) 已使用=2606752(2.485992431640625MB) 免费=19151200(18.264007568359375MB) 11.98068647545181%已使用 [smeldris@us4nrsdn01分配]$
2GB阵列是在旧一代中分配的。MaxHeapSize是4GB,占系统内存的1/4。为什么JVM为堆保留4GB?

我在这里发布了这个问题以打开jdk邮件列表

GC工效学在(1.6.018)中进行了更改,但文档尚未更新

相应的bug Id。 发行说明