3、对象已死吗?

###怎么判断哪个对象可以被GC回收
1、计数法:每个对象内部记录了被调用的次数,当新增1个引用时,计数器 +1,当引用失效时候,计数器-1
缺陷:当出现循环引用的时候,GC回收不了

2、可达性分析算法:
从GC ROOTS 链上开始,不在GC ROOTS链上的都需要被GC
在JAVC中可作为GC ROOTS的对象:
1)Java虚拟机栈的局部变量表中的对象
2)引用本地方法栈的对象
3)引用方法区的静态变量的对象
4)引用方法去常亮池中的对象
HotSpot寻找GC ROOT的优化:
在GC时,有2个区域需要GC,1、方法区常量池 2、堆
这两个地方有大量的对象,如果GC的时候,都要去扫描 ,会出现全区静止。所以引入的精准GC的概念 ,OopMap,每一个线程对应一个虚拟机栈,每个方法对应一个栈帧,当执行到安全点(safepoint)的时候,去更新OopMap中的引用。GC扫描的时候,直接拿到OopMap中的引用进行GC即可

###引用
强引用:new 的对象就是强引用
软引用:弱引用是来描述一些有用,但是并非必须的对象。对于软引用,在系统将要发生内存溢出的时候,才会进行GC
弱引用:在每次GC的时候,都会被GC
例如:ThreadLocal会出现内存泄露
ThreadLocal内部类ThreadLocalMap的内部类Entry extends WeakReference 是弱引用,而内部类作为ThreadLocal的key(Thread对象),会被GC掉,所以会出现内存泄露。(Thread类中的成员变量ThreadLocal.ThreadLocalMap)
虚引用:不能创建对象,只有1个作用:被GC的时候做一个通知。

###finalize()
回收堆:
对象是否被GC,JVM会对对象进行2次标记。
对象内部是否已经执行过finalize()方法,如果执行过,则进行第二次标记,下次直接GC
如果没有执行过,则进行第一次标记,并将对象放入F-QUEUE队列中 ,由优先级比较低的finalizer线程执行。如果在此过程中,对象又搭上了GC ROOTS链,则从F-QUEUE队列中移出去。证明对象自我拯救成功

回收方法区:
满足条件:
1、该类在堆中没有实例对象
2、该类的ClassLoader被回收
3、该类对应的java.lang.Class没有在任何地方被引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值