关于垃圾回收器工作机制

来源:互联网 发布:网络普通发票管理系统 编辑:程序博客网 时间:2024/06/05 22:53


垃圾回收器对于提高对象的创建速度,有明显效果!

Java的“堆指针”只是简单的移动到尚未分配的区域!

垃圾回收器的引用计数技术:缺陷是对象循环引用,存在对象被回收,计数不为零!未被应用任何Java虚拟机!

目前思想依据是:堆任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用,用这些引用以及对象的引用贯穿到最终的所有“活”的对象!在这种方式下,JVM采用“自适应”的垃圾回收技术。采用“停止——复制”(stop-copy)的方法。不过存在两个问题:
1) 空间加倍  2)产生少量垃圾时,复制对象引用造成浪费。

所以Sun早期的JVM采用“标记——清扫”(mark-and-sweep),一般情况比较慢,但是如果知道会产生少量垃圾的时候或者根本不产生的时候,速度就很快了! 现在通过使用两种方式的切换达到提高效率,这就是“自适应”技术!

JVM使用附加技术提升速度。尤其是与加载器操作有关的,被称为“即时”(Just-In-Time,JIT)编译器的技术!即先把程序全部或者部分翻译成本地机器码,程序运行速度因此得以提升。当需要装载某个类(通常是为该类建立第一个对象时),编译器会先找到.class文件,将改类的字节码装入内存。连个方案可供选择:

1)即时编译器编译所有代码——两个缺陷:加载动作散落在整个程序生命周期内,累加起来要花更多时间;并且增加可执行代码的长度(字节码要比即时编译器展开后的本地机器码小很多),这将导致页面调度,从而降低程序速度。另一种做法称为“惰性评估”(lazy evaluation),意思是即时编译器只在必要的时候才编译代码。这样,从不会执行的代码也许就压根不会被JIT所编译。新版JDK中的Java HotSpot技术采用类似的方法,代码每次被执行的时候都会做一些优化,所以执行的次数越多,它的速度就越快。