例如:
Runtime.getRuntime().maxMemory(); // 1216348160, ~1.2Gb
Runtime.getRuntime().totalMemory(); // 188997632, ~188Mb
Runtime.getRuntime().freeMemory(); // 93796384, ~93Mb我认为在这种情况下,JVM会尝试分配更多的内存,达到maxMemory限制,而不是抛出面向对象对象模型。
在java之前的7天里,如果PermGen耗尽了,就可能发生这种情况,但现在PermGen被无界的元空间所取代。
物理机上有大量空闲的交换空间,因此JVM应该完全能够分配更多的内存。
发布于 2015-12-07 22:49:14
您正在尝试使用"new“运算符创建一个大小为1000000000的字符串数组。所以这个数组能够容纳1000000000个对象引用。我们所知道的内存是从java堆中分配的。堆的最大大小(根据maxMemory)为1.2 GB。
我的理论(基于下面的数学)-假设它是一台32位机器,每个对象引用将占用4个字节。因此,1000000000个对象引用将占用4000000000个字节,接近3.7G,而最大堆仅为1.2G。因此这会导致OOM java堆错误。
-Madhu。
https://stackoverflow.com/questions/34134913
复制相似问题