关于GC

来源:互联网 发布:ubuntu sublime tar 编辑:程序博客网 时间:2024/06/04 19:40

《深入理解Java虚拟机》真的是看多少遍都不多,每次都有新体会
堆中存放着许多对象实例,许多是已经不用的(或者称死亡的),不清理它太占内存,垃圾回收器就是回收这些对象,释放对象所占的内存。

怎么判断对象已死呢?
2种方法:
1,引用计数法:(解决不了相互引用的问题,已经咋不用了)
2,根搜索算法
堆内存就像一颗大树,树根叫GC root,根搜索算法就是,以树根为起点开始搜索,搜索走过的路径叫引用链(相当于树枝),当一个对象没有被任何引用链相连,属于树外的东西,这个对象是不可达的;
树根是什么东西呢?
虚拟机栈引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
再说说引用(4类):
强引用:只要引用还在,无论如何不会被回收的引用
软引用:当内存不够时会被考虑回收
弱引用:只能存活到下次回收之前
虚引用:如同虚设,目的只是希望,在回收的时候,给系统一个通知

接下来开始回收:
找到了不可达对象后
1.筛选:筛选条件是,对象是否覆盖finalize()方法,并且之前没有被调用过,将筛选出来的对象放到F-Queue队列里,并稍后由虚拟机自动建立的一个低优先级的线程执行,
2.标记:若将死对象在finalize()方法中,将自己与引用链上的任何一个对象建立了关联,成功解救了自己,将它标记并移出这个将死集合
重点!对象只可能逃脱一次,当第二次发现它是个不可达对象的时候,以为他的finalize()方法已经被执行过一次了,finalize()方法不会再被执行!

自己的理解,有不对的欢迎指出!一起进步~

原创粉丝点击