-1

我正在运行一个 Java 编程,它在 while 循环内的内存中创建更多对象。我将最大堆大小设置为 10MB。我正在看任务管理器,JVM 甚至在 10 MB 之后运行。我期待内存不足。但它不是抛出,而是在 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);
    }
}

谢谢

4

1 回答 1

1

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

为什么?

因为该-xmx参数设置了最大 Java 堆大小,而不是 Java 进程的总内存大小。很多 JVM 的内存利用率不在堆中。这包括:

  • 用于保存java可执行和共享本机库代码的内存
  • 用于本机堆的内存;例如malloc在本机代码中调用
  • 用于元空间的内存
  • 用于线程堆栈的内存
  • 文件映射到内存时使用的内存
  • 等等。

上述某些情况可能会导致 OOME(例如,无法分配新的线程堆栈),但您设置的堆大小-xmx不会以任何方式限制它们。

于 2020-09-04T06:35:01.573 回答