虚拟机栈和本地方法栈溢出

由于HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此,虽然设置本地方法栈大小的参数
(-Xoss)存在,但是无效,栈容量只能由-Xss参数设定。

关于虚拟机栈和本地方法栈溢,在java虚拟机规范中描述了两种异常:

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常
如果虚拟机在扩展栈时无法申请到足够内存空间,则抛出OutOfMemoryError异常
虽然分成两种情况,但是这两者也有一些共同之处:当栈空间无法继续分配时,到底是内存大小,还是已使用的栈空间太大,其本质上只是对同一件事情的两种描述。
在实例中,将实验范围限制于单线程中的操作。
分为两种情况:
使用-Xss参数减少栈内存容量。结果抛出异常,异常出现时输出的堆栈深度相应缩小。
定义了大量的本地变量,增大此方法帧中本地变量表的长度。结果抛出异常,输出的堆栈深度相应缩小。

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;
			}
		}
	}
}

运行结果:

Exception in thread "main" java.lang.StackOverflowError

猜你喜欢

转载自blog.csdn.net/fight252/article/details/91353574
今日推荐