关于Java垃圾收集相关小结。
在Java虚拟机的堆里放着所有正在运行的Java所创建的对象。但是没有明确的释放方法来释放这些对象,以空出对空间,J垃圾收集就是自动释放不再被使用的对象的过程。
为什么要使用垃圾收集?
“垃圾收集”这个名字暗示着程序不再使用的对象就是“垃圾”,就应该被丢弃。更精确的说法是“内存回收”,当一个对象不再被程序使用时候,它所使用的堆空间将被回收,以备后续的新对象所使用。
垃圾收集器所要做的事情是:
1. 分别出哪些对象是不再被使用的。
2. 将这些不再被使用的对象空间释放出来给其他对象使用(调用finalizer)。
除了释放不再被使用的对象,垃圾收集器还要处理堆碎块。
使用垃圾收集器的好处:
1. 提高生产效率,对于程序中空间释放,垃圾回收,堆碎块处理不在需要程序人员来完成,而由JVM完成。
2. 帮助程序保持完整性,垃圾收集是Java安全策略一个重要组成部分,Java程序员不可能因失误错误释放内存而导致JVM崩溃。
使用垃圾收集器缺陷:
加大了程序负担,可能影响程序性能,JVM必须对对象状态进行追踪,释放,管理内存,这些和显示直接释放内存比起来需要花费更多的CPU时间,而且在垃圾收集情况下,程序员对安排CPU时间来释放无用对象无控制性。
垃圾收集器所要做的事情:
1. 检索出垃圾对象。
垃圾检索通常通过建立一个跟对象的集合并且检查从这些跟对象开始的可触及性来实现。
如果正在执行的程序可以访问到跟对象和某个对象之间存在引用路径,这个对象就是可触及的。任何可触及的对象都是活动的,无法被触及的对象就是“垃圾”,因为他们不再印象程序的未来执行。
区分活动对象和垃圾两个基本方法就是引用计数和跟踪。
引用计数收集器:
引用计数是垃圾收集的早期策略。主要通过对象引用操作计数来实现判断是否是垃圾对象,一旦计数器为零,说明此对象以为垃圾,此时JVM可以对其进行回收。
计数器加(+):
1. 当一个对象被创建,并且指向该对象的引用被指定给一个变量,这个对象的引用计数被置为1。
2. 当任何变量被赋值为这个对象的引用时候,计数器加1。
计数器减(-):
1. 当一个对象的引用超过了生存期或者被设置一个新的值时,对象的计数减1。
2. 当一个对象被垃圾收集的时候,它引用的任何对象计数器减1。
计数器好处:
1. 可以很快的执行,交织在程序运行之中。
计数器坏处:
1. 引用计数无法检测出循环(即两个或者更多对象的互相引用),如父对象有一个对子对象的引用,而子对象也有一个对父对象的引用,这些对象永远都不可能计数为零。
目前这种计数已经不为人接受,显示生活中遇到Java虚拟机更有可能在垃圾收集堆中使用追踪算法。