JAVAJava垃圾回收机制小结

  一种流行的说法:在C++里, 是系统在做垃圾回收;而在Java里, 是Java自身在做。   在C++里, 这是流行的说法。 确切地说, 是使用认为不需求某实体时, 就需用delete告诉系统, 可以回收这块空间了。 这个要求, 是件很费事、很难做到的事。 在C/C++版块里总是有一大堆关于内存走漏的话题。 垃圾回收机制放在JVM里。 JVM完全担任垃圾回收事宜,   在Java里, 对象的生命期不再与其作用域有关, 而仅仅与援用有关。   Java的垃圾回收机制普通包含近十种算法。 我们不必予以关心。 只有其中最复杂的一个:援用计数法, 这个对象就被使用抛弃了。 或许说, 这个对象可以被垃圾回收机制回收了。 这就是说, 当不存在对某对象的任何援用时,   JVM的垃圾回收机制对堆空间做实时检测。 并不是马上予以销毁。   三. 丢弃就被回收?  该对象被认定为没有存在的必要了, 并不是对象被抛弃后当即被回收的。 JVM进程做空间回收有较大的系统开销。 如果每当某使用进程丢弃一个对象, 势必会使整个系统的运转效率非常低下。 前面说过, JVM的垃圾回收机制有多个算法。 除了援用计数法是用来判断对象是否已被抛弃外, 其它算法是用来确定何时及如何做回收。 为了提高系统效率, 垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需求回收。 切记垃圾回收要占用时间, 因此, 因此你无法知道垃圾回收发生的精确时间。   四. 没挂上援用变量的对象是被使用丢弃的, 这意味着, 随时可能被JVM回收。 不过, 这里有个不是例外的例外。 关于一次性使用的对象(有些书称之为暂时对象), println(“IamJava!”);就是创建了一个字符串对象后, 直接传递给println()办法。   五. 使用能干预垃圾回收吗?  许多人对Java的垃圾回收不担心, 希望在使用代码里控制JVM的垃圾回收运作。 使用只有两个途径发消息给JVM。 第一个前面曾经说了, 就是将指向某对象的所有援用变量全部移走。 这就相当于向JVM发了一个消息:这个对象不要了。 第二个是调用库办法System.   第一个是一个告知, 而调用System. gc()也仅仅是一个请求。 并不是立刻做垃圾回收, 而只是对几个垃圾回收算法做了加权, 使垃圾回出操作容易发生, 或延迟发生, 或回收较多而已。   希望JVM及时回收垃圾, 要求运行速度最快的实时系统,   Java的垃圾回收机制是为所有Java使用进程效劳的, 可能会有一些东西与其关连。 因此,   JAVA这个终止器的用途相似于C++里的析构函数, 两者的调用机遇不一样, 使两者的表现行为有重大区别。 C++的析构函数总是当对象离开作用域时被调用。 这就是说, C++析构函数的调用机遇是确定的, 一旦垃圾收集器预备好释放无用对象占用的存储空间, 被丢弃的对象何时被销毁, 使用是无法获知的。 而且, 关于大多数场合, 被丢弃对象在使用终止后仍未销毁。 考虑到这一点。 譬如, 某对象在运作时打开了某个文件, 在对象被丢弃时不关闭它, 而是把文件关闭语句写在终止器里。 这样做对文件操作会形成问题。 如果文件是独占打开的, 则其它对象将无法访问这个文件。 编码者应认清Java终止器与C++析构函数之间的差异。 当使用终止, 并非所有收尾模块都会失掉调用”。 非正常终止呢?因此, 哪些收尾操作可以放在finalize()里, 是需求酌酎的。 注意, 不是后台的进程  他的优点是边回收, 边调整堆使其紧凑  主要有以下几种算法:  1. 主要是循环援用问题, 无法发现这些交互自援用对象。   怎样计数?  当援用衔接到对象时,   2. 遍历所有援用, 标志活得对象  关于标志后有两种处理方式  所谓中止, 就是中止在运行的程序, 停止垃圾回收  所谓复制, 当大块内存释放时, 有利于整个内存的重分配  有什么问题?  一、中止, 搅扰程序的正常运行, 二, 复制, 如果程序比较动摇?那么每次重新复制量是非常大的, 也必需暂停程序运行  优点就是在程序比较动摇?速度比较快  有什么问题?  很显然中止程序运行是一个问题, 刚才的标志会被运行的程序弄乱, 代数就添加, 代数小的小型对象会被回收整理, 大对象只会代数添加,   优点在于关于处理少量暂时的变量很有协助  jvm会监测垃圾回收的效率, 在(1), (2)算法之间切换。   3. 增量收集, 分代可以逐代回收, Train算法可以逐个车厢回收, 这样每次一代或每次一厢可以实现短停顿回收。

posted on 2011-04-06 21:42  青青啊  阅读(166)  评论(0编辑  收藏  举报

导航