《垃圾回收机制.docx》由会员分享,可在线阅读,更多相关《垃圾回收机制.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、浅谈JAVA垃圾回收机制摘要:垃圾回收机制是JAVA的主要特性之一,在对垃圾回收机制进行概述之后,本文 从失去引用和离开作用域这两个角度分析了 JAVA程序中的对象在何种条件下满意 垃圾回收的要求。最终,本文简要介绍了垃圾回收机制的两个特性。关键词:JAVA ;垃圾回收机制;离开作用域;失去引用;自动性;不行预期性作为一种适应于Internet计算环境、面对对象并具有平台无关性的编程语言JAVA早 已确立了在IT界的地位,并因网络日益广泛的应用而变得越来越重要。因此,在高校中JAVA 也渐渐受到更多老师和同学的重视。实际上,JAVA源自C+语言。但JAVA语言避开了 C+ +中晦涩的结构,胜利
2、翻越了 多重继承机制的恼人问题;JAVA的垃圾回收机制显著地提高了生产率,降低了简单度;在 网络背景下使用虚拟机,以及有关平安性和动态加载的一系列设计选择,迎合了正在消失的 需求和愿望。这些特性使Java不仅成为现有程序员的武器,而且也为新的程序员制造了富 强的市场空间。在JAVA语言的上述特性中,本文主要分析其垃圾回收机制。一、JAVA垃圾回收机制概述在VB、C + +等某些程序设计语言中,无论是对象还是动态配置的资源或内存,都必需 由程序员自行声明产生和回收,否则其中的资源将不断消耗,造成资源的铺张甚至死机。由 于要预先确定占用的内存空间是否应被回收是特别困难的这就导致手工回收内存往往是一
3、 项简单而艰难的工作。因此,当使用这些程序设计语言编程时,程序员不仅要考虑如何实现 算法以满意应用,还要花费很多精力考虑合理使用内存避开系统崩溃。针对这种状况JAVA语言建立了垃圾回收机制。JAVA是纯粹的面对对象的编程语言, 其程序以类为单位程序运行期间会在内存中创建很多类的对象。这些对象在完成任务之后, JAVA的垃圾回收机制会自动释放这些对象所占用的空间,使回收的内存能被再次采用,提 高程序的运行效率。垃圾回收不仅可以提高系统的牢靠性、使内存管理与类接口设计分别, 还可以使开发者削减了跟踪内存管理错误的时间从而把程序员从手工回收内存空间的繁重 工作中解脱出来。JAVA垃圾回收机制另一个特
4、点是,进行垃圾回收的线程是一种低优先级的线程,在一 个Java程序的生命周期中,它只有在内存空闲的时候才有机会运行。下面本文从对象的失去引用和对象离开作用域这两个方面进行分析,研讨JAVA 程序中的对象什么时候可以被当作垃圾来进行回收。二、对象的失去引用通过下面的一段JAVA程序(例1),我们可以争论程序中的对象是否已经符合垃圾回 收的条件。请留意,我们只是争论某个对象是否符合被回收的条件,这并不意味着该对象将 被马上回收,关于这一点,本文后面还将进一步说明。例1 :1. class Computer(2. public class GarbageCollector 3. Computer m
5、akeComputerQ 4. Computer tempComputer= new Computer();5. return tempComputer;6. )7. public static void main (String args) 8. GarbageCollector t = newGarbageCollector();9. Computer newComputer=t.makeComputer();10. System.out.println( tempComputer所指向的对象可以被当作垃圾回收);11. Computer computerl=new Computer();
6、12. Computer computer?二new Computer();13. computer?= computeri;14. Computer computer3 = new Computer();15. computers=null;16. System.out.println( computer3所指向的对象可以被当作垃圾回收);puterl=null;18. System.out.println( computeri所指向的对象不能被当作垃圾回收);19. 20. 在连续争论之前,我们首先回顾JAVA的两个基本概念引用和对象。引用类似于其 它程序设计语言中的指针。引用就象一个商标
7、标签或者指示牌,它上面写着物品的名称,比 如电脑,可是它并不是电脑。当把这个标签贴到电脑上后,标签与电脑就联系起来,它 就代表电脑了。因止匕Computer computeri=new Computer。;可理解为先创建一个对象 的标签computeri ,然后把标签贴到新创建的对象Computer上。当创建的对象内没有任 何标签指向它时,就可被当作垃圾进行回收。电脑2computer2基于例1中的第11行第20行,我们分析一个JAVA对象什么时候处于“失去引用 状态从而满意被回收的条件。电脑1computeri第 11 行(见图 1), Computer computeri二new Comp
8、uter。;仓U建了弓I用(标签) computeri ,及对应的对象(真实的第一台电脑),可以形象地理解为把标签computeri 贴在第一台电脑上。第 12彳子见图 2 ) Computer computer?=new Computer。;创建了标签computer2 , 及对应的对象(真实的其次台电脑),并把标签computer2贴在其次台电脑上。电脑3computers电脑1电脑2computericomputer2第13行(见图3 ), computer2=computerl;该语句的结果是使引用computer2指 向computeri指向的对象。就是说computer2原来指向的
9、对象失去了引用,该对象会被 回收。所以,现在就有两个引用computeri和compute2指向原来computeri指向的对 象。形象地说,computeri=computer2的意思就是把computer2这个标签撕了下来贴 在了 computeri标签所在的电脑上,所以电脑2就没有了标签而成为垃圾,电脑1就有了 两个标签。第 14彳T 见图4 ) Computer computer3=new Computer。创建了标签computed , 及对应的对象(真实的第三台电脑),并把标签computers贴在第三台电脑上。电脑1computericomputer2电脑3computers第1
10、5行(见图5 ), computer3=null;使引用该computers无指向,该行相当于把 computed标签从电脑上撕了下来。第三台电脑由于失去引用而无法访问,就成为了垃圾 而被JAVA自动回收。第17行(见图6 ), computerl=null;该行相当于把computeri标签从电脑上撕了 下来。但是computeri标签所在的第一台电脑并没有成为垃圾,由于还有一个computer2 标签贴在上面。应指出的是,虽然可以通过将对象的引用变量初始化为null值来示意垃圾收集线程收 集该对象,但此时假如该对象连接有大事监听器,那它还是不行以被收集。所以在设一个引 用变量为null值之
11、前,应留意该引用变量指向的对象是否被监听,若有,要首先除去监听 器,然后才可以赋空值。三、对象离开作用域我们知道,在传统的面对过程语言(如C语言)中,当一个方法执行完毕,其中的局 部变量就因离开了作用域而被释放;以后当该方法再次被调用时,其中的局部变量会被重新 创建。但在VB、C+等引入面对对象方法的编程语言中,其程序中基本类型的变量可以在 离开作用域后被自动释放,但对象并不能被自动释放。JAVA语言的垃圾回收线程通过自动 跟踪对象的使用状况,能够使程序中的对象类似于基本类型那样在离开作用域之后被回收。基于例1中的第1行第10行,可以分析一个JAVA对象如何因离开作用域而满 意被回收的条件。临
12、时电脑tempComputer第 4 彳亍(见图 7 ), Computer tempComputer 二 new tempComputer。;仓I建了弓|用 (标签)tempComputer ,及对应的对象(真实的电脑),可以形象地理解为把标签 tempComputer贴在临时电脑上。第 9 行,Computer newComputer= t.makeComputer。;通过调用 t 的方法 makeComputer。来创建一个Computer的对象,并用标签把newComputer贴在该电脑 上。对象tempComputer是一个局部变量,xc在方法makeComputer结束后,系统会自
13、 动地把函数返回值作一份拷贝复制给调该方法的引用,然后对象tempComputer所被当作 垃圾回收。四、JAVA垃圾回收机制的特点前面我们争论了 JAVA程序中的对象在什么条件下满意被回收的条件,而垃圾回收线程 如何回收这些垃圾”,则遵循以下两个特性。1 .自动性。Java技术供应了一个系统级的线程,即垃圾收集器线程,来跟踪每一块 安排出去的内存空间,当Java虚拟机处于空闲循环时,垃圾收集器线程会自动检查每一块 安排出去的内存空间,然后自动回收每一块可以回收的无用的内存块。2 .不行预期性。一个对象成为了垃圾,但是你不能断言,该对象在这行以后就马上 被清除,甚至有可能当程序结束后,该对象仍旧占用内存。像Windows这样的软件经常会 消失内存不足的状况,JAVA程序很少消失就是由于可以自动回收内存。然而,由于JAVA 也不能保证准时地清除无用的对象,所以JAVA程序也会消失内存不足的状况,只是这种状 况很少消失。垃圾收集线程在一个Java程序中的执行是自动的,不能强制执行,即使程序 员能明确地推断出有一块内存已经无用了,是应回收的,程序员也不能强制垃圾收集器回收 该内存块。程序员唯一能做的就是通过调用System.gc方法来建议”执行垃圾收集器,但 其是否可以执行,什么时候执行却都是不行知的。
限制150内