欢迎来到天天文库
浏览记录
ID:38198147
大小:373.51 KB
页数:16页
时间:2019-06-07
《JAVA内存泄露专题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、内存泄露与内存溢出1定义1、内存泄漏:一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而造成那部分内存不可用的情况。2、内存溢出:指内存不够使用而抛出异常,内存泄露是其形成的原因之一。2危害会导致新的资源分配请求无法完成,引起系统错误,最后导致系统崩溃。3内存泄漏分类类型描述常发性内存泄漏发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏偶发性内存泄漏发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的一次性内存泄漏发生内存泄漏的
2、代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次隐式内存泄漏程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏4内存泄露/溢出发生的区域 内存区域发生情况备注程序计数器不可能虚拟机栈Y本地方法栈Y非堆内存Y即方法区、持久代运行时常量池3、imeConstantPool>Y本机直接内存Y堆内存Y1内存溢出异常内存区域异常虚拟机栈java.lang.StackOverflowError本地方法栈java.lang.OutOfMemoryError:unabletocreatenewnativethread非堆内存java.lang.OutOfMemoryError:PermGenspace运行时常量池java.lang.OutOfMemoryError: PermGen space本机直接内存java.lang.O4、utOfMemoryError堆内存java.lang.OutOfMemoryError:Javaheapspace2内存溢出常见原因异常常见原因解决办法java.lang.StackOverflowError线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小1、增大线程栈2、优化程序设计,减少方法调用层次java.lang.OutOfMemoryError:unabletocreatenewnativethreadStack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当5、然不能太小,太小会出现StackOverflowError)2.通过-Xms-Xmx两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)java.lang.OutOfMemoryError:PermGenspacePermanentGeneration空间不足,不能加载额外的类,可能为运行时常量池溢出或持久代溢出。大量动态反射生成的类不断被加载可导致此错误调整PermGen内存java.lang.OutOfMemoryError有可能本机直接内存不够用java.lang.OutOfMemoryError:Javaheapspace1、内存泄露2、堆内存分配不合理引起溢出6、3、创建一个占用内存过大的对象1、调整堆内存2、根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点,然后修改程序错误 3发生内存泄露的情形Java内存泄露根本原因是什么呢?答:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。具体主要有如下几大类: 1.1静态集合类引起内存泄露 像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放7、,因为他们也将一直被Vector等引用着。 例: importjava.util.Vector;/***@authorleijp*/publicclassVectorMemoryOOM{publicstaticvoidmain(String[]args){Vectorvobj=newVector(10);for(inti=0;i<100;i++){Objectobj=newObject();//注意此处Jav
3、imeConstantPool>Y本机直接内存Y堆内存Y1内存溢出异常内存区域异常虚拟机栈java.lang.StackOverflowError本地方法栈java.lang.OutOfMemoryError:unabletocreatenewnativethread非堆内存java.lang.OutOfMemoryError:PermGenspace运行时常量池java.lang.OutOfMemoryError: PermGen space本机直接内存java.lang.O
4、utOfMemoryError堆内存java.lang.OutOfMemoryError:Javaheapspace2内存溢出常见原因异常常见原因解决办法java.lang.StackOverflowError线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小1、增大线程栈2、优化程序设计,减少方法调用层次java.lang.OutOfMemoryError:unabletocreatenewnativethreadStack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当
5、然不能太小,太小会出现StackOverflowError)2.通过-Xms-Xmx两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)java.lang.OutOfMemoryError:PermGenspacePermanentGeneration空间不足,不能加载额外的类,可能为运行时常量池溢出或持久代溢出。大量动态反射生成的类不断被加载可导致此错误调整PermGen内存java.lang.OutOfMemoryError有可能本机直接内存不够用java.lang.OutOfMemoryError:Javaheapspace1、内存泄露2、堆内存分配不合理引起溢出
6、3、创建一个占用内存过大的对象1、调整堆内存2、根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点,然后修改程序错误 3发生内存泄露的情形Java内存泄露根本原因是什么呢?答:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。具体主要有如下几大类: 1.1静态集合类引起内存泄露 像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放
7、,因为他们也将一直被Vector等引用着。 例: importjava.util.Vector;/***@authorleijp*/publicclassVectorMemoryOOM{publicstaticvoidmain(String[]args){Vectorvobj=newVector(10);for(inti=0;i<100;i++){Objectobj=newObject();//注意此处Jav
此文档下载收益归作者所有