下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一谁在做Garbage Collection? 一种流行的说法:在C+里,是系统在做垃圾回收;而在Java里,是Java自身在做。 在C+里,释放内存是手动处理的,要用delete运算符来释放分配的内存。这是流行的说法。确切地说,是应用认为不需要某实体时,就需用delete 告诉系统,可以回收这块空间了。这个要求,对编码者来说,是件很麻烦、很难做到的事。随便上哪个BBS,在C/C+版块里总是有一大堆关于内存泄漏的话 题。 Java采用一种不同的,很方便的方法:Garbage Collection。垃圾回收机制放在JVM里。JVM完全负责垃圾回收事宜,应用只在需要时申请空间,而在抛弃对象时不必关
2、心空间回收问题。二对象在啥时被丢弃? 在C+里,当对象离开其作用域时,该对象即被应用抛弃。 在Java里,对象的生命期不再与其作用域有关,而仅仅与引用有关。 Java的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。 一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回 收了。这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。 JVM的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为
3、0时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。三丢弃就被回收? 该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。 但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,势必会使整个系统 的运转效率非常低下。前面说过,JVM的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。 JVM的垃圾回收机制要在时间和空间之间做个平衡。 因此,为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系
4、统需要回收。切记垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。四没有引用变量指向的对象有用吗? 前面说了,没挂上引用变量的对象是被应用丢弃的,这意味着,它在堆空间里是个垃圾,随时可能被JVM回收。不过,这里有个不是例外的例外。对于一次性使用 的对象(有些书称之为临时对象),可以不用引用变量指向它。举个最简单也最常见的例子:System.out.println(“I am Java!”);就是创建了一个字符串对象后,直接传递给println()方法。五应用能干预垃圾回收吗? 许多人对Java的垃圾回收不放心,希望在应用代码里控制JVM的
5、垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给JVM。 第一个前面已经说了,就是将指向某对象的所有引用变量全部移走。这就相当于向JVM发了一个消息:这个对象不要了。第二个是调用库方法 System.gc(),多数书里说调用它让Java做垃圾回收。 第一个是一个告知,而调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。 希望JVM及时回收垃圾,是一种需求。其实,还有相反的一种需要:在某段时间内最好不要回收垃圾。要求运行速度最快的实时系统,特别是嵌
6、入式系统,往往希望如此。 Java的垃圾回收机制是为所有Java应用进程服务的,而不是为某个特定的进程服务的。因此,任何一个进程都不能命令垃圾回收机制做什么、怎么做或做多少。六对象被回收时要做的事 一个对象在运行时,可能会有一些东西与其关连。因此,当对象即将被销毁时,有时需要做一些善后工作。可以把这些操作写在finalize()方法(常称之为终止器)里。 protected void finalize() / finalization code here 这个终止器的用途类似于C+里的析构函数,而且都是自动调用的。但是,两者的调用时机不一样,使两者的表现行为有重大区别。C+的析构函数总是当对象
7、 离开作用域时被调用。这就是说,C+析构函数的调用时机是确定的,且是可被应用判知的。但是,Java终止器却是在对象被销毁时调用。一旦垃圾收集器准 备好释放无用对象占用的存储空间,它首先调用那些对象的finalize()方法,然后才真正回收对象的内存。由上所知,被丢弃的对象何时被销毁,应用是 无法获知的。而且,对于大多数场合,被丢弃对象在应用终止后仍未销毁。 在编码时,考虑到这一点。譬如,某对象在运作时打开了某个文件,在对象被丢弃时不关闭它,而是把文件关闭语句写在终止器里。这样做对文件操作会造成问题。 如果文件是独占打开的,则其它对象将无法访问这个文件。如果文件是共享打开的,则另一访问该文件的对
8、象直至应用终结仍不能读到被丢弃对象写入该文件的新内 容。 至少对于文件操作,编码者应认清Java终止器与C+析构函数之间的差异。 那么,当应用终止,会不会执行应用中的所有finalize()呢?据Bruce Eckel在Thinking in Java里的观点:“到程序结束的时候,并非所有收尾模块都会得到调用”。这还仅仅是指应用正常终止的场合,非正常终止呢?因此,哪些收尾操作可以放在 finalize()里,是需要酌酎的。七.Thinking ing java 一书中也对垃圾回收做了一些小结 java垃圾回收,主要是靠一个低优先级的进程负责回收,注意,不是后台的进程他的优点是边回收,边调整堆使
9、其紧凑主要有以下几种算法:1.引用计数该算法在java虚拟机没被使用过,主要是循环引用问题,因为计数并不记录谁指向他,无法发现这些交互自引用对象。怎么计数?当引用连接到对象时,对象计数加1当引用离开作用域或被置为null时减1怎么回收?遍历对象列表,计数为0就释放有什么问题?循环引用问题。2.标记算法标记算法的思想是从堆栈和静态存储区的对象开始,遍历所有引用,标记活得对象对于标记后有两种处理方式(1)停止-复制所谓停止,就是停止在运行的程序,进行垃圾回收所谓复制,就是将活得对象复制到另外一个堆上,以使内存更紧凑优点在于,当大块内存释放时,有利于整个内存的重分配有什么问题?一、停止,干扰程序的正
10、常运行,二,复制,明显耗费大量时间,三,如果程序比较稳定,垃圾比较少,那么每次重新复制量是非常大的,非常不合算什么时候启动停止-复制?内存数量较低时,具体多低我也不知道(2)清除也称标记-清除算法也就是将标记为非活得对象释放,也必须暂停程序运行优点就是在程序比较稳定,垃圾比较少的时候,速度比较快有什么问题?很显然停止程序运行是一个问题,只清除也会造成很对内存碎片。为什么这2个算法都要暂停程序运行?这是因为,如果不暂停,刚才的标记会被运行的程序弄乱,(3)分代收集分代收集是利用程序有大量临时对象的特点,对象每被引用一次,代数就增加,代数小的小型对象会被回收整理,大对象只会代数增加,不会被整理。优点在于对于处理大量临时的变量很有帮助(4)自适应jvm会监测垃圾回收的效率,在(1),(2)算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三伏贴工作制度
- q抢救工作制度
- 专业队工作制度
- 便利蜂工作制度
- 保电工作制度
- 分装间工作制度
- 幼儿睡觉安全
- 幼儿园手足口病防控培训课件
- 脐带血宣传员销售培训
- 办公区域保洁员培训教材
- 2025年湖北咸宁市中考数学试题(附答案)
- 高标准农田建设工程质量专项整治技术手册
- 《用图表呈现数据》教学设计-2025-2026学年青岛版(2024)小学信息技术四年级上册
- 飞行计算机讲解
- 中华人民共和国传染病防治法(2025版)解读
- 水泥厂安全事故培训内容课件
- 2025年疾病预防控制中心招聘考试笔试试题含答案
- 第3课 中华文明的起源-2025-2026学年七年级历史上册(统编版2024)
- 知道智慧树名企之魂满分测试答案
- ccc基础知识培训材料课件
- 2025年辽宁省丹东市宽甸满族自治县大西岔镇国民经济和社会发展第十五个五年规划
评论
0/150
提交评论