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

文章目录

一、什么是内存溢出?

 二、什么是内存泄露?

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

一、什么是内存溢出?

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

 二、什么是内存泄露?

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

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

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

1.及时释放对象资源:

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

2.合理配置JVM参数:

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

3.编码严格遵守规范

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

猜你喜欢

转载自blog.csdn.net/weixin_71921932/article/details/131087333