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
不能保留数组的分配,需要调整哪些选项来修复它?
1条答案
按热度按时间vtwuwzda1#
这是一个JVM错误JDK-8279241“G1 Full GC并不总是将内存滑动到底部地址”。应在JDK 19中解决此错误。
解决方法是禁用“类数据共享”。