java—为什么即使内存达到最大堆大小,jvm也不会抛出内存不足错误?

h7wcgrx3  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(529)

我正在运行一个java编程,在while循环中在内存中创建更多的对象。我将最大堆大小设置为10mb。我正在看任务管理器,jvm甚至在10mb之后运行。我正期待着失去记忆。但它不是抛出,而是在while循环中不断打印语句。 java -Xmx10m Main ```
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
String s1 = "01011001100100";
char[] charArray = s1.toCharArray();
int index = 0;
StringBuffer result = new StringBuffer();
StringBuffer temp = new StringBuffer();

    while(index < charArray.length){
        System.out.println(index+" : "+charArray[index]);
        if(charArray[index] == '1' && charArray[index--] == '0'){***--- This is buggy code***
            result.append(1);
        } else {
            temp.append(charArray[index]);
        }
        index++;
    }
    System.out.println("Result >"+result);
}

}

谢谢
uemypmqf

uemypmqf1#

为什么即使内存达到最大堆大小,jvm也不会抛出内存不足错误?
为什么?
因为 -xmx 参数设置java进程的最大java堆大小,而不是总内存大小。jvm的很多内存利用率都不在堆中。这包括:
用于保存 java 可执行和共享本机库
用于本机堆的内存;例如 malloc 本机代码中的调用
用于元空间的内存
用于线程堆栈的内存
将文件Map到内存时使用的内存
等等。
上面的一些问题可能会导致oome(例如,无法分配新的线程堆栈),但是使用 -xmx 不会以任何方式限制它们。

相关问题