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

Java 为什么即使内存达到最大堆大小,JVM也不会抛出内存不足错误?,java,memory-leaks,out-of-memory,heap-memory,heap-profiling,Java,Memory Leaks,Out Of Memory,Heap Memory,Heap Profiling,我正在运行一个Java编程,在while循环中在内存中创建更多的对象。 我将最大堆大小设置为10MB。我正在观看任务管理器,JVM甚至在10MB之后运行。 我期待着失去记忆。但它不是抛出,而是在while循环中继续打印语句 java-Xmx10m主 谢谢 为什么即使内存达到最大堆大小,JVM也不会抛出内存不足错误 为什么? 因为-xmx参数设置Java进程的最大Java堆大小,而不是总内存大小。JVM的很多内存利用率都不在堆中。这包括: 用于保存java可执行文件和共享本机库代码的内存 用于本机

我正在运行一个Java编程,在while循环中在内存中创建更多的对象。 我将最大堆大小设置为10MB。我正在观看任务管理器,JVM甚至在10MB之后运行。 我期待着失去记忆。但它不是抛出,而是在while循环中继续打印语句

java-Xmx10m主

谢谢

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

为什么?

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

用于保存java可执行文件和共享本机库代码的内存 用于本机堆的内存;e、 g.本机代码中的malloc调用 用于元空间的内存 用于线程堆栈的内存 将文件映射到内存时使用的内存 等等
上面的一些可能会导致OOME,例如,无法分配新的线程堆栈,但是使用-xmx设置的堆大小不会以任何方式限制它们。

谢谢Stephen。如何通过任何GUI查看堆,以及堆栈。我想看,你说的看是什么意思?你的意思是跟踪使用了多少内存?一般来说,这不是一件有用的事情……是的。我只想监视内存的利用情况,并想了解垃圾收集。
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);
    }
}