Java 为什么jstat中没有反映大小为2^29(2 gig)的整数数组的创建?

Java 为什么jstat中没有反映大小为2^29(2 gig)的整数数组的创建?,java,garbage-collection,java-memory-model,jstat,Java,Garbage Collection,Java Memory Model,Jstat,我有以下代码: public static void main(String[] args) { int[] a = new int[Integer.MAX_VALUE / 4]; while (true); } 此数组的大小应为2^29,每个整数占用4个字节。此阵列的总体大小应至少约为2GB。 我用16G内存在笔记本电脑上运行这段代码 然后运行jstat并查看以下输出 S0C 10752.0 S1C 10752.0 S0U 0.0 S1U 5421.8

我有以下代码:

public static void main(String[] args) {
    int[] a = new int[Integer.MAX_VALUE / 4];
    while (true);
}
此数组的大小应为2^29,每个整数占用4个字节。此阵列的总体大小应至少约为2GB。 我用16G内存在笔记本电脑上运行这段代码

然后运行jstat并查看以下输出

S0C    10752.0
S1C    10752.0
S0U    0.0
S1U    5421.8
EC     65536.0
EU     27194.8
OC     175104.0
OU     16.0
MC     14080.0
MU     13695.2
CCSC   1792.0
CCSU   1617.5
YGC    1
YGCT   0.006
FGC    0
FGCT   0.000
GCT    0.006
从输出中,我们可以确定S1占5421.8KB,eden占27194.8KB。
是否执行了某种优化,使所有条目都映射到内存中的相同值?

您从未实际使用过数组。我怀疑整个阵列被删除了。标准最大堆大小是物理内存的1/4。您是使用默认值还是指定了一个固定值作为命令行参数?请尝试打印
Runtime.getRuntime().maxMemory()
以查看实际最大堆大小,不要猜测/估计。@Andreas堆的最大大小确实是4GB,但为什么S1和EU的容量分别达到5MB和27MB?年轻一代从未创建过大型阵列,因此不要期望它们出现在
S1
EU
中。它没有出现在
OU
中的原因可能是它已被收集,正如@Louis Wasserman所建议的,尽管我从未在简单的
main
方法中遇到过这样的行为……您从未实际使用过数组。我怀疑整个阵列被删除了。标准最大堆大小是物理内存的1/4。您是使用默认值还是指定了一个固定值作为命令行参数?请尝试打印
Runtime.getRuntime().maxMemory()
以查看实际最大堆大小,不要猜测/估计。@Andreas堆的最大大小确实是4GB,但为什么S1和EU的容量分别达到5MB和27MB?年轻一代从未创建过大型阵列,因此不要期望它们出现在
S1
EU
中。它没有出现在
OU
中的原因可能是它已被收集,正如@Louis Wasserman所建议的,尽管我从未在简单的
main
方法中遇到过这种行为…