Pac*_*ier 5 java memory jvm out-of-memory
我正在阅读Unveiling java.lang.Out OfMemoryError,我想知道我是否正确理解它.如果Java VM抛出一个,那是真的吗?
java.lang.OutOfMemoryError
:请求的数组大小超过VM限制
这意味着VM已经拒绝创建数组,因为它超出了预定义的限制(超过了VM的类似限制),而不是因为我在堆空间中耗尽了内存?
我是否正确地说这java.lang.OutOfMemoryError: Requested array size exceeds VM limit
并不表示缺乏记忆?
即使我到处都有无限的内存,如果Java VM 不喜欢我创建n大小数组的请求,它仍然会抛出一个?java.lang.OutOfMemoryError: Requested array size exceeds VM limit
3.1.3详细消息:(
Requested array size exceeds VM limit
内联粗体是我的):详细消息
Requested array size exceeds VM limit
表明应用程序(或该应用程序使用的API)尝试分配大于堆大小的数组.例如,如果应用程序尝试分配512MB的数组但最大堆大小为256MB,OutOfMemoryError
则会抛出原因Requested array size exceeds VM limit
.在大多数情况下,问题是配置问题(堆大小太小),或导致应用程序尝试创建大型数组的错误,例如,当使用计算的算法计算数组中的元素数量时尺寸不正确.
更新:@Pacerier鼓励我做了一些快速测试.我写了一个示例程序:
public class VmLimitTest {
public static final int SIZE = 2;
public static void main(String[] args) throws InterruptedException {
while(true) {
byte[] a = new byte[SIZE * 1024 * 1024];
TimeUnit.MILLISECONDS.sleep(10);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用以下JVM选项运行它:
-Xms192m -Xmx192m -XX:NewRatio=2 -XX:SurvivorRatio=6 -XX:+PrintGCDetails
Run Code Online (Sandbox Code Playgroud)
这就是他们的意思:
-Xms192m -Xmx192m
)-XX:NewRatio=2
)-XX:SurvivorRatio=6
)在测试时我发现了以下内容:
OutOfMemoryError: Java heap space
这是底线 - 您无法创建大于旧代的对象.试图这样做会导致OutOfMemoryError: Java heap space
错误.那么我们Requested array size exceeds VM limit
什么时候可以期待可怕的?
我尝试使用更大的对象运行相同的程序.达到我切换到的阵列长度限制long[]
,可以很容易地达到7 GiB.声明了最大堆的128 MiB,JVM仍在抛出OutOfMemoryError: Java heap space
(!)我设法OutOfMemoryError: Requested array size exceeds VM limit
在单个对象中尝试分配8 GiB时触发错误.我在具有3 GiB物理内存和1 GiB交换的32位Linux计算机上进行了测试.
话虽这么说你应该永远不会遇到这个错误.文档似乎不准确/过时,但在一个结论中确实如此:这可能是一个错误,因为创建如此庞大的数组是非常罕见的.