【Java】【JVM】你必须了解的内存溢出和内存泄漏

什么是内存溢出和内存泄漏呢?

  • 内存溢出(Out Of Memory —— 也就是常说的OOM)
系统已经不能再分配出多余的空间给你所使用了。

比如:你从数据库查询出了100M的数据,但是系统只有90M的数据了,boom!!!没那么多内存了,所以就炸了

  • 内存泄漏(Memory Leak)
在你使用一块资源时,给他分配了一部分空间;当你不再使用了之后,并没有回收它,但是它确实没有用了,就造成了内存泄漏。

如果内存泄漏次数过多,就容易造成内存溢出。

  • 此外也顺便介绍一下栈溢出(StackOverFlow)

由于Java中存在虚拟机栈的概念,说白了就是栈空间无法分配多余的空间来使用。

那么内存溢出的原因都是什么呢?又该如何避免或解决内存溢出呢?

  • 先说下内存溢出的原因?
1》一次性分配大量数据空间,而导致内存空间不足,比如从数据库一次性查询大量数据

2》JVM中启动参数设置过小

3》集合类中的对象使用完成后未被回收,导致对象内存泄漏过多而产生内存溢出

4》使用第三方软件包可能会出现不熟悉的BUG等

5》方法递归,死循环,从而容易导致栈内存溢出
  • 如何避免内存溢出呢?
1》在JVM启动前,预估好内存分配空间大小设置

2》检查循环是否有重复产生大量新对象实体

3》检查List、Map等集合框架是否有引用的对象在使用后,并没有被回收

4》检查代码中是否有递归调用或死循环操作
原文地址:https://www.cnblogs.com/boluopabo/p/13068073.html