内存溢出 内存溢出是相对于内存泄露来说的,尽管这样更容易理解,但是同样的,内存溢出也是引发程序奔溃的罪魁祸首之一。
就是内存不够用
由于GC一直发展,所以一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则是不太容易出现OOM (OutofMemoryError)的情况。
大多数情况下,GC会进行年龄段的垃圾回收,实在不行就来一次独占式的Full GC的操作,这时候就会回收大量的内存,供应运程序继续使用。
javadoc中对OutifMemoryError的解释是,没有空闲内存,并且垃圾收集器也无法提供更多的内存。
内存泄露 内存泄露也叫做“存储渗漏”。严格的来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄露。
但实际的情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄露”。
尽管内存泄露并不会立刻导致程序的崩溃,但是一旦发生内存泄露,程序中的可用内存就会被逐步蚕食,直至内存耗尽所有,最终出现OutofMemory异常,最终到时程序奔溃。
注意,在这里的存储空间并不是指物理内存,而是指虚拟内存的大小,这个虚拟内存大小取决于磁盘交换区设定的大小。
【JVM|内存溢出和内存泄露】例如:
- 与数据库连接完毕之后,需要关闭连接的通道,但是没有关闭。
- IO读写完成后没有关闭
- 单例模式:单例的生命周期和应用程序一样长,所以在单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄露的产生。
- 一些提供close()的资源 未关闭导致内存泄露。
- 数据库连接dataSourse.getConnection(),网络连接socket和io连接必须手动close,否则是不能被回收的。
推荐阅读
- java|用Java实现三大基本排序(冒泡排序、选择排序、插入排序)。个人思路
- 对象已死()
- instanceof踩坑
- Map集合遍历的两种方式
- C++语言程序设计基础|第3章 函数
- 31日打卡|蓝桥真题31日冲刺 | 每日三题题解报告 第二天
- java|用Compose实现手写春联效果
- 程序员|手把手教你用python来制作春联,是时候让你大展身手了
- Spring Boot 保护敏感配置的 4 种方法,让你的系统不再裸奔!!