问题描述
我正在运行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);
}
}
谢谢
解决方法
为什么即使内存达到最大堆大小,JVM也不会抛出内存不足错误?
为什么?
因为array([[0,2,1],[2,1,0],[1,2]])
参数设置了最大Java堆大小,而不是Java进程的总内存大小。 JVM的很多内存利用率不在堆中。这包括:
- 用于保存
-xmx
可执行文件和共享本机库代码的内存 - 用于本机堆的内存;例如
java
以本机代码进行调用 - 用于元空间的内存
- 用于线程堆栈的内存
- 文件映射到内存时使用的内存
- 等等。
以上某些情况可能会导致OOME(例如,无法分配新的线程堆栈),但是使用malloc
设置的堆大小不会以任何方式限制它们。