jvm G1不允许分配大对象,而Parallel允许

mwg9r5ms  于 2022-11-07  发布在  其他
关注(0)|答案(1)|浏览(131)

int
请考虑以下简单的Java程序。

public static void main( String[] args ){
    int i[] = new int[Integer.MAX_VALUE / 2];
}

这里int的大小是4字节,所以分配int[Integer.MAX_VALUE / 2]需要4G的空闲堆大小。现在让我们用不同的选项运行程序。

I.-XX:+UseParallelGC -Xmx5g
结果OutOfMemoryError崩溃。

即使堆大小足够大,但很明显,因为-XX:NewSize默认为1310 MB,而老一代不够大。

二、*************************************************************************************************************************************************************************************************
**结果:**正常完成

应用程序运行良好,因为旧代足够大,可以容纳数组分配。
现在,让我们将采集器从Parallel更改为G1

三、
结果:OutOfMemoryError崩溃。

这是我不知道的。我以为调整-XX:G1HeapWastePercent会有帮助,但它没有。
为什么G1不能保留数组的分配,需要调整哪些选项来修复它?

vtwuwzda

vtwuwzda1#

这是一个JVM错误JDK-8279241“G1 Full GC并不总是将内存滑动到底部地址”。应在JDK 19中解决此错误。
解决方法是禁用“类数据共享”。

相关问题