1.虚拟机常见异常
- Java虚拟机规范允许Java栈的大小是动态的或者是固定不变的。
- 如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过java虚拟机栈允许的最大容量,java虚拟机将会抛出一个StackOverflowError异常;
- 如果Java虚拟机栈可以动态扩展,并且尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常;
2.测试栈的大小
/**
* 创建人: 渣高帆 <br/>
* 创建时间: 2020/6/30 11:32<br/>
* JDK 1.8
*/
public class Stack_Test01 {
public static int i=1;
public static void main(String[] args) {
//我的电脑默认测试JVM栈的大小为9750左右
//添加JVM命令行参数:-Xss1024k 之后为9777左右
//添加JVM命令行参数:-Xss1m 之后为9789左右
System.out.println(i++);
main(args);
}
}
3.设置栈内存大小
我们可以使用虚拟机参数-Xss 选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度;
-Xss size
设置线程堆栈大小(以字节为单位)。附加字母k
或K
表示KB,m
或M
表示MB,和g
或G
表示GB。默认值取决于平台:
- Linux / x64(64位):1024 KB
- macOS(64位):1024 KB
- Oracle Solaris / x64(64位):1024 KB
- Windows:默认值取决于虚拟内存
下面的示例以不同的单位将线程堆栈大小设置为1024 KB:
复制-Xss1m (1mb)
-Xss1024k (1024kb)
-Xss1048576
设置方式如下图所示: