java应用程序中的内存泄漏及内存管理-java开发java经验技巧

java应用程序中的内存泄漏及内存管理-java开发java经验技巧

ID:31191967

大小:75.00 KB

页数:5页

时间:2019-01-07

java应用程序中的内存泄漏及内存管理-java开发java经验技巧_第1页
java应用程序中的内存泄漏及内存管理-java开发java经验技巧_第2页
java应用程序中的内存泄漏及内存管理-java开发java经验技巧_第3页
java应用程序中的内存泄漏及内存管理-java开发java经验技巧_第4页
java应用程序中的内存泄漏及内存管理-java开发java经验技巧_第5页
资源描述:

《java应用程序中的内存泄漏及内存管理-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java应用程序中的内存泄漏及内存竹理-编程开发技术Java应用程序中的内存泄漏及内存管理木文由ImportNew■夏T•林翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。Java平台的一个突出的特性是自动内存管理。很多人把这种特性误读为Java没肖内存泄露。然而,在我印象中,现代Java框架以及基于Ja眩的平台并非如此。特别是Android平台,能举岀很多反例。为了让大家对Java平台的内存泄需冇一个初步的认识,我们先来看一个Java实现的栈:classSimpleStack{privatefina

2、lObject[]objectPool=newObject[10];privateintpointer二-1;publicObjectpop(){if(pointer<0){thrownewlllegalStateException("noelementsonstack");}returnobjectPool[poinle—];}publicObjectpeek(){if(pointer<0){thrownewT1legalStateException(〃noelementsonslack");}rctuimobjectP

3、ool[pointer];)publicvoidpush(Objectobject){if(pointer>8){thrownewlllegalStateException("stackoverflow");}objectPool[++pointer]=object;}}这个栈的实现基于一个对彖数组,并维护了一个用于指向栈内当前可用单元的整型指针。上面的实现中,每次从栈顶弹出元素都会产生内存泄露。确切的说,即使不再使用栈顶元素,对象数组会继续持有栈顶元素的引用(除非栈顶元素再次入栈,栈顶元索的引用会被完全相同的引用覆盖)。

4、因此,即便这个对象的其他引用都被释放,Java虚拟机也不能回收这个对象。由丁•这种栈实现并不允许外界直接访问其底层的对彖池,因此除非有新元素入栈并被放置在栈内的同一个位置上,否则这个无法访问的引用将阻止垃圾回收器回收该对象。幸运的是,这个内存泄露很容易修复:publicObjectpop(){if(pointer<1){thrownewIllegalStateExceptionC^noelementsonstack");}try{rcturnobjcctPool[pointer];}finally{objectPool[p

5、ointer--]=null;}}当然,在日常的Java发中一般不会去实现一个内存数据结构。因此,让我们来看一个更常见的Java内存泄漏的例子。在Java开发屮经常用到的观察者模式就会引起内存泄露:classObserved{publicinterfaceObserver{voidupdate();}privatcCollcction〈Obscrvcr>observers=newHashSct〈Observer〉();voidaddListener(Observerobserver){observers.add(obser

6、ver);}voidremoveListener(Observerobserver){observers.remove(observer);}这次提供了一个直接删除底层对彖池引用的方法。基于这种实现,任何己注册的Observer在使用后只要被正确注销,就不会存在内存泄漏的风险。然而,假设这样一个场景,框架的使用者在使用完Observer之后并没有及吋注销。同理Observer将永远不会被回收,因为Observed—直保留着它的引用。更糟的是,没冇Observer引用,是无法从Observed对象池外部删除Observer的

7、,即无法冋收未被及时注销的Observerc不过,有一种简单的方法能够修复这种潜在的内存泄露——弱引用。我个人认为这是Java程序员都应该知道的特性。简单地说,弱引用在功能上和普通的引用一样,但它不会妨碍垃圾回收。因此JVM执行垃圾回收时,如果没有发现强引用,那么你就会发现弱引用会被置为null。要使用弱引用,我们可以将上面的代码改为:privateCollection<0bserver>observers二Collections.newSetFromMap(newWeakHashMap

8、());WcakllashMap是一个现成的弱引用Map,Map的键都是弱引用对象。使用WeakHashMap后,被观察者将不会阻止JVM对Observer进行垃圾回收。然而,你必须在代码注释中强调这一点。因为这个特性可能引起一些问题,比如使用者想要注册一个常驻内存的Observer(例如日志库),但他

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

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

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