zoukankan      html  css  js  c++  java
  • 内存泄漏和内存溢出

    1.前言

    在众多编程语言中,始终存在着内存分配与回收的问题,即便像 C#、Java 这样拥有垃圾回收机制(GC)的语言,倘若对内存管理放任不管,其实在稍不注意的时候,可能就造成了内存泄露,甚至因此程序崩溃。下面就简单介绍一下我们常听说的内存泄漏和内存溢出两者之间的关系与差别。

    2.内存泄漏和内存溢出

    内存泄露(memory leak),是指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出来。一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

    内存溢出(out of memory),是指程序在申请内存时,没有足够的内存空间供其使用。其中不能分配额外的内存供程序或操作系统使用。这样的系统将无法加载任何其他程序,并且由于许多程序可能在执行期间将附加数据加载到存储器中,因此这些将停止正常运行。这通常是因为已分配了所有可用内存,包括磁盘交换空间。其中一个典型就是堆栈溢出(stack overflow),指的是使用过多的存储器时导致调用堆栈产生的溢出(装不下是上溢,取空栈是下溢)。堆栈溢出的产生是由于过多的函数调用,导致调用无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归产生,但也可能仅仅是过多的堆栈层级,即调用层次过深。

    由此可见,内存泄漏是造成内存溢出的原因之一

    这就好比,你有一个冰箱,里面可以放10个苹果。上周的时候你买了6个苹果放到了冰箱里,但是由于你这一个月要出差,就把这些苹果放在了里面,在你出发时已经发现苹果有点坏了,但由于匆忙便忽视了。当你出差回来时苹果已经烂透了,你便想“我再去买几个苹果回来吧”,但是你并没有把之前坏掉的苹果扔掉,所以当你回来的时候看了看手中的新买的5个苹果,又看了看冰箱里面,发现已经放不下了,没办法,你只能把烂掉的苹果拿出来,但是冰箱被烂苹果弄脏了,这又需要你去清洗一下冰箱,所以你新买的苹果始终没放到冰箱里面。

    这个例子中的前6个苹果就好比你创建了一个网络连接对象放到内存中;苹果完好无损时当相当于在使用这个连接;当你回来时发现苹果烂透了还弄脏了冰箱,这就相当于你错过了在其使用域内释放资源使得你不得不清洗冰箱,这里相当于内存泄漏;然后又买了5个苹果,但是冰箱放不下了,这就相当于内存溢出了;当你清洗冰箱时就相当于程序已经崩溃要重新执行了。

    这个例子我感觉还是不怎么妥当,自己都要把自己说晕了,有什么好的比喻大家可以提一提啊。

    一句话总结,内存泄漏就是占着什么不怎么,内存溢出就是放不下。

  • 相关阅读:
    【转】acm小技巧
    poj-1703-Find them, Catch them
    poj-1611-The Suspects
    poj-2236-Wireless Network
    hdu-4496-D-City
    hdu-1213-How Many Tables
    hdu-1856-More is better
    gcd和ex_gcd
    递归趣文
    算法实质【Matrix67】
  • 原文地址:https://www.cnblogs.com/jizhiqiliao/p/9882682.html
Copyright © 2011-2022 走看看