java垃圾处理机制(二)

来源:互联网 发布:怎么改软件字体大小 编辑:程序博客网 时间:2024/05/08 14:25

如果所java虚拟机是java的灵魂所在的话,java的垃圾处理机制应该就是jvm的灵魂了!网上也有许多关于java垃圾处理的文章,但是看别人讲的不如自己归纳总结。我就来一步步地接上次的内容剖析。

4.主动的垃圾回收

这里不得不看俩个方法System.gc()和 finalize()。
System.gc():经过我的测试我发现,即使是主动调用System.gc().如果系统拥有足够的内存空间,系统也不会马上释放掉没用的内存空间。这点更我想象的有很大的差别,原来一直以为调用了就马上会回收垃圾。这一方面也是jvm在告诉我们,一般情况什么垃圾处理的工作都不用做了。
finalize():系统调用gc进行立即处理的时候,当此对象被当做垃圾处理掉的时候。
但是我在进行测试的时候惊奇地发现了gc机制的小bug。有点了不得。不对,我得好好测试验证一下,些许会在以后的博客中给大家分享。不过不伤本文大局。继续。

5.java对象的生命周期

学过applet,servlet,application,service的生命周期,然而对java的生命周期却好像很深奥的样子。
在JVM运行空间中,对象的整个生命周期大致 可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段 (Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。
在创建阶段:(1)为对象分配存储空间。(2)开始构造对象。(3)递归调用其超类的构造方法。(4)进行对象实例初始化与变量初始化。(5)执行构造方法体。
在应用阶段:对象具备这些特征(1)系统至少维护着对象的一个强引用(Strong Reference);(2)所有对该对象的引用全部是强引用(除非我们显式地使用了:软引用(Soft Reference)、弱引用(Weak Reference)或虚引用(Phantom Reference))。
不可视阶段:在一个对象经历了应用阶段之后,那么该对象便处于不可视阶段,说明我们在其他区域的代码中已经不可以再引用它,其强引用已经消失。
不可到达阶段:处于不可到达阶段的对象,在虚拟机所管理的对 象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量,所有已装载的类的静态变量或者对本地代码接口(JNI)的引用。 这些对象都是要被垃圾回收器回收的预备对象,但此时该对象并不能被垃圾回收器直接回收。其实所有垃圾回收算法所面临的问题是相同的——找出由分配器分配 的,但是用户程序不可到达的内存块。
其他状态:这时候就有下面的几种状态(1)垃圾回收器发现该对象已经不可到达。(2)finalize方法已经被执行。(3)对象空间已被重用。

参考文章:http://houyaowei.blog.163.com/blog/static/902363320092111343505/
6 0