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

时间:2020-09-04 06:24:58

标签: java memory-leaks out-of-memory heap-memory heap-profiling

我正在运行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);
    }
}

谢谢

1 个答案:

答案 0 :(得分:1)

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

为什么?

因为array([[0, 2, 0, 2, 1], [2, 1, 2, 1, 0], [1, 0, 0, 0, 2]]) 参数设置了最大Java堆大小,而不是Java进程的总内存大小。 JVM的很多内存利用率不在堆中。这包括:

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

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