文章目录本文来说下JVM性能优化之栈区域OOM问题
- 概述
- StackOverflowError异常
- 本文小结
概述
关于虚拟机栈和本地方法栈,分析内存异常类型可能存在以下两种:
- 如果现场请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
- 如果虚拟机在扩展栈时无法申请到足够的内存空间,可能会抛出OutOfMemoryError异常。
可以划分为两类问题,当栈空间无法分配时,到底时栈内存太小,还是已使用的栈内存过大。
StackOverflowError异常
- 使用-Xss参数减少栈内存的容量,异常发生时打印栈的深度。
- 定义大量的本地局部变量,以达到增大栈帧中的本地变量表的长度。
设置JVM启动参数:-Xss128k设置栈内存的大小为128k。
JavaVMStackSOF.java
package cn.wideth.buz.utils;
public class JavaVMStackSOF {
private int stackLength = 1;
private void stackLeak() {
stackLength++;
stackLeak();
}
public static void main(String[] args) {
JavaVMStackSOF oom = new JavaVMStackSOF();
try {
oom.stackLeak();
} catch (Throwable e) {
System.out.println("Stack length: " + oom.stackLength);
throw e;
}
}
}
测试结果:
分析:在单个线程下,无论是栈帧太大还是虚拟机栈容量太小,当无法分配内存的时候,虚拟机抛出的都是StackOverflowError异常
本文小结
本文介绍了JVM性能优化之栈区域OOM问题



