内存管理与垃圾收集—自动化的典范

上传人:ni****g 文档编号:569799243 上传时间:2024-07-31 格式:PPT 页数:22 大小:567.50KB
返回 下载 相关 举报
内存管理与垃圾收集—自动化的典范_第1页
第1页 / 共22页
内存管理与垃圾收集—自动化的典范_第2页
第2页 / 共22页
内存管理与垃圾收集—自动化的典范_第3页
第3页 / 共22页
内存管理与垃圾收集—自动化的典范_第4页
第4页 / 共22页
内存管理与垃圾收集—自动化的典范_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《内存管理与垃圾收集—自动化的典范》由会员分享,可在线阅读,更多相关《内存管理与垃圾收集—自动化的典范(22页珍藏版)》请在金锄头文库上搜索。

1、内存管理与垃圾收集内存管理与垃圾收集自动化自动化的典范的典范什么是“垃圾”ObjectReferences=NULLAnother Object当当Object在作用域内在作用域内/创建字符串对象,并将引用创建字符串对象,并将引用s指向该对象指向该对象String s1 = new String();/另一引用,引用同一对象另一引用,引用同一对象String s2 = s1;/将将s1赋值为赋值为null,此时,此时s2仍指向这一对象,此仍指向这一对象,此String对象还不是垃对象还不是垃圾圾s1 = null;/将将s2引用另一个对象,此时原引用另一个对象,此时原String对象以无引用,

2、成为垃圾对象以无引用,成为垃圾s2 = “abc”;什么是“垃圾”当当Object在作用域外在作用域外public void exsample1()Double d = new Double(26.77);System.out.println(d);public void exsample2exsample1();什么是“垃圾”并不是被引用的对象就一定不是垃圾并不是被引用的对象就一定不是垃圾class Islandpublic Island brother;Island i1 = new Island();Island Objecti1.BrotherIsland Objecti2.Broth

3、erIsland i2 = new Island();i1i2i1.brother = i2;i2.brother = i1;i1 = null;i2 = null;什么是垃圾线程垃圾(除满足一般条件外,还要求线程已死亡或未启动)线程垃圾(除满足一般条件外,还要求线程已死亡或未启动)/定义线程垃圾类定义线程垃圾类class RubbishThread extends Thread/定义一个自身类型的引用定义一个自身类型的引用RubbishThread brother;String rName;public RubbishThread()public RubbishThread(String r

4、Name)this.rName = rName;public void run()System.out.println(rName + “线程开始执行!线程开始执行!”);tryThread.sleep(1000);catch(Exception e)e.pringStackTrace();System.out.println(rName + “线程运行结束!线程运行结束!”);public void finalize()System.out.println(rName + “对象成为垃圾,并被回收对象成为垃圾,并被回收”);什么是垃圾线程垃圾(除满足一般条件外,还要求线程已死亡或未启动)线程

5、垃圾(除满足一般条件外,还要求线程已死亡或未启动)public class examplepublic static void main(String args)RubbishThread r1 = new RubbishThread(“r1”);RubbishThread r2 = new RubbishThread(“r2”);r1.brother = r2;r2.brother = r1;r1.start();r1 = null;r2 = null;System.gc();tryThread.sleep(2000);catch(Exception e)e.printStackTrace(

6、);System.gc();tryThread.sleep(1000);catch(Exception e)e.printStackTrace();垃圾收集器内存中有了内存中有了“垃圾垃圾”就需要清理,以便为创建其他对象让出空间,就需要清理,以便为创建其他对象让出空间,而垃圾收集器扮演了这个清洁工的角色。这就将开发人员从繁杂的内存管理而垃圾收集器扮演了这个清洁工的角色。这就将开发人员从繁杂的内存管理中解放出来,专注于业务逻辑的开发,可以大幅度的提高开发效率,降低开中解放出来,专注于业务逻辑的开发,可以大幅度的提高开发效率,降低开发难度。发难度。开发人员需要做的工作仅仅是将不需要的对象根据规则开

7、发人员需要做的工作仅仅是将不需要的对象根据规则“标识标识”为为垃圾,而垃圾收集器何时收集垃圾,如何收集垃圾都不需要开发人员关心。垃圾,而垃圾收集器何时收集垃圾,如何收集垃圾都不需要开发人员关心。需要注意的是,由于垃圾收集器的运行是由系统自动控制的,因此垃圾收集需要注意的是,由于垃圾收集器的运行是由系统自动控制的,因此垃圾收集器何时收集垃圾是没有保障的。器何时收集垃圾是没有保障的。其次,垃圾收集器就是一个其次,垃圾收集器就是一个后台守护线程后台守护线程,在内存充足的情况下其,在内存充足的情况下其优先级很低优先级很低,一般不出来运行,当垃圾充斥着内存,严重影响程序的执行时,一般不出来运行,当垃圾充

8、斥着内存,严重影响程序的执行时,其优先级会提高,并出来运行收集垃圾,清理内存。正因如此,垃圾收集器其优先级会提高,并出来运行收集垃圾,清理内存。正因如此,垃圾收集器的运行时间是没有保障的。的运行时间是没有保障的。申请垃圾收集器运行Runtime类中的几个常用方法类中的几个常用方法public static Runtime getRuntime()该方法将返回一个与当前运该方法将返回一个与当前运行程序相关的行程序相关的Runtime类的类的对象,相当于一个对象工厂对象,相当于一个对象工厂public void gc()申请垃圾收集器运行申请垃圾收集器运行public long totalMemo

9、ry()该方法将返回当前该方法将返回当前JVM使使用的总内存量,单位为字节用的总内存量,单位为字节public long freeMemory()该方法将返回当前该方法将返回当前JVM中中可使用的内存量,单位为字可使用的内存量,单位为字节节System类中也有申请垃圾收集器运行的方法类中也有申请垃圾收集器运行的方法public static void gc()申请垃圾收集器运行申请垃圾收集器运行finalize方法对象被作为垃圾清理出内存之前,有可能需要进行一些扫尾工作,在对象被作为垃圾清理出内存之前,有可能需要进行一些扫尾工作,在java中,这些扫尾工作的代码可以编写在被收集对象的中,这些扫

10、尾工作的代码可以编写在被收集对象的finalize方法之中。方法之中。finalize方法来自方法来自Object类类,因此每一个类都有此方法。在一个对象被作,因此每一个类都有此方法。在一个对象被作为垃圾收集之前,垃圾收集器会首先调用垃圾对象的为垃圾收集之前,垃圾收集器会首先调用垃圾对象的finalize方法,然后再清除垃方法,然后再清除垃圾对象。需要注意的是,对象何时被进行垃圾收集是没有保障的,有可能在整个应圾对象。需要注意的是,对象何时被进行垃圾收集是没有保障的,有可能在整个应用程序进行的生命周期中一直没有进行垃圾收集,因此需要保证执行的代码不应该用程序进行的生命周期中一直没有进行垃圾收集

11、,因此需要保证执行的代码不应该编写在此方法中。此外,在未修改父类的编写在此方法中。此外,在未修改父类的finalize的情况下重写子类的的情况下重写子类的finalize方法,方法,需要调用需要调用super.finalize()。C+重视通过调用析构函数由开发人员自己来处理内存的释放,而重视通过调用析构函数由开发人员自己来处理内存的释放,而java中中没有析构函数,在一定程度上没有析构函数,在一定程度上finalize方法就相当于析构函数。所不同的是,析构方法就相当于析构函数。所不同的是,析构函数是由开发人员自己释放对象时调用,而函数是由开发人员自己释放对象时调用,而finalize方法是垃

12、圾收集器自动调用的。方法是垃圾收集器自动调用的。finalize方法/定义一个能够阻止垃圾回收的类定义一个能够阻止垃圾回收的类class CallBack/定义用于挽救一个对象的静态引用定义用于挽救一个对象的静态引用static CallBack help;public void show()System.out.println(“该对象未被垃圾收集。该对象未被垃圾收集。”);/重写重写finalize方法方法public void finalize()CallBack.help = this;finalize方法class examplepublic static void main(Str

13、ing args)/创建一个创建一个CallBack对象,并使其成为垃圾对象,并使其成为垃圾new CallBack();System.gc();tryThread.sleep(100);catch(Exception e)e.printStackTrace();CallBack.help.show();CallBack.help = null;System.gc();tryThread.sleep(100);catch(Exception e)e.printStackTrace();CallBack.help.show();最终守护者模式class FinalGuarderprivate O

14、bject fg = new Object()public void finalize() throws Throwable.;class FinalGuarderSon extends FinalGuarderpublic void finalize() throws Throwable.三种特殊的引用三种特殊的引用垃圾回收算法分析Java语言规范没有明确地说明语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做垃圾收集算法一般要做2件基本的事情:件基本的事情:(1)发现无用信息对象;)发现无用信息对象;(2)回收被无用对象占用

15、的内存空间,使该空间可被程序再次使用。)回收被无用对象占用的内存空间,使该空间可被程序再次使用。 大多数垃圾回收算法使用了根集大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在这个概念;所谓根集就量正在执行的执行的Java程序可以访问的引用变量的集合程序可以访问的引用变量的集合(包括局部变量、参数、类变包括局部变量、参数、类变量量),程序可以使用引用变量访问对象的属性和,程序可以使用引用变量访问对象的属性和 调用对象的方法。垃圾收调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根

16、集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间 接可达接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。回收。下面介绍几个常用的算法。 几种垃圾回收算法引用计数算法引用计数算法class Islandpublic static void main(String args)new Island(); Island i = new Island();Island引用计数0变量和方法Island引用计数1变量和

17、方法Island j;j = i;Island引用计数2变量和方法几种垃圾回收算法tracing算法算法(mark and sweep)根集根集(root set)这个概念;所谓这个概念;所谓根集就是正在执行的根集就是正在执行的Java程序程序可以访问的引用变量的集合可以访问的引用变量的集合(包包括局部变量、参数、类变量括局部变量、参数、类变量),程序可以使用引用变量访问对程序可以使用引用变量访问对象的属性和象的属性和 调用对象的方法。调用对象的方法。 几种垃圾回收算法compacting算法算法1111011内存分配内存分配引用标记引用标记。111111。内存分配内存分配引用标记引用标记111111。内存分配内存分配引用标记引用标记句句柄柄和和句句柄柄表表的的消消耗耗?几种垃圾回收算法copying算法算法(stop and copy)内存分配内存分配引用标记引用标记对象面空闲面空闲面内存分配内存分配引用标记引用标记对象面空闲面空闲面几种垃圾回收算法generation算法算法在程序设计中在程序设计中 有这样的规律:有这样的规律:多数对象存在的时间比较短,多数对象存在的时间比较短,少数的存在时间比较长。少数的存在时间比较长。 Old generationNew generationUserDefined aUserDefined bUserDefined aC+中的垃圾回收

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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