提示:参考深入理解Java虚拟机
Java虚拟机栈溢出实战
前言
HotSpot不区分本地和虚拟机栈,所以设置本地方法栈大小的参数没有什么用,一般用-Xss 设定栈容量,虚拟机栈这个地方分情况抛俩异常
一、StackOverFlow(单线程)
线程请求的栈深度比虚拟机允许的栈深度,抛出StackOverFlow
- 设置-Xss参数,通过减小栈容量,来验证(虚拟机版本不同,栈的最小容量限制不同,所以设置参数时可能会遇到启动提示你栈最小容量)
虚拟机栈存放Java方法的变量和操作符,对这个变量做操作,这个变量和操作符都要入栈,方法运行完毕就是出栈完毕
/**
* @author jc
*/
public class VMStackTest {
private int stackLength = 1;
public void StackLeak() {
this.stackLength++;
this.StackLeak();
}
public static void main(String[] args) {
VMStackTest test = new VMStackTest();
try {
test.StackLeak();
} catch (Throwable e) {
System.out.println("栈长度:" + test.stackLength);
throw e;
}
}
}
结果
2. 定义了很多的本地变量,增大此方法帧中本地变量表的长度
/**
* @author jc
*/
public class VMStackLocalVariable {
private static int stackLength = 0;
public static void test() {
long unused1, unused2, unused3, unused4, unused5,
unused6