什么是内存溢出?什么是内存泄露?

古城微笑少年丶 2024-03-16 14:18 95阅读 0赞

文章目录

一、什么是内存溢出?

二、什么是内存泄露?

三、如何避免内存溢出和内存泄露?

一、什么是内存溢出?

假设我们JVM中可用的内存空间只有3M,但是我们要创建一个5M的对象,那么新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。就好比是一个容量只有300ml的水杯,我们硬要往里面倒500ml的水,这时候水倒不进去溢出来了,相当于内存溢出。如下图所示:

51bd36a3e5fc49f083f86d11a50f1a3b.png

二、什么是内存泄露?

假设创建了两个1M的对象,一起会占用2M内存。当对象使用完之后,这两个对象并没有释放,因此内存中会留下2M的内存空间一直被占用。而我们的业务代码在程序中会被反复执行,每次执行都会留下2M不被释放,反复执行多次之后,随着时间的累积,就会有大量的对象用完不被释放,导致这些对象不能得到回收,这种情况就叫做内存泄露

也就是说,在我们的业务代码执行过程中,有些对象它应该被回收,但是又有其他对象引用它,因此GC不能自动回收。所以,该回收的垃圾对象没有被回收,垃圾对象越来越多,可用内存越来越少,若可用内存无法存放新的垃圾对象,最终导致内存泄露。内存泄露最终导致内存溢出。

7bb4c062dcc141e3b3e32b265b279027.png

三、如何避免内存溢出和内存泄露?

1.及时释放对象资源:

在使用完对象后,应该及时将其释放掉。例如,对于一些持有系统资源的对象,如数据库连接、文件句柄等,应该在不需要使用它们时,及时关闭/释放,避免占用系统资源

2.合理配置JVM参数:

通过合理配置JVM的参数,如-Xmx、-Xms等,进行最大堆内存和初始堆内存的配置,避免堆内存溢出。也可以配置JVM的GC策略来优化GC效率,降低内存占用。

3.编码严格遵守规范

我们使用到一些流对象的时候,比如OutputStream,Reader,BitMap,Document,很容易忘记Close。最麻烦的是还要顺序回收,顺序错了还产生空指针,因此在编码过程要注意,避免低级错误。

发表评论

表情:
评论列表 (有 0 条评论,95人围观)

还没有评论,来说两句吧...

相关阅读

    相关 内存数据库什么

    内存数据库主要是把磁盘的数据加载到内存中进行相应操作。 与直接读取磁盘数据相比,内存的数据读取速度要高出几个数量级,因此,将数据保存在内存中能够极大地提高应用的性能。 内存

    相关 什么JVM内存模型

    Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存