jvm 垃圾回收 内存分配策略

1.那些内存需要回收
其中程序计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭,不需要过多考虑回收。因此内存回收主要是在java堆和方法区。

2.对象何时回收?
对象死时,则回收。那么如何判断对象死了:
引用计数法:对象设置一个计数器,有一个地方引用则计数器加1,引用失效减1.当计数器为0时,则回收。
缺陷:无法解决对象间相互引用。

可达性分析算法:通过一系列称为“”GC Roots“”的对象作为起始点,从这些对象向下搜索所走过的路径
称为引用链,当一个对象到GC Roots 没有任何引用链相连,即对象不可达,则认为是可以回收的对象。
可作为GC Roots的对象包括下面几种:
a.虚拟机栈(本地变量表)中引用的对象
b.方法区中类静态属性引用的对象
c.方法区中常量引用的对象
d.本地方法栈中JNI(即一般说的native方法)引用的对象

3引用的分类
强引用:类似Object obj=new Object() ,垃圾回收器永远不会回收的对象。
软引用:有用并非必须的对象,在系统将要发生内存溢出之前,会将这些对象进行回收。
弱引用:描述非必须的对象,这些对象只能生存到下一次垃圾收集之前
虚引用:最弱的引用关系,唯一的作用就是在这个对象被回收器回收时收到一个系统通知。

4生存还是死亡
一个对象的死亡要经历两次标记过程。如果一个对象不可达,会被第一次标记并且进行一次筛选,筛选的条件
是此对象是否有必要执行finalize()方法。如果对象没有覆盖或者方法已经被执行,虚拟机将两种情况都视为没有
必要执行。
如果对象有必要执行finalize方法。这个对象将会被放置在f-queue的队列中.GC将对队列中的对象进行第二次
小规模的标记,如果对象在finalize()方法中成功拯救自己,第二次标记时将会移除即将回收的集合

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值