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

    内存泄露

    内存泄漏memory leak 是指那些本应该回收(不再使用)的内存对象无法被系统回收的现象。在c++中需要程序猿手动释放内存对象,所以在C++中更容易存在内存泄漏。java引入了自动回收机制,使得在C++中令人头疼的内存问题得到了有效的改善,但这并不意味着java程序员不关注内存,因为垃圾回收机制不能完全保证内存对象在该释放的地方释放,现代java虚拟机中普遍使用根集算法去计算对象的引用可达性,不可达的才能回收,例如下图中的无用对象被有用对象引用着,导致无用对象引用一直可达,系统回收器不敢冒然回收,从而造成内存泄漏。如果发生内存泄露,那么可用内存会逐渐减少,从而降低性能。



    内存溢出

    内存溢出out of memory,是指程序在为自身申请内存时,没有足够的内存空间供自己使用,出现out of memory;比如你为程序申请了一个integer,但是只给它存了long才能存下的数,就是内存溢出。内存溢出就是你要求被分配的内存超出了系统能给你的内存,系统不能满足你的需求,于是产生溢出。当发生内存溢出时,程序将无法进行,强制终止

    二者关系

    memory leak最终会导致out of memory!

    Java可能出现的内存溢出

    • 在程序中存在死循环,或者循环过多,而产生了过多重复的对象的实例;
    • 存在对象的引用,使用完后没有清除,导致JAVA虚拟机不能回收;
    • 一次操作时,在内存中加载了大量的数据;

      原则上来说,在JAVA中,由于它的自动垃圾回收机制,出现内存溢出的可能性并不是很大,但还是会出现。

    内存泄露出现类型

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

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

    内存泄露的后果

        内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
      内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
      在以下情况,内存泄漏导致较严重的后果

    •  程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
    •  新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
    •  程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
    •  泄漏在操作系统内部发生;
    •  泄漏在系统关键驱动中发生;
    •  内存非常有限,比如在嵌入式系统或便携设备中;

      当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

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

      JAVA的垃圾回收机制彰显了JAVA的健壮性与安全性,合理的设计代码,有效的评估内存使用情况,基本上不会出现上述问题。

  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9946895.html
Copyright © 2011-2022 走看看