读书笔记-深入了解JVM虚拟机-1.JVM-Stack造成的OOM的理解

读书笔记-深入理解JVM虚拟机-1.JVM-Stack造成的OOM的理解
-Xss128k:这个JVM参数用来配置栈的大小为128k
因为栈是线程私有的(不清楚的可以去了解下JVM虚拟机结构),所以如果我们启动一个线程,并且在这个线程中调用一个递归,就会产生该异常。


/**
 * VM Args:-Xss128k
 * 
 */
public class JavaVMStackSOF {


	private int stackLength = 1;


	public void stackLeak() {
		stackLength++;
		stackLeak();
	}


	public static void main(String[] args) throws Throwable {
		JavaVMStackSOF oom = new JavaVMStackSOF();
		try {
			oom.stackLeak();
		} catch (Throwable e) {
			System.out.println("stack length:" + oom.stackLength);
			throw e;
		}
	}
}




分析:
1.主线程中调用JavaVMStackSOF的stackLeak()方法 而在stackLeak()中也是调用自身
2.每调用自身一次就会生成一个栈帧(栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)),所以会占用一定的空间
3.我们设置的-Xss128k 也就是说主线程的栈空间只有128k。当栈空间不足的时候就会爆出OOM异常 - Exception in thread "main" java.lang.*Error

版权声明:本文为博主原创文章,未经博主允许不得转载。