2022-03-30 StackOverflowError与OutOfMemoryError详解

如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

一 StackOverflowError 方法无线调用, 使得栈指针层数过多 ,栈满了

设置参数:Xss

二 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。就是整体的内存耗尽了,例如有个方法无线加入对象,或者有很多对象存在引用,导致GC无法回收;

设置参数:Xms(初始堆大小)和Xmx([最大堆]大小)
如:set JAVA_OPTS= -Xms1024m -Xmx2048m
表示启动时分配堆内存1G,最大堆[内存]2G

主要分为两种
java heap space 老年代满了,对象无法回收
permgen space 新生代满了,对象无法被创建,没有空间了

jvm 中的新生代,老年代

新生代分为 伊甸园区,from 和 to 区;

伊甸园区是新对象分配内存的地方;如果Eden区内存也用完了,则会进行一次Minor GC(轻GC),复制算法, 将存活的对象复制到 to区,然后清空伊甸园区域,并且from和to交换位置; to区会把一些存活得足够旧的对象移至年老代。

老年代里存放的都是存活时间较久的,大小较大的对象,因此年老代使用 标记整理算法 。当年老代容量满的时候,会触发一次Major GC(full GC),回收年老代和年轻代中不再被使用的对象资源。

存放的数据
栈: 存放的是基本类型数据,已经对象的引用指针
堆: 存放对象 被所有线程共享
方法区: class文件,静态变量/方法 所有线程共享

你可能感兴趣的:(2022-03-30 StackOverflowError与OutOfMemoryError详解)