这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战
尽管有GC自动帮我们清理内存空间,但是还是不可避免会出现OOM的情况
什么是OOM
所谓的OOM,也就是常说的 Out Of Memory ,直译过来就是内存溢出,超过了JVM能分配的内存,并且垃圾回收也无济于事的时候,就会抛出Java.lang.OutOfMemoryError.
关于OOM
- StackOverflowError 异常
StackOverflowError异常也就是栈溢出,也就是JVM的虚拟机栈 —— 保存执行方法时的局部变量表、操作数栈、动态连接和方法返回地址等信息,方法执行时入栈,执行结束出栈;
- 显而易见,也就是每次调用方法的时候不断地入栈出栈。在极端的情况下,方法调用的深度 > JVM设定的虚拟机栈深度,就会抛出这个异常。
- 虽然说得云里雾里,但是举个简单的例子就会一目了然。
- 大家接触算法题的时候,或者接触数据结构的时候;或多或少都会遇到树 这种结构。
- 树的遍历这种方式,存在 DFS 和 BFS ,而DFS 往往就会用到递归。
- 递归这种方式,可以说最容易导致StackOverflowError这种异常。
- 递归,原则上就是不断调用方法,常用于贪心等算法题。因为需要编写代码数少,深受我自己的喜欢(哈哈哈),但是也会受到毒打。
- 在一次社会实践上,面试官给了一道遍历树的简单题,我反手一个递归,深度遍历,信手粘来。结果就抛出异常了。
- 虚拟机拓展栈帧时无法申请到足够的内存空间
-
当我们运行 一个死循环的线程时,因为CPU的分配是动态+偏向的;会导致所有的资源都往死循环偏移;导致最终所有资源都在死循环内;
-
当我们想要中止该死循环时,虚拟机需要用信号处理器启动一个线程去做这个终止通知的操作,但是已经陷入死循环没有资源了,这个时候就会导致OOM
-
这就像那个经典梗图一样, 出去实习 → 无经验被拒 → 实习获取经验
-
需要终止线程死锁,需要新增一个线程去做终止操作;但是线程死锁的原因偏偏就是资源都用尽了;那又怎么能新增线程成功呢。
-