`
无量
  • 浏览: 1148399 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多
内存泄漏(Memory Leak)
1. 概念:
指你用在C语言中malloc或在Java/C++ 中new申请了一块内存,但是没有通过free或delete将或者一直占用引用没有gc,引擎内存未释放,导致这块内存一直处于占用状态

2. 概念解释:
内存泄露是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况,重启计算机或者JVM可以解决,但也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。

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

内存溢出(Memory Overflow
1. 概念:
指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,就是溢出

2. 概念解释:
内存溢出即用户在对其数据缓冲区操作时,超过了其缓冲区的边界;尤其是对缓冲区写操作时,缓冲区的溢出很可能导致程序的异常。在java中一般是指对堆的内存申请操作出现。

3. 内存溢出类型:
        1)java.lang.OutOfMemoryError:PermGen space

PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域。这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC不会在主程序运行期对PermGenspace进行清理。

JVM由XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
JVM由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

        该错误常见场合:
        a) 应用中有很多Class,web服务器对JSP进行pre compile时。
        b) Webapp下用了大量的第三方jar, 其大小超过了JVM默认的大小(4M)时。

        2)java.lang.OutOfMemoryError:Java heap space

在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。

JVM内存的最大值跟操作系统有很大的关系。32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。

        该错误常见场合:
        a) Web上传文件时。
        b) 开启大型文件或从数据库中一次取了太多的数据。


相关问题

1. Q:Java中会存在内存泄漏吗?
   A: 当然也会的。当被分配的对象可达但已无用(未对作废数据内存单元的引用置null)即会引起。

Vector v=new Vector(10);   
for (int i=1;i<100; i) {   
    Object o=new Object();   
    v.add(o);   
    o=null;   
}   
// 此时,所有的Object对象都没有被释放,因为变量v引用这些对象。   
// 对象加入到Vector后,还必须从Vector中删除,最简单释放方法就是将Vector对象设置为null。
  

2. Q:内存泄露、溢出的异同?
   A: 同:都会导致应用程序运行出现问题,性能下降或挂起。
      异:
        1) 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。
        2) 内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

3. 如何检测内存泄露?  
    A: 可以通过一些性能监测分析工具,如 JProfiler、OptimizeitProfiler。

4. Q: 如何避免内存泄露、溢出?
    A: 1)尽早释放无用对象的引用。
          好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。

         2)程序进行字符串处理时,尽量避免使用String,而应使用StringBuffer。
          因为每一个String对象都会独立占用内存一块区域,如:

String str = "aaa";   
String str2 = "bbb";   
String str3 = str  str2;   
// 假如执行此次之后str , str2再不被调用,那么它们就会在内存中等待GC回收;   
// 假如程序中存在过多的类似情况就会出现内存错误;
  

        3) 尽量少用静态变量。
         因为静态变量是全局的,GC不会回收。

         4)避免集中创建对象尤其是大对象,如果可以的话尽量使用流操作。
        JVM会突然需要大量内存,这时会触发GC优化系统内存环境; 一个案例如下:


// 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,   
// 检查之后发现问题:组件里的代码   
m_totalBytes = m_request.getContentLength();   
m_binArray = new byte[m_totalBytes];   
// totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。   
// 解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。 
 
参考:
http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
  
        5)尽量运用对象池技术以提高系统性能。
         生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。

         6)不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。
         可以适当的使用hashtable,vector创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃。

        7) 优化配置。

5. Q:内存溢出的解决方案?
    A: 一是从代码层面进行优化完善,尽量避免该情况发生;

        二是调整优化服务器配置:

        1) 设置-Xms、-Xmx相等;
        2) 设置NewSize、MaxNewSize相等;
        3) 设置Heap size, PermGen space:

            Tomcat 的配置示例:修改 %TOMCAT_HOME%/bin/catalina.bat or catalina.sh
            JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

注:具体JVM参数优化,可以查看相关博客

本篇参考:
http://www.cnblogs.com/fryy/archive/2013/11/27/3445281.html
分享到:
评论

相关推荐

    内存泄漏与内存溢出

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

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

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

    Qt内存溢出检测

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

    JAVA内存溢出问题总结

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

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

    通过学习和理解这段代码,开发者可以更好地掌握在易语言中处理大文件和防止内存溢出的技巧,提高程序的稳定性和效率。 由于没有提供具体的源码内容,无法深入讨论细节,但以上概述了在易语言环境下防止文件内存溢出...

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

    Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...

    JVM内存溢出问题解析

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

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

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

    apache服务器出现内存溢出的解决方法.doc

    通过合理设置JVM参数,不仅可以解决内存溢出问题,还可以提高系统的稳定性和性能。此外,对于某些特定类型的问题,还需要考虑操作系统的限制和配置。希望以上内容能够帮助您有效地解决内存溢出问题。

    处理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开发中,内存管理是确保应用程序稳定运行的关键因素...此外,定期对代码进行审查和重构也是预防内存溢出的有效手段之一。希望本文能帮助到正在面对内存溢出问题的开发者们。

    Android 内存溢出问题

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

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

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

    java IBM websphere 内存溢出 javacore deapdump CPU内存分析工具

    总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。

Global site tag (gtag.js) - Google Analytics