内存溢出和内存泄漏
内存溢出 out of memory
指程序在申请内存时,没有足够的内存空间使用,假如我申请了一个Integer的数是4位的, 但我放入的是一个Long类型的8位数据, 会产生内存的溢出.
内存泄漏 memory leak
这是指程序在申请了内存后,无法将其释放空间,一次程序的内存泄漏可能不会造成太大的损害,但内存泄漏堆积后果是严重的,因为无论多少内存,始终将会被占用光
内存泄漏的四种发生方式:
-
常发性内存泄漏
发生内存泄漏的代码多次会被执行, 每次执行就会有一次内存泄
-
偶发性内存泄漏
发生内存泄漏只在某种情况下会发生,也可能在特定的情况下会经常发生,所以在许多环境的都要对内存泄漏测试
-
一次性内存泄漏
内存泄漏的代码只会被执行一次,例如new一个对象时分配内存,最后未被回收
-
隐式内存泄漏
隐式内存泄漏在服务器中比较可怕,它指的是程序运行时不断的分配内存,最终结束程序时释放,但是对于服务器来说,一开会开很久,而不及时释放内存最终会导致崩盘. 严格来说这不是内存泄漏
内存溢出的原因和解决方法
原因:
- 内存数据量一次加载过大,例如我电脑只剩余8G内存,你给我9G,会发生内存溢出,或者一次性从数据库取出过多数据
- 代码有死循环,或循环产生太大的内存消耗
- 有使用完成的引用未被清楚
- 内存启动参数值启动小
- BUG
解决方法
- 修改内存启动参数,既JVM启动参数,增加内存
- 使用内存查看内存使用情况
- 走查代码发现内存溢出的地方
- 日志
内存泄漏的解决办法一般只有走查代码,若是自用电脑小项目无所谓,若是服务器内存泄漏就会要挨打的