StackOverflowError
Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法。
public class StackOverFlowErrorTest {
public static void main(String[] args) {
getint();
}
private static int getint(){
getint();
return 0;
}
}
OutOfMemoryError
内存溢出,JVM不能分配给对象的创建空间.并且GC也不能够回收足够的空间.当你创建对象的速度快于JVM回收空间的时候就会发生空间不足这个问题
public class OutMemoryTest {
public static void main(String[] args) {
List<String> re = new ArrayList<String>();
while (true) {
String[] strings = new String[10000];
re.addAll(Arrays.asList(strings));
}
}
}
总结如下:
当某次线程运行计算时,需要占用的 Java 虚拟机栈(Java Virtual Machine Stack)大小,也就是 Java 线程栈大小,超过规定大小时,抛出 StackOverflowError
如果 Java 虚拟机栈大小可以动态扩容,发生扩容时发现内存不足,或者新建Java 虚拟机栈时发现内存不足,抛出 OutOfMemoryError
当所需要的堆(heap)内存大小不足时,抛出 OutOfMemoryError
当方法区(Method Area)大小不够分配时,抛出 OutOfMemoryError
当创建一个类或者接口时,运行时常量区剩余大小不够时,抛出 OutOfMemoryError
本地方法栈(Native Method Stack)大小不足时,抛出 StackOverflowError
本地方法栈(Native Method Stack)扩容时发现内存不足,或者新建本地方法栈发现内存不足,抛出 OutOfMemoryError