对象引用与垃圾收集

上传人:平*** 文档编号:25274934 上传时间:2017-12-13 格式:PPT 页数:68 大小:240.34KB
返回 下载 相关 举报
对象引用与垃圾收集_第1页
第1页 / 共68页
对象引用与垃圾收集_第2页
第2页 / 共68页
对象引用与垃圾收集_第3页
第3页 / 共68页
对象引用与垃圾收集_第4页
第4页 / 共68页
对象引用与垃圾收集_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《对象引用与垃圾收集》由会员分享,可在线阅读,更多相关《对象引用与垃圾收集(68页珍藏版)》请在金锄头文库上搜索。

1、J2SE,1.4,Tigerflower 2005-1,主题,对象引用与垃圾收集异常处理JAVA I/O正则表达式利用JAVA进行XML编程嵌套式类对象的封装与继承抽象类与接口,垃圾收集,垃圾收集器的工作原理是识别程序中不再使用的对象,并且回收其内存。,垃圾收集,J2SE1.4采用的代间收集策略,垃圾收集,JDK1.4的垃圾收集器 复制收集器、标记整理收集器、增量式收集器、并行复制收集器、并行清除(scavenging)收集器和并发标记-清除收集器。,垃圾收集,其他收集选项,垃圾收集,观察垃圾收集运行状况有很多办法来监听垃圾回收器的活动。可用Xverbose:gc选项运行JVM,然后观察输出结

2、果一段时间。memory 13.009-13.130: GC 65536K-16788K (65536K), 121.000 ms,垃圾收集,微调垃圾收集选项最简单的垃圾收集微调就是扩大最大堆的大小( -Xmx )。随着堆的增大,复制收集会变得更有效,所以在增大堆时,您就减少了每个对象的收集成本。除了增加最大堆的大小,还可以用选项 -XX:NewRatio 增加分配给年轻代的空间份额。也可以用 -Xmn 选项显式指定年轻代的大小。,引用对象,从JDK1.2开引入了一个引用对象应用程序接口API允许程序维持一个特别的到对象的引用,这样程序能够通过这一有限的途径和垃圾收集器进行交互。加入引用对象之

3、后的引用与常规引用的区别在于,引用对象中的引用专门由内存管理器来处理。引用对象封装了其它一些对象的引用,我们称之为指示对象。在引用对象创建的同时,也就定义了该引用对象的指示对象。,Heap中的引用对象Reference Objects,Reference Objects 类层次,对象的引用层次,根据对象的可获取程度:强获取、次获取、弱获取、虚获取根据应用程序要求,对象可以是强引用(strong references)、次引用(soft references)、弱引用(weak references)、虚引用(phantom references)的任意组合。,强引用( strong refer

4、ence ),JVM内存管理器从引用集合出发遍寻堆中所有到对象的路径。当到达某对象的任意路径都不含有引用对象时,则称该对象具有强获取能力。该对象为强引用对象,Root set of references,strong references,garbage,次引用(soft reference ),次引用(soft reference ),public class DisplayImage extends Applet SoftReference sr = null; public void init() System.out.println(Initializing); public void

5、 paint(Graphics g) Image im = ( sr = null) ? null : (Image)( sr.get(); if (im = null) System.out.println(Fetching image); im = getImage(getCodeBase(),truck1.gif); sr = new SoftReference(im); System.out.println(Painting); g.drawImage(im, 25, 25, this); im = null; public void start() public void stop(

6、) ; ,次引用( Soft Reference ),所有Soft Reference到的对象保证会在java虚拟机发生OutOfMemoryError 前被清除。SoftReference 常被用来实现 object-cache (memory-sensitive caches)之用的。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMem

7、oryError)。,弱引用(weak reference ),当内存管理器未发现strong references 和 soft references 时,我们称对象具有弱获取能力,即在到达该对象的路径中至少包含一个weak reference。,弱引用(weak reference ),弱引用(weak references)允许用来查询一个对象是否已被垃圾收集器回收。Image im = (sr = null) ? null : (Image) (sr.get(); if (im = null) System.out.println(Fetching image); im = getIm

8、age(getCodeBase(), truck1.gif); sr = new SoftReference(im); ,public class WeakObj public static void main(String args) try ReferenceQueue aReferenceQueue = new ReferenceQueue(); Object anObject = new Object(); WeakReference ref = new WeakReference(anObject, aReferenceQueue); String extraData = new S

9、tring(Extra Data); HashMap aHashMap = new HashMap(); aHashMap.put(ref, extraData); / (key) in aHashMap anObject = null; if(anObject = null) /Clear the strong reference to extraData extraData = null; catch (Exception e) System.err.println(An exception occurred:); e.printStackTrace(); ,weak reference

10、分析,Soft Reference 和 Weak Reference 的不同在于前者是否会收集是由垃圾收集器的算法决定的,而后者是一定会被收集的。,虚引用(Phantom Reference ),主要是用来取代对象的 finalize() 和 Weak Reference 以 及 SoftReference 最大的不同是:Phantom Reference 一订要搭配着 ReferenceQueue 使用,因为 Phantom Reference 的 get() 传 出值一定是 null(以避免此对象不小心再度拥有 Direct Reference)。,Java对象引用接口应用,1.基于Web

11、的应用程序常常要求显示大量图片,当用户离开某一Web页时,往往不能确定是否能够顺利的返回。在这种程序中,应用Java对象引用API可以创建这样一个环境,即当堆内存以最小程度运行时,内存管理器创建对象。当用户返回时,应用程序就会重新载入已经创建的图片。,Java对象引用接口应用,2.应用对象引用队列可以创建这样一个环境,当通过对象引用获得某一对象时,应用程序得到通知。然后,应用程序就可以对相关对象进行清除操作,同时使这些对象在内存管理器中合法化。,内存泄漏,内存泄露的本质是无用但仍被引用的对象。仅当一个对象不再被引用时才能被统计为无用的对象。垃圾收集器只能收集没有被应用程序引用的对象。,无用但仍

12、被引用的对象,上面说明了在 Java 应用程序执行期间具有不同生存周期的两个类。类 A 首先被实例化,并会在很长一段时间或程序的整个生存期内存在。在某个时候,类 B 被创建,类 A 添加对这个新创建的类的一个引用。现在,我们假定类 B 是某个用户界面小部件,它由用户显示甚至解除。如果没有清除类 A 对 B 的引用,则即便不再需要类 B ,并且即便在执行下一个垃圾收集周期以后,类 B 仍将存在并占用内存空间。,内存泄漏无意识的对象保留,public class Stack private Object elements; private int size = 0; public Stack(in

13、t initialCapacity) this.elements = new ObjectinitialCapacity; public void push(Object e) ensureCapacity(); elementssize+ = e; public Object pop() if (size=0) throw new EmptyStackException(); Object result = elements-size; return result; private void ensureCapacity() if (elements.length = size) Objec

14、t oldElements = elements; elements = new Object2 * elements.length + 1; System.arraycopy(oldElements, 0, elements, 0, size); ,内存泄漏错误的局部作用域,static StringBuffer sb = new StringBuffer(); public static String scopingExample(String string) sb = new StringBuffer(); sb.append(hello ).append(string); sb.append(, nice to see you!); return sb.toString(); ,资源泄漏,释放资源有一个简单的原则:如果有资源清理方法(colse、free)就及时调用。使用finally 避免资源泄漏(resource leaks)finally构件使得某些代码总是得以被执行,无论是否发生异常。在维护对象内部状态和清理non-memory 资源方面,finally 尤其适用。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号