JVM学习三.Java垃圾收集机制

Java经过这么多年的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都已经进入自动化时代,为什么我们还需要来了解GC和内存分配呢?
答案很简单:当需要排查各种内存溢出,内存泄漏时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些自动化技术实施必要的监控和调节。

一.Java回收器主要回收哪些区域呢?

第一篇文章我们说过程序技术器,本地线程栈,本地方法栈,线程私有,随线程产生而产生,随线程消失而消失,所以Java线程回收主要回收的Java堆和方法区。

二:哪些对象需要“回收”?

要回收谁?
首先垃圾收集器在对堆进行回收前,第一件事情就是判断需要回收哪些对象,哪些对象是活得,还在被引用,哪些对象已经失去了调用,失去调用的我们肯定要把这些无用的内存给回收掉。

三:回收算法有哪些呢?

1.引用计数算法
给对象中添加一个引用计数器,每当有一个地方引用时,计数器+1;当引用失效时,技术器相反-1;任何时候计数器为0,对象就是不可能在被使用。
这算法实现简单,效率也比较高,在大部分情况下都是个不错的算法。
缺点:
解决不了循环依赖的问题。
A.B= B,B.A= A,像这种情况虚拟机就回收不了。
2.可达性分析算法:
实现的基本思路:就是通过一系列的称为“GC ROOT ”的对象作为起点,从这些节点向下搜索,搜索的路径称之为引用链,当一个对象到GC root 没有任何引用链相连的时候,,则证明此对象时不可用的(我后期画个图)

四:GC roots的对象主要包括以下几种:

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

五:对象是生存还是死亡?

即使我们在可达性分析算法中发现了不可达的对象,它也并非是“非死不可”。它会经历两次标记过程。
第一次会被进行一次标记并且进行一次筛选,筛选的条件就是这个对象是否有必要执行finalize()算法。
如果有必要执行的话,这个对象将会放置在一个叫F-Queue的队列之中,并在稍后,虚拟机会自动创建一个低优先级的Finalizer线程去执行它,这个方法不一定要执行结束,主要是防止这线程执行缓慢,或者发生了死循环,那么GC不就GG了嘛,导致整个GC崩溃。
GC会对F-Queue队列中的对象进行二次小规模标记,如果对象在finalize()中拯救了自己,重新和引用链上任意一个对象建立链接即可,那么他将会被移出“即将回收”的集合,否则,它就基本上会被GC回收了。

参考书籍:《深入理解Java虚拟机 第二版》

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值