课 题 | 垃圾回收机制 | 教案编号 | 8-7、8-8 | |
时间班级 | 第 八 周 星期五 08 软件4 班 第1-4节 | 课 时 | 2节 | |
教学目的与 教学要求 | 掌握解垃圾回收机制 掌握finalize方法 掌握强制垃圾回收方法。 了解垃圾回收机制提供的编程理念 | |||
教学重点 | 了解垃圾回收机制的原理 | 高铁动车区别|||
教学难点 | 了解垃圾回收机制的原理 | |||
课的类型 | 理论 | 教具准备 | 计算机 | |
参考教材 | 《疯狂java讲义》 电子工业出版社 | 教师 | 练佳熠 | |
使用教材 | 《Java程序设计技能教程》中国水利水电出版社 | |||
教学环节与内容 |
1、为什么是垃圾? 日常生活中,垃圾是指不需要或无用的物质。那么在程序中什么是垃圾呢? 我们知道,程序在运行期间都要动态地分配内存空间。比如当新建一个int变量时,我们需要分配给它4个字节的内存空间;新建一个字符变量时,占两个字节的内存空间;当新建一个对象时,我们需要分配给该对象所需的内容空间。 当程序不再需要该对象,即该对象不再被调用时,该对象就称为所谓的垃圾。 2、为什么要进行垃圾回收?月季修剪 由于内存空间是有限的,因此当一些分配出去的内存得不到及时回收,就会导致内存可用空间下降,从而引起系统运行速度的下降,甚至导致程序瘫痪,这种现象称为内存泄露。当一个对象称为垃圾之后,系统就没必要再为这个对象分配内存空间,该程序或其运行环境就应该回收该内存空间,以节省宝贵的内存资源,防止内存泄露。 3、C++和Java的垃圾回收机制比较。 (1)了解C++和Java的垃圾回收机制 在C++里,释放内存是手动处理的,即由程序员直接控制垃圾回收。程序员要用delete运算符来释放分配的内存。当认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了。 在Java中不需要由程序员直接控制垃圾回收,它提供了一个系统级的线程(Thread),即系统收集器线程(Garbage Collection Thread),来跟踪每一块分配出去的内存,当Java虚拟机处于空闲循环时,垃圾收集器线程会自动检查每一快分配出去的内存空间,然后自动回收每一快可以回收的无用的内存块。 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用System. gc方法来 "建议 "执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。 (2)两种垃圾回收机制的对比(C++是听话的孩子,JAVA是自觉的孩子) ①C++垃圾回收机制的优缺点:在程序员可以直接控制垃圾回收,能较精确的控制内存,通常可以保证同一软件在使用时占据的内存空间相对Java要小,效率比java要高;但控制垃圾回收是件非常繁琐且难度很高的事,因为程序员入什么三分并不总是知道内存应该何时被释放,因此在很多论坛的C++板块经常可以看到一大堆关于内存泄漏的话题。 ②Java垃圾回收机制的优缺点:Java的垃圾回收机制使得程序员从繁琐的垃圾回收中解放出来,大大提高了编程效率,并且有效地防止了内存渗漏体的出现,提高了软件的安全性;但由于Java虚拟机必须跟踪程序中的有用对象,才可以确定哪些对象是无用的对象,这个过程需要花费处理器的时间;同时不能保证100%收集到所有的废弃内存;程序员也无法精确控制垃圾回收。 4、对象在何时被丢弃? (1)激活状态:当一个对象被创建后,有一个以上的引用变量引用它,则这个对象在程序中处于激活状态。 (2)去活状态:如果程序中某个对象不再有任何引用变量引用它,它就进入去活状态。在这个状态下,系统的垃圾回收机制准备回收该对象所占用的内存,在回收该对象之前,系统会调用所有去活状态对象的finalize方法进行资源清理,如果系统在调用finalize方法重新让一个引用变量引用该对象,则这个对象会再次变为激活状态;否则该对象将进入死亡状态。 (3)死亡状态:当对象与所有引用变量的关联都切断,且系统已经调用所有对象的finalize方法依然没有使该对象变成激活状态,那这个对象将永久性地失去引用,最后变成死亡状态。只有当一个对象处于死亡状态时,系统才会真正回收该对象所占有的资源。 举例: 程序段1 1、String a = new String("轻量级J2EE企业应用实战"); 2、a = new String("Struts2权威指南"); 问:在这段代码中,有几个对象?在每行代码中,这些对象都分别处于什么状态?哪个对象可以被系统回收占有的资源。 答:有2个对象。第一行代码执行后,"轻量级J2EE企业应用实战"字符串对象处于激活状态;第二行代码执行后,"Struts2权威指南"字符串对象处于激活状态,而"轻量级J2EE企业应用实战"字符串对象处于去活状态,符合垃圾收集器的收集标准。 练习: 程序段2: 1.Object fobj = new Object ( ) ; 2.fobj. Method ( ) ; 3.fobj = new Object ( ) ; 4.fobj. Method ( ) ; 问:这段代码中,第几行符合垃圾收集器的收集标准? 答:第3行。 5、finalize方法 (1)方法介绍:Finalize()方法是Object类的一个方法,任何一个类都可以从Object继承该方法,并且覆盖它。它的方法原型为: 关公铜像 Protected void finalize() throws Throwable。 其中,方法原型中的throws Throwable表示它可以抛出任何类型的异常。 (2)调用机制:当虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法(即当虚拟机确定对象为去活对象时,并准备回收该对象所占有资源的时候,才会调用finalize()方法)。——因此也称finalize()方法为对象的遗书。 注意:finalize()方法是在对象被当成垃圾从内存中释放前调用,而不是在对象变成垃圾前调用考研英语作文题目! 新大陆交响曲(3)特点: ①对一个对象调用finalize()永远不会多于一次。不要主动调用某个对象的finalize方法,该方法应交给垃圾回收机制调用。 ②finalize方法何时被调用,是否被调用具有不确定性。不要把finalize方法当成一定会被执行的方法。 ③当JVM执行去活对象的finalize方法时,可能使该对象或系统中其他对象重新变成激活状态。——JVM是一个仁慈的杀手 6、强制垃圾回收方法: 虽然程序无法精确控制Java垃圾回收的实际,但我们依然可以强制系统进行垃圾回收——只是这种强制只是通知系统进行垃圾回收,但是系统是否进行垃圾回收依然不确定。当然大部分时候,强制系统垃圾回收总会有一些效果。 强制垃圾回收有如下两个方法: (1)调用System类的gc()静态方法:() (2)调用Runtime对象的gc()实例方法:Runtime().gc() 备注:System类和Runtime对象都在java.lang包中 7、示例:Test1.java 示例:Test2.java 7、总结垃圾回收机制 (1)总结垃圾回收机制: 判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: ①给对象赋予了空值null,以下再没有调用过。 ②给对象赋予了新值,既重新分配了内存空间。 但一般只有在系统出现空闲或者是内存紧张时,JVM才会进行垃圾回收。 (2)从中领悟到的编程理念。 在编写Java程序时,一个基本原则是:对于不再需要的对象,不要再去引用它。 数学练习册答案8、课堂练习: (1)请同学们建立一个Student类,并重写其finalize()方法使之输出“Student对象正被清理……”,然后分以下两种情况编写程序。 ①让系统建立10个Student类的对象(建立后立即让其处于去活状态)并运行。 ②将上述数字10改为1000000,再次运行查看运行结果。 库仑说出为什么会造成这种结果。 (2)请同学们建立4个字符串对象,并用for循环输出这些对象。请用本节课的编程理念进行程序编写。 |
小结 掌握垃圾回收机制,并了解垃圾回收机制提供的编程理念,然后通过课堂练习加深理解。 |
课后小记 |
本文发布于:2023-07-12 22:51:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093283.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |