下载此文档

JAVA内存泄露专题.docx


文档分类:IT计算机 | 页数:约16页 举报非法文档有奖
1/16
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/16 下载此文档
文档列表 文档介绍
内存泄露与内存溢出
定义
1、内存泄漏:一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而造成那部分内存不可用的情况。
2、内存溢出:指内存不够使用而抛出异常,内存泄露是其形成的原因之一。
危害
会导致新的资源分配请求无法完成,引起系统错误,最后导致系统崩溃。
内存泄漏分类
类型
描述
常发性内存泄漏
发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏
偶发性内存泄漏
发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的
一次性内存泄漏
发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次
隐式内存泄漏
程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏
内存泄露/溢出发生的区域  
内存区域
发生情况
备注
程序计数器
不可能
虚拟机栈<VM Stack>
Y
本地方法栈
Y
非堆内存
Y
即方法区、持久代
运行时常量池< Runtime Constant Pool >
Y
本机直接内存< Direct Memory >
Y
堆内存
Y
内存溢出异常
内存区域
异常
虚拟机栈<VM Stack>

本地方法栈
: unable to create new native thread
非堆内存
:PermGen space
运行时常量池< Runtime Constant Pool >
: PermGen space
本机直接内存< Direct Memory >

堆内存
: Java heap space
内存溢出常见原因
异常
常见原因
解决办法

线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小
增大线程栈
优化程序设计,减少方法调用层次
: unable to create new native thread
Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小
-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError)
-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)
:PermGen space
Permanent Generation空间不足,不能加载额外的类,可能为运行时常量池溢出或持久代溢出。
大量动态反射生成的类不断被加载可导致此错误
调整PermGen内存

有可能本机直接内存不够用
: Java heap space
1、内存泄露
2、堆内存分配不合理引起溢出
3、创建一个占用内存过大的对象
1、调整堆内存
2、根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点,然后修改程序错误
 
发生内存泄露的情形
Java内存泄露根本原因是什么呢?
答:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
具体主要有如下几大类: 
静态集合类引起内存泄露 
像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用

JAVA内存泄露专题 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数16
  • 收藏数0 收藏
  • 顶次数0
  • 上传人分享精品
  • 文件大小373 KB
  • 时间2017-08-09