本文主要是介绍finalize关键字和垃圾回收的一些知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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所编译。
这篇关于finalize关键字和垃圾回收的一些知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!