java内存泄露研究

java内存泄露研究

ID:41851886

大小:164.69 KB

页数:8页

时间:2019-09-03

java内存泄露研究_第1页
java内存泄露研究_第2页
java内存泄露研究_第3页
java内存泄露研究_第4页
java内存泄露研究_第5页
资源描述:

《java内存泄露研究》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java内存管理机制在C++语言中,如果需要动态分配一块内存,程序员需耍负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却I•分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。Java语言对内存管理做了ft己的优化,这就是垃圾回收机制Java的儿乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbagecollection)负责自动回收不再使用的内存。上面是Java内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许冇人表示怀疑,既然Java的垃圾回收

2、机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道GC在什么时候冋收内存对象,什么样的内存对象会被GC认为是“不再使用”的。Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对彖的引用变虽,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对彖空间。在Java程序中,这个引用变量本身既可以存放堆内存中,乂可以放在代码栈的内存中(与基本数据类型相同)。GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码

3、中己经无法访问这块内存了)。O©2是第二次申请的对彖,此时为可回收对敷通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用Z后,GC就可以将其回收。反过來说,如果这个对彖还存在引用,那么它将不会被GC回收,哪怕是Java虚拟机抛出OutOfMemoryError。Java内存泄露一般来说内存泄漏冇两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另—•种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机

4、制的引入,得到了很好的解决。所以,Java屮的内存泄漏,主要指的是第二种情况。可能光说概念太抽象了,大家可以看一下这样的例了:1Vectorv=newVector(10);2for(inti=1;i<100;i++){3Objecto=newObject();4v.add(o);1o=null;6}在这个例子中,代码栈中存在Vector对彖的引用v和Object对彖的引用0。在For循环屮,我们不断的生成新的对象,然示将其添加到Vector对象屮,之示将o引用置空。问题是当。引用被査空后,如果发牛GC,我们创建的Object对象是否能够被GC回收呢?答案是否定的。因为,GC

5、在跟踪代码栈中的引用吋,会发现v引用,而继续往下跟踪,就会发现v引川指向的内存空间中又存在指向Object对彖的引用。也就是说尽管o引用已经被置空,但是Object对象仍然存在其他的引川,是可以被访问到的,所以GC无法将其释放掉。如果在此循环之示,Object对象对程序已经没有任何作用,那么我们就认为此Java程序发生了内存泄漏。尽管对于C/C++中的内存泄露情况来说,Java内存泄露导致的破坏性小,除了少数情况会出现程序崩溃的情况外,大多数情况下程序仍然能正常运行。但是,在移动设备对于内存和CPU都有较严格的限制的情况F,Java的内存溢出会导致程序效率低匚占用人量不需要

6、的内存等问题。这将导致整个机器性能变差,严重的也会引起抛出OutOfMemoryError,导致程序崩溃。一般情况下内存泄漏的避免在不涉及复杂数据结构的-•般情况下,Java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对彖游离”。例如:1publicclassFileSearch{23privatebyte[]content;有问题,不应该被声明为实例变量4privateFilemFile;56publicFileSearch(Filefile){7mFile=file;8}910publicbooleanhasString(Str

7、ingstr){11intsize=getFileSize(mFile);12content=newbyte[size];13loadFile(mFile,content);1415Strings=newString(content);16returns.contains(str);17}18}在这段代码中,FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFilc加载到内存中,然后进行判断。但是,这里的问题是,将content声明为了实例变量,而不是本地变量。于

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。