1.模拟OutOfMemoryError
package com.example.demo.chapter04;
/**
* OutOfMemoryError:内存溢出
* 意思是对象所占据的空间超过了堆内存的空间了,
* 因此模拟它的方式就是组装一个超级大的对象就行,
* 于是通过大量循环来生成字符串就可以达到这个效果
*
* @author Administrator
*
*/
public class OutOfMemoryErrorTest {
public static void main(String[] args) {
String name = "hello";
for (int i = 0; i < 10000000; i++) {
name += name;
}
System.out.println(name);
}
}
输出结果:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at com.example.demo.chapter04.OutOfMemoryErrorTest.main(OutOfMemoryErrorTest.java:17)
2.模拟 StackOverflowError
package com.example.demo.chapter04;
/**
* StackOverflowError :栈溢出
* 什么时候会让 Java Method Stack 栈溢出啊?
* 栈的基本特点就是 FILO(First In Last Out),
* 如果 in 的太多而 out 的太少,就好 overflow 了。
* 而 Java Method Stack 的功能就是保存每一次函数调用时的“现场”,
* 即为入栈,函数返回就对应着出栈,所以函数调用的深度越大,栈就变得越大,足够大的时候就会溢出。
* 所以模拟 Java Method Stack 溢出,只要不断递归调用某一函数就可以。
* @author Administrator
*
*/
public class StackOverflowErrorTest {
private static int stackLength = 0;
public void stackOverflow() {
++ stackLength;
stackOverflow();
}
public static void main(String[] args) {
StackOverflowErrorTest test = new StackOverflowErrorTest();
try {
test.stackOverflow();
} catch (Throwable e) {
System.out.println("stack length: " + test.stackLength);
throw e;
}
}
}
输出结果:
stack length: 22415
Exception in thread "main" java.lang.StackOverflowError
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
at com.example.demo.chapter04.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:20)
3.模拟 OutOfMemoryError: PermGen
package com.example.demo.chapter04;
import java.util.ArrayList;
import java.util.List;
/**
* 1.设置运行时jvm的参数:
* Run->Run Configuartion->PermGenTest->Arguments->VM arguments
* -XX:PermSize=5M -XX:MaxPermSize=5M -Xms5M -Xmx5M -XX:-UseGCOverheadLimit
* 2.设置jdk为1.7,因为jdk1.8已经不支持XX:PermSize参数
* 3.执行当前方法
* @author Administrator
*
*/
public class PermGenTest {
static String base = "string";
public static void main(String[] args) {
try {
List list = new ArrayList();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
String str = base + base;
base = str;
list.add(str.intern());
}
System.out.println(list.size());
} catch (Exception e) {
e.printStackTrace();
}
}
}