jvm垃圾回收机制

来源:互联网 发布:网络服务商地址 编辑:程序博客网 时间:2024/05/29 14:03

程序计数器,虚拟机栈,本地方法栈,是线程私有的内存空间,随线程而生,随线程而灭,器内存回收随方法或线程结束而回收,所以垃圾回收对这几个区域不过多的考虑。而java堆和方法区,在运行期间才知道创建那些对象,在其上的回收具有动态性。

(1)对象是否存活

判断算法
1.引用计数法(python使用)

做法:给对象添加一个引用计数器,有地方引用它,计数器加1,引用失效,计数器便减1,但可能存在对象间互相引用,使得其引用计数器都不为零,不能被gc收集器收集。
jvm 的Gc收集器没有采用引用计数法。

2.可达性分析算法(java,c#)
在jvm中有个GC Root Set ,里面有好多个“Gc Roots”对象 。

可作为Gc Roots的对象:

1.虚拟机栈中的引用对象
2.方法区中类静态属性引用的对象
3.方法区中的常量引用的对象
4.本地方法栈中jni引用的对象

算法分析:对于一个对象,若其没有一条可以到达任何Gc Roots的路径,则状态就变为可回收状态。

当一个对象成为可回收状态,不一定意味着其一定会被回收。
在这些状态被标记为可回收的对象中,垃圾收集器会进行一次筛选,

1.当对象没有覆盖finalize方法,或者该方法已被虚拟机调用过,则该对象便真正的被回收。

2.如果判定有必要执行finalize方法,那么将会把对象放到一个F-Queue(finalize queue :释放队列)中,最后将由虚拟机建立一个低优先级的finalizer线程去执行F-Queue中的对象,在此时,若对象让自己与Gc Root关联起来,例如在对象的finalize方法中把自己也就是this赋值给一个一个其他对象的变量类型是当前对象的类型属性(但是如果这个其他对象也是在F-Queue中的就不能完成自救,原因就是这个其他对象本省并不能与gc root相关联),但是因为任何一个对象的finalizer方法只能由虚拟机执行一次,所以任何一个需要被回收的对象,也只能完成一次自救。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注册微信号时验证码错误怎么办 老板让写的报道没有当天写完怎么办 洛奇英雄传镶嵌有微章的时装怎么办 上午12点用24小时制怎么办 三分钟看懂捷信个人贷款怎么办 精神不正常的父亲到单位闹怎么办 母亲和父亲一直和我闹怎么办 儿子拿了父亲的钱买手机怎么办 电动车骑的慢的时候车头打漂怎么办 二晓啊相公太爱我了怎么办全文免费 车牌被套牌了又有违章怎么办 高中生只学好主课副科学不好怎么办 母泰迪怀孕23天了不吃饭怎么办 媳妇一再触碰我的底线怎么办 发票商品编码好多选错了分类怎么办 吃了用福尔马林泡的食物怎么办 没大没小说话不尊重人的孩子怎么办 升级安卓8.0后app闪退怎么办 业主装门占用消防通道物业怎么办? 想改名字派出所不给改怎么办 物业不给地热打压影响装修怎么办 pos机pin效码验证错误怎么办 苹果下载东西要发验证码怎么办 接口断在了丝扣里面怎么办 政府下了一张关停取缔单怎么办 微信运动数据不刷新了怎么办 邻居霸占我的土地不还我该怎么办 双层水浴式杀菌锅阀门坏了怎么办 通下水管的钢丝断水管里了怎么办 塑料水管与水阀连接处漏水怎么办 介质流向标识管道温度太高怎么办 雪碧里气体太多瓶子涨得要炸怎么办 餐厅不清洗油烟管道物业该怎么办 用完权健洁净宝后奇痒的厉害怎么办 老房子铸铁暖气管从外锈蚀了怎么办 德意壁挂炉补水多了水压过高怎么办 新空调的散热片铜管漏了怎么办 猪舍被别人推掉漏电电到人怎么办? 网上买的燃气灶连接用软管怎么办 哈弗h3后减振器上支架坏了怎么办 汽车用收录机电机皮带断了怎么办