1、堆溢出
Java heap space
/**
* 添加参数,限制堆动态扩展: -Xms20m -Xmx20m
*/
public class HeapOut{
static class OOMObject {
}
public static void main(String[] args) {
List<OOMObject> outList = new ArrayList<>();
while (true) {
outList.add(new OOMObject());
}
}
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at com.rich.file.Test.main(Test.java:33)
2、虚拟机栈溢出
a、堆栈类型的溢出
public class JavaVmStackOut {
private static int stackLength = 0;
private static void stackLeak() {
stackLength += 1;
stackLeak();
}
public static void main(String[] args) {
try {
stackLeak();
}catch (Throwable e) {
System.out.println("stackLength:" + stackLength );
e.printStackTrace();
}
}
}
stackLength:12560
java.lang.StackOverflowError
at com.rich.file.JavaVmStackOut.stackLeak(JavaVmStackOut.java:22)
实际是写一个递归,将方法栈无限制压入虚拟机栈,直到溢出。
b、多线程情况下的溢出:系统可能会假死。
public class JavaVmStackOut {
public static void stackLeakThread() {
while (true) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {}
}
});
thread.start();
}
}
public static void main(String[] args) {
try {
stackLeakThread();
}catch (Throwable e) {
System.out.println("stackLength:" + stackLength );
e.printStackTrace();
}
}
}
3、方法区与运行时常量池溢出
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
int i = 300;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}