java垃圾回收机制-编程开发技术

java垃圾回收机制-编程开发技术

ID:30769035

大小:216.95 KB

页数:8页

时间:2019-01-03

java垃圾回收机制-编程开发技术_第1页
java垃圾回收机制-编程开发技术_第2页
java垃圾回收机制-编程开发技术_第3页
java垃圾回收机制-编程开发技术_第4页
java垃圾回收机制-编程开发技术_第5页
资源描述:

《java垃圾回收机制-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java垃圾回收机制-编程开发技术Java垃圾回收机制原文出处:海子说到垃圾回收(GarbageCollection,GC),很多人就会自然而然地把它和Java联系起來。在J3V3中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对彖会被认定为“垃圾”?那么当一些对彖被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在口前的商业虚拟机屮,冇哪些典型的垃圾收集器?下面我们就來逐一探讨这些问题。以下是本文的目录大纲:一•如何确定某个对象是“垃圾”?二•典型的垃圾收集

2、算法三•典型的垃圾收集器如果有不正之处,希望谅解和批评指正,不胜感激。一•如何确定某个对象是“垃圾”?在这一小节我们先了解一个最基本的问题:如果确定某个对彖是“垃圾”?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃圾收集器如何确定某个对象是“垃圾”?一即通过什么方法判断一个对象可以被回收了。在javaH*是通过引用来和对彖进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失一般性,如果一个对象没有任何引用与Z关联,则说明该对象基木不太可能在其他地方被使用到,那么这个对象

3、就成为可被回收的对象了。这种方式成为引用计数法。这种方式的特点是实现简单,而且效率较高,但是它无法解决循环引用的问题,因此在Java屮并没冇采用这种方式(Python采用的是引用计数法)。看下而这段代码:publicclassMain{publicstaticvoidmain(String[]args){MyObjcctobjcctl二newMyObjcct();MyObjectobject2=newMyObject();objectl.object二object2;object2.object=objectl;objectl二nul1;objcct2二null;c

4、lassMyObject{publicObjectobject二null;最后面两句将objectl和object2赋值为null,也就是说objectl和object2指向的对象已经不可能再被访问,但是rtr丁它们互相引用对方,导致它们的引用计数都不为0,那么垃圾收集器就永远不会冋收它们。为了解决这个问题,在Java中采取了可达性分析法。该方法的基本思想是通过一系列的“GCRoots”对象作为起点进行搜索,如果在“GCRoots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为

5、可冋收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没冇逃脱成为可回收对象的可能性,则基木上就真的成为可回收对象了。至于可达性分析法具体是如何操作的我暂时也没冇看得很明白,如果冇哪位朋友比较清楚的话请不吝指教。下面來看个例了:Objectaobj二Objectbobj二Objectcobj二aobj=bobj;aobj=cobj;cobj二null;aobj=nul1;newObject()newObject()newObject()第几行有可能会使得某个对象成为可回收对象?第7行的代码会导致有对象会成为可回收对象。至于为什么留给读者自己思考。再看一个例了

6、:Stringstr二newString(〃hello〃);SoftReferencesr=newSoftReference〈String>(newString(,zjava,/));WeakReferencewr=newWeakReference〈String>(newString(,zworld,z));这三句哪句会使得String对象成为可回收对象?第2句和第3句,第2句在内存不足的情况下会将String对象判定为可冋收对象,第3句无论什么情况下String对彖都会被判定为可回收对彖。最后总结一下平常遇到的比较常见的将对象判定为

7、可回收对象的情况:1)显示地将某个引用赋值为null或者将已经指向某个对彖的引用指向新的对象,比如下面的代码:Objectobj=newObject();obj=null;Objectobjl=newObject();Objectobj2=newObject();objl=obj2;2)局部引用所指向的对象,比如卜•面这段代码:voidfun(){for(inti=0;i<10;i++){Objectobj二newObject();System・out・printin(obj・gctClass());}}循环每执行完一次,生成的Object对象都会成为可冋收的对

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

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

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