本次在eclipse中实践本异常:
通过递归调用自己,无结束语句制造栈溢出的情况 ,或在多线程的模式下无限创建线程来实践OOM的情况。
1. 栈溢出的情况(StackOverflowError)
虚拟机参数设置:-Xss128k
/**
* JavaVMStackSOF.java
* @author anyunpei
*2019年1月16日下午7:07:03
* VM Args: -Xss128k
* 测试栈的内存溢出
*/
public class JavaVMStackSOF {
private int stackLength=1;
/**
* 递归调用,不断入栈到溢出
*/
public void stackLeak() {
stackLength++;
stackLeak();
}
public static void main(String[] args) {
JavaVMStackSOF sof = new JavaVMStackSOF();
try {
sof.stackLeak();
} catch (Throwable e) {
System.out.println("栈深度"+sof.stackLength);
throw e;
}
}
}
调整虚拟机参数:
结果:
补充:
在设置虚拟机栈的内存大小时,需至少>=108KB。
在单线程中一般不会出现OOM的情况,一般只会出现SOF异常。
在多线程中,如果因为建立了过多的线程导致内存溢出OOM,在无法减少线程的情况下,可以通过减小最大堆和减小栈容量来换取更多的线程。
2. 无限创建线程来实践OOM的情况
虚拟机参数:
-Xss2m
测试代码:
package oom;
/**
* JavaVMStackOOM.java
* @author anyunpei
*2019年1月16日下午8:13:04
*VM Args:-Xss2m
*/
public class JavaVMStackOOM {
/**
* 一个不会结束的线程
*/
private void dontStop() {
while (true) {
}
}
/**
* 一个不会停止生成线程的类
*/
public void test() {
while (true) {
Thread thread = new Thread(
new Runnable() {
public void run() {
dontStop();
}
}
);
thread.start();
}
}
/**
* 主线程运行测试类
* @param args
*/
public static void main(String[] args) {
new JavaVMStackOOM().test();
}
}
博主测试这段代码时失败,博主是16g的内存。只会让系统卡死,也不会出现OOM的情况 _(:з」∠)_
劝大家不要作死运行上面的代码了,博主亲测蓝屏。o(* ̄︶ ̄*)o
参考:《深入理解JVM虚拟机》