`
starbhhc
  • 浏览: 654474 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

内存溢出和内存泄漏的区别

 
阅读更多

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

 

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 


内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 

   以发生的方式来分类,内存泄漏可以分为4类: 


1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。 
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到 。

分享到:
评论

相关推荐

    内存泄漏与内存溢出

    在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...

    Python内存泄漏和内存溢出的解决方案

    虽然Python有内置的垃圾回收机制,但仍然可能出现内存泄漏和内存溢出的问题,影响程序的稳定性和效率。 **一、Python内存泄漏** 内存泄漏通常是由于以下几个原因引起的: 1. **C扩展模块的内存泄漏**:使用C语言...

    Qt内存溢出检测

    在C++中,程序员需要手动分配和释放内存,如果没有正确地释放已分配的内存,就会出现内存泄漏,长期累积可能导致内存溢出。 Qt库中提供了智能指针(如QPointer、QSharedPointer)和对象所有权(如QObject的parent-...

    JAVA内存溢出问题总结

    内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决。 从程序类方面来说,内存溢出的原因有很多,以下是常见的几种: 1、查询数据库的时候递归循环了,应尽量使用精简的关联 SQL ...

    java内存泄露、溢出检查方法和工具

    解决内存溢出问题通常需要调整JVM的内存参数,如`-Xms`和`-Xmx`用于设置堆的初始大小和最大大小,以及`-XX:MaxPermSize`(对于较旧的JVM版本)或`-XX:MaxMetaspaceSize`(对于Java 8及以上版本)来控制方法区的大小...

    易语言防止文件内存溢出源码

    4. **及时释放资源**:在完成对文件数据的操作后,确保立即释放不再需要的内存和资源,避免内存泄漏。 5. **异常处理**:设置适当的错误处理机制,当检测到可能出现内存溢出的情况时,可以及时释放已分配的内存,并...

    JVM内存溢出问题解析

    同时,虚拟机不回收内存(内存泄漏)也可能导致内存溢出。 解决内存溢出的方法有两种:一是优化程序代码,减少全局变量的引用,让程序使用完变量的时候释放该引用,能够让垃圾回收器回收,释放资源;二是物理解决,...

    MySQL OOM(内存溢出)的解决思路

    OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...

    处理bitmap内存溢出问题

    在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...

    图片过大引起的内存溢出解决方案

    ### 图片过大引起的内存溢出解决方案 在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的...

    如何避免JDBC引起的内存溢出情况

    本文将重点讨论如何在MySQL、SQL Server以及Oracle三种不同的数据库环境下,通过合理配置和优化策略来避免内存溢出。 #### 一、理解内存溢出的原因 内存溢出通常发生在应用程序消耗了超出虚拟机所能分配的最大堆...

    解决jetty8内存溢出版本

    Jetty 8是一款轻量级、高性能的Java Web服务器和Servlet容器,被广泛用于开发、测试和部署Web应用程序。...通过对上述知识点的理解和实践,可以有效地预防和解决Jetty 8的内存溢出问题,提高服务的稳定性和性能。

    Android 内存溢出和内存泄漏的问题

    Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是指程序在申请内存时,没有足够的内存空间...

    Java内存溢出和内存泄露共4页.pdf.zip

    内存溢出(Memory Overflow)和内存泄露(Memory Leak)是两个常见的问题,它们会导致程序性能下降,甚至崩溃。了解并解决这些问题对于优化Java应用程序至关重要。 内存溢出是指程序在申请内存时,无法在堆内存中...

    内存溢出解决

    ### 内存溢出解决 #### 背景与概念 在Java开发中,内存管理是确保应用程序稳定运行的关键因素...此外,定期对代码进行审查和重构也是预防内存溢出的有效手段之一。希望本文能帮助到正在面对内存溢出问题的开发者们。

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    spring mvc重定向导致内存溢出解决方案

    ### Spring MVC 重定向导致内存溢出解决方案 在Spring MVC框架中进行页面重定向...综上所述,通过合理的策略和技术手段,我们可以在Spring MVC项目中有效避免由重定向导致的内存溢出问题,提高系统的稳定性和可靠性。

    android内存的溢出和泄漏问题

    本文主要讨论的是Android中的两个关键问题:内存溢出和内存泄漏。 内存溢出(Memory Overflow)发生在程序试图分配超过系统可提供的内存时。这通常是因为程序设计不当,导致数据结构或变量的尺寸超过了实际可用的...

Global site tag (gtag.js) - Google Analytics