首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

转:Java内存储器泄露的理解与解决

2012-07-01 
转:Java内存泄露的理解与解决?Java内存管理机制在C++语言中,如果需要动态分配一块内存,程序员需要负责这块

转:Java内存泄露的理解与解决

?

Java内存管理机制

在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。Java语言对内存管理做了自己的优化,这就是垃圾回收机制。Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbage?collection)负责自动回收不再使用的内存。

????上面是Java内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然Java的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道GC在什么时候回收内存对象,什么样的内存对象会被GC认为是“不再使用”的。

????Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在Java程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。

?


转:Java内存储器泄露的理解与解决

?

?

通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被GC回收,哪怕是Java虚拟机抛出OutOfMemoryError。

Java内存泄露

????一般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。

????可能光说概念太抽象了,大家可以看一下这样的例子:

?

?


??3转:Java内存储器泄露的理解与解决//:?SoftHashMap.java?
??4转:Java内存储器泄露的理解与解决import?java.util.*;?
??5转:Java内存储器泄露的理解与解决import?java.lang.ref.*;?
??6转:Java内存储器泄露的理解与解决
??7转:Java内存储器泄露的理解与解决import?android.util.Log;
??8转:Java内存储器泄露的理解与解决
??9转:Java内存储器泄露的理解与解决public?class?SoftHashMap?extends?AbstractMap?{?
?10转:Java内存储器泄露的理解与解决??/**?The?internal?HashMap?that?will?hold?the?SoftReference.?*/?
?11转:Java内存储器泄露的理解与解决??private?final?Map?hash?=?new?HashMap();?
?12转:Java内存储器泄露的理解与解决??/**?The?number?of?"hard"?references?to?hold?internally.?*/?
?13转:Java内存储器泄露的理解与解决??private?final?int?HARD_SIZE;?
?14转:Java内存储器泄露的理解与解决??/**?The?FIFO?list?of?hard?references,?order?of?last?access.?*/?
?15转:Java内存储器泄露的理解与解决??private?final?LinkedList?hardCache?=?new?LinkedList();?
?16转:Java内存储器泄露的理解与解决??/**?Reference?queue?for?cleared?SoftReference?objects.?*/?
?17转:Java内存储器泄露的理解与解决??private?ReferenceQueue?queue?=?new?ReferenceQueue();?
?18转:Java内存储器泄露的理解与解决
?19转:Java内存储器泄露的理解与解决??//Strong?Reference?number
?20转:Java内存储器泄露的理解与解决??public?SoftHashMap()?{?this(100);?}?
?21转:Java内存储器泄露的理解与解决??public?SoftHashMap(int?hardSize)?{?HARD_SIZE?=?hardSize;?}?
?22转:Java内存储器泄露的理解与解决??
?23转:Java内存储器泄露的理解与解决
?24转:Java内存储器泄露的理解与解决??public?Object?get(Object?key)?{?
?25转:Java内存储器泄露的理解与解决????Object?result?=?null;?
?26转:Java内存储器泄露的理解与解决????//?We?get?the?SoftReference?represented?by?that?key?
?27转:Java内存储器泄露的理解与解决????SoftReference?soft_ref?=?(SoftReference)hash.get(key);?
?28转:Java内存储器泄露的理解与解决????if?(soft_ref?!=?null)?{?
?29转:Java内存储器泄露的理解与解决??????//?From?the?SoftReference?we?get?the?value,?which?can?be?
?30转:Java内存储器泄露的理解与解决??????//?null?if?it?was?not?in?the?map,?or?it?was?removed?in?
?31转:Java内存储器泄露的理解与解决??????//?the?processQueue()?method?defined?below?
?32转:Java内存储器泄露的理解与解决??????result?=?soft_ref.get();?
?33转:Java内存储器泄露的理解与解决??????if?(result?==?null)?{?
?34转:Java内存储器泄露的理解与解决????????//?If?the?value?has?been?garbage?collected,?remove?the?
?35转:Java内存储器泄露的理解与解决????????//?entry?from?the?HashMap.?
?36转:Java内存储器泄露的理解与解决????????hash.remove(key);?
?37转:Java内存储器泄露的理解与解决??????}?else?{?
?38转:Java内存储器泄露的理解与解决????????//?We?now?add?this?object?to?the?beginning?of?the?hard?
?39转:Java内存储器泄露的理解与解决????????//?reference?queue.??One?reference?can?occur?more?than?
?40转:Java内存储器泄露的理解与解决????????//?once,?because?lookups?of?the?FIFO?queue?are?slow,?so?
?41转:Java内存储器泄露的理解与解决????????//?we?don't?want?to?search?through?it?each?time?to?remove?
?42转:Java内存储器泄露的理解与解决????????//?duplicates.?
?43转:Java内存储器泄露的理解与解决??????????//keep?recent?use?object?in?memory
?44转:Java内存储器泄露的理解与解决????????hardCache.addFirst(result);?
?45转:Java内存储器泄露的理解与解决????????if?(hardCache.size()?>?HARD_SIZE)?{?
?46转:Java内存储器泄露的理解与解决??????????//?Remove?the?last?entry?if?list?longer?than?HARD_SIZE?
?47转:Java内存储器泄露的理解与解决??????????hardCache.removeLast();?
?48转:Java内存储器泄露的理解与解决????????}?
?49转:Java内存储器泄露的理解与解决??????}?
?50转:Java内存储器泄露的理解与解决????}?
?51转:Java内存储器泄露的理解与解决????return?result;?
?52转:Java内存储器泄露的理解与解决??}?
?53转:Java内存储器泄露的理解与解决
?54转:Java内存储器泄露的理解与解决??/**?We?define?our?own?subclass?of?SoftReference?which?contains?
?55转:Java内存储器泄露的理解与解决???not?only?the?value?but?also?the?key?to?make?it?easier?to?find?
?56转:Java内存储器泄露的理解与解决???the?entry?in?the?HashMap?after?it's?been?garbage?collected.?*/?
?57转:Java内存储器泄露的理解与解决??private?static?class?SoftValue?extends?SoftReference?{?
?58转:Java内存储器泄露的理解与解决????private?final?Object?key;?//?always?make?data?member?final?
?59转:Java内存储器泄露的理解与解决????/**?Did?you?know?that?an?outer?class?can?access?private?data?
?60转:Java内存储器泄露的理解与解决?????members?and?methods?of?an?inner?class???I?didn't?know?that!?
?61转:Java内存储器泄露的理解与解决?????I?thought?it?was?only?the?inner?class?who?could?access?the?
?62转:Java内存储器泄露的理解与解决?????outer?class's?private?information.??An?outer?class?can?also?
?63转:Java内存储器泄露的理解与解决?????access?private?members?of?an?inner?class?inside?its?inner?
?64转:Java内存储器泄露的理解与解决?????class.?*/?
?65转:Java内存储器泄露的理解与解决????private?SoftValue(Object?k,?Object?key,?ReferenceQueue?q)?{?
?66转:Java内存储器泄露的理解与解决??????super(k,?q);?
?67转:Java内存储器泄露的理解与解决??????this.key?=?key;?
?68转:Java内存储器泄露的理解与解决????}?
?69转:Java内存储器泄露的理解与解决??}?
?70转:Java内存储器泄露的理解与解决
?71转:Java内存储器泄露的理解与解决??/**?Here?we?go?through?the?ReferenceQueue?and?remove?garbage?
?72转:Java内存储器泄露的理解与解决???collected?SoftValue?objects?from?the?HashMap?by?looking?them?
?73转:Java内存储器泄露的理解与解决???up?using?the?SoftValue.key?data?member.?*/?
?74转:Java内存储器泄露的理解与解决??public?void?processQueue()?{?
?75转:Java内存储器泄露的理解与解决????SoftValue?sv;?
?76转:Java内存储器泄露的理解与解决????while?((sv?=?(SoftValue)queue.poll())?!=?null)?{?
?77转:Java内存储器泄露的理解与解决????????if(sv.get()==?null){
?78转:Java内存储器泄露的理解与解决????????????Log.e("processQueue",?"null");
?79转:Java内存储器泄露的理解与解决????????}else{
?80转:Java内存储器泄露的理解与解决????????????Log.e("processQueue",?"Not?null");
?81转:Java内存储器泄露的理解与解决????????}
?82转:Java内存储器泄露的理解与解决??????hash.remove(sv.key);?//?we?can?access?private?data!
?83转:Java内存储器泄露的理解与解决??????Log.e("SoftHashMap",?"release?"?+?sv.key);
?84转:Java内存储器泄露的理解与解决????}?
?85转:Java内存储器泄露的理解与解决??}?
?86转:Java内存储器泄露的理解与解决??/**?Here?we?put?the?key,?value?pair?into?the?HashMap?using?
?87转:Java内存储器泄露的理解与解决???a?SoftValue?object.?*/?
?88转:Java内存储器泄露的理解与解决??public?Object?put(Object?key,?Object?value)?{?
?89转:Java内存储器泄露的理解与解决????processQueue();?//?throw?out?garbage?collected?values?first?
?90转:Java内存储器泄露的理解与解决????Log.e("SoftHashMap",?"put?into?"?+?key);
?91转:Java内存储器泄露的理解与解决????return?hash.put(key,?new?SoftValue(value,?key,?queue));?
?92转:Java内存储器泄露的理解与解决??}?
?93转:Java内存储器泄露的理解与解决??public?Object?remove(Object?key)?{?
?94转:Java内存储器泄露的理解与解决????processQueue();?//?throw?out?garbage?collected?values?first?
?95转:Java内存储器泄露的理解与解决????return?hash.remove(key);?
?96转:Java内存储器泄露的理解与解决??}?
?97转:Java内存储器泄露的理解与解决??public?void?clear()?{?
?98转:Java内存储器泄露的理解与解决????hardCache.clear();?
?99转:Java内存储器泄露的理解与解决????processQueue();?//?throw?out?garbage?collected?values?
100转:Java内存储器泄露的理解与解决????hash.clear();?
101转:Java内存储器泄露的理解与解决??}?
102转:Java内存储器泄露的理解与解决??public?int?size()?{?
103转:Java内存储器泄露的理解与解决????processQueue();?//?throw?out?garbage?collected?values?first?
104转:Java内存储器泄露的理解与解决????return?hash.size();?
105转:Java内存储器泄露的理解与解决??}?
106转:Java内存储器泄露的理解与解决??public?Set?entrySet()?{?
107转:Java内存储器泄露的理解与解决????//?no,?no,?you?may?NOT?do?that!!!?GRRR?
108转:Java内存储器泄露的理解与解决????throw?new?UnsupportedOperationException();?
109转:Java内存储器泄露的理解与解决??}?
110转:Java内存储器泄露的理解与解决}?

?

参考文献

Java?内存管理原理、内存泄漏实例及解决方案研究

Java中的强引用、软引用、弱引用和虚引用

垃圾回收与强引用,软引用,弱引用,幻引用的关系

?

?

转自:http://www.blogjava.net/zh-weir/archive/2011/02/23/345007.html

转自:

热点排行