您的位置:首页 > 其它

finalize关键字和垃圾回收的一些知识

2015-11-05 16:21 197 查看

1.finalize()方法

1)finalize()的工作原理:假定一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收时候做一些重要的清理工作。

2)JAVA中的对象并非总是被垃圾回收:

a)垃圾可能不被垃圾回收

b)垃圾回收并不等于“析构”

c)垃圾回收只与内存有关

使用垃圾回收的唯一原因是为了回收程序不再使用的内存,所以对于与垃圾回收有关的任何行为来说,它们也必须同内存及其回收有关。

2.如何进行的垃圾回收

1)引用计数法:是一种简单但是速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用连接到对象时,引用计数加1.当引用离开作用域或被置为null时,引用计数减1.虽然管理引用计数的开销不大,但是这开销需要在整个程序的生命周期中将持续发生,垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。这个方法也有缺陷,如果对象之间存在循环引用,可能会出现“对象应该被回收,但是引用计数却不是0”的情况。对于垃圾回收器而言,定位这样的交互自引用的对象组所需的工作量极大。引用计数常用来说明垃圾收集的工作方式,但似乎未被应用到任何一种java虚拟机实现中。

2)根搜索算法

通过假定的一个root开始搜索,沿着每条引用搜索,如果该对象到root不可达,此时该对象就会被垃圾回收。

3.一些更快的模式中,垃圾回收并非基于引用计数技术。他们依据的思想是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈或者静态存储区开始,遍历所有的引用,就能找到所有“活”的对象。对于发现的每个引用,必须追踪他所引用的对象,然后是此对象包含的所有引用,访问过的对象必须都是“活”的。这就解决了“交互自引用的对象组”的问题(这种现象根本不会被发现,因此也就被自动回收了)。

4.Java虚拟机中有许多附加的技术用来提升速度。尤其是与加载器操作有关,被称作为"即时"编译器的技术。这种技术可以吧程序全部或部分翻译成本地机器码,程序的运行速度因此得到了提升。当需要装在某个类时,编译器会先找到其.class文件,然后将该类的字节码装入内存,此时有两种方案可以供选择。一种是让即时编译器编译所有的代码,这种做法有两个缺陷:这种动作散落在整个程序的生命周期内,累加起来花更多的时间;并且会增加可执行代码的长度,这将导致页面调度,从而降低程序速度。另外一种做法是惰性评估,即时编译器只在必要的时候才去编译代码。这样,从不会被执行的代码也许就压根不会被JIT所编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: