StackOverFlowError:
当启动一个新的线程是虚拟机会为其分配一个新的栈空间,Java栈以帧为单位保证线程运行状态。当线程调用一个方法时JVM会压入一个新的栈帧到这个线程的栈空间中,只要这个方法还没有返回则这个栈帧就会一直存在。所以方法的嵌套调用太多(如递归调用),随着栈帧的增加导致总和大于JVM设置的-Xss值就会抛出StackOverFlowError异常
OutOfMemoryError:
堆内存溢出:当需要为对象示例化分配内存空间时,而堆的占用已经达到了设置的最大值(-Xmx),就会抛出OutOfMemoryError异常。
方法区内存溢出:方法区存放Java类信息(如类名、访问修饰符、常量池、字段描述、方法描述),在类加载器记载class文件到内存时JVM会提取累的这些信息到方法区,而此时如果需要存储这些类信息且方法区的内存占用已经达到最大值(-XX:MaxPermSize)则会抛出OutOfMemoryError异常。