【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》检查代码中是否有递归调用或死循环操作
学而不思则罔 思而不学则殆 !