JVM 知识--内存溢出和内存泄漏

本文最后更新于:5 个月前

内存溢出(MemoryOverflow)就是你要求分配的内存超出了系统给你的,导致系统无法再给你提供内存资源(内存资源耗尽)

内存泄漏(MemoryLeak)就是申请到了内存空间,但是没有及时清理内存垃圾,或者用到了不属于自己的内存,于是产生泄漏

例子:

  1. 内存溢出则是一个时间点,即申请内存但是申请不到,没有多余的内存分配了

    例如死循环 new 对象,但是又不用 (MemoryLeak),仅仅加入到 list 里面,最后还在继续申请但是已经没有内存空间了,结果发生 OOM (MemoryOverflow)

  2. 内存泄漏是指一个过程,或者说一段时间

    泄漏是说程序逻辑问题,造成申请的内存无法正确释放,或者是你用到了不属于你的内存 (例如数组越界)

    例如:堆栈调用过多,会导致超出虚拟机栈深度,StackOverFlowError,实际上也是一种内存泄漏

    内存溢出是申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用(可达但无用),这样会造成程序能使用的内存越来越少,内存空间就这么一点点被蚕食,再去申请就会没有多余的内存,会使程序抛出 OOM 异常,导致内存溢出

    溢出是代码编写问题,这样无论多少内存,早晚都会被占用光的

    比喻就是:比如有10张纸,本来一人一张,画完自己擦了还回去,别人可以继续画,现在有个坏蛋要了纸不擦不还,然后还跑了找不到人了,如此就只剩下9张纸给别人用了(泄漏),这样的人多起来后,最后大家一张纸都没有了。(最终溢出)