茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!

愿你在未来的日子,保持热爱,奔赴山海!

每日三道面试题,成就更好自我

昨天既然我们聊到了JVM,那我们继续这一个话题吧!

1. JVM是如何判断对象是否可回收

垃圾收集器在做垃圾回收的时候,首先需要判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。

而判断一个对象是否为可回收状态的常用算法有两个:引用计数器法和可达性分析算法。

  • 引用计数器法:

    在 Java 中,引用和对象是有关联的,通过引用计数来判断一个对象是否可以回收。它在创建对象时关联一个与之相对应的计数器,当此对象被使用时加 1,相反销毁时 -1。当此计数器为 0 时,则表示此对象未使用,可以被垃圾收集器回收。其优点是垃圾回收比较及时,实时性比较高,只要对象计数器为 0,则可以直接进行回收操作;而缺点是无法解决循环引用的问题。

  • 可达性分析算法:

    主要是从GC Root的对象为起点出发,然后开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Root之间没有任何引用链的时候,代表这个对象不可以用,判断为垃圾,就会被GC回收。

    在 java 中可以作为 GC Roots 的对象有以下几种:

    • 虚拟机栈中引用的对象
    • 方法区类静态属性引用的对象
    • 方法区常量池引用的对象
    • 本地方法栈 JNI 引用的对象

不错不错,既然你能知道了如何判断回收,那么

2. 你知道有什么垃圾回收的常见算法吗?

  • 标记清除法:

    分为标记--清除两个阶段,首先先标记出所有需要回收的对象,然后在标记完成后统一清除回收所有被标记的对象。

    它可能产生的问题呢标记清除后,产生一些大量不连续的内存碎片,导致可能以后后续的大内存找不到足够的连续内存再导致提前又发生一次垃圾收集

  • 标记整理法:

    基本步骤和标记清除类似,但是多了一步整理的步骤,让所有村后的对象都向一端移动,然后清除掉不需要的内存。

    它解决了内存碎片的问题,但是需要频繁的移动存活的对象,效率就比较低了。

  • 复制算法:

    将可用的内存分为一半,每次只使用一个区域。将需要存活的对象复制到另一个对象中去。

    这种方法也是可以解决了内存碎片问题,但是内存对半分了,而且对象存活率高的对象需要频繁复制。

基于前面的算法的话,JVM采用一个分代算法的形式:

对于JVM的堆来说分为了新生代和老年代两个区域,而新生代也还分了eden区和两个幸存区,他们比例是8:1:1,

对于新生代来说采用了复制算法,因为对于新生代来说每次垃圾回收的存活的对象是比较少的,所以采用复制算法较好,而老年代的话,则采用了标记整理法。

  • 首先对象会先分配在eden区,
  • 然后再新生代空间不足时,会发生一次minor gc算法将存活的对象复制到幸存区s1中,并使存活的对象的年龄加1,然后s1和s0交换,。
  • 在对象寿命超过阈值最大15时,就会晋升至老年代。
  • 而当老年代的空间不足时,会先尝试触发一次minor gc,如果空间还是不足的话。就会出发full gc ,而此时的stw会更长。

可以,那问你最后一道:

3. 你知道有什么垃圾收集器吗?

常见的垃圾收集器有:其中用于回收新生代的收集器有Serial、PraNew、Parallel Scavenge,而回收老年代的收集器有Serial Old、Parallel Old、CMS,最后还有一个可以用于回收整个Java堆的G1收集器。

作用于新生代的:

  • Serial 收集器属于最早期的垃圾收集器,也是 JDK 1.3 版本之前唯一的垃圾收集器。它是单线程的垃圾收集器,采用复制算法,其意味着单线程是指在进行垃圾回收时所有的工作线程必须暂停,直到垃圾回收结束为止。

    特点是简单和高效,并且本身的运行对内存要求不高,因此它在客户端模式下使用的比较多。

  • sParNew 收集器实际上是 Serial 收集器的多线程并行版本,也是采用复制算法。

  • Parallel Scavenge 收集器和 ParNew 收集器类似,它也是一个并行运行的垃圾回收器;不同的点在于该收集器关注的侧重点是实现一个可以控制的吞吐量。它的计算公式是:用户运行代码的时间 / (用户运行代码的时间 + 垃圾收集的时间)。比如用户运行的时间是 8 分钟,垃圾回收运行的时间是 2 分钟,那么吞吐量就是 80%。Parallel Scavenge 收集器追目标就是达到一个可控制的吞吐量,高吞吐量可以最高效率地利用CPU时候,尽快地完成程序的运算任务。

作用于老年代的:

  • Serial Old 收集器为 Serial 收集器的老年代版本,而 Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本。两者都是在老年代中采用这标记—— 整理算法。

  • CMS(Concurrent Mark Sweep)以获取最短回收停顿时间为目标,与Parallel Scavenge 收集器不同,是基于标记 —— 清除算法实现。它强调的是提供最短的停顿时间,因此可能会牺牲一定的吞吐量。它主要应用在 Java Web 项目中,它满足了系统需要短时间停顿的要求,以此来提高用户的交互体验。CMS 工作机制相比其他的垃圾收集器来说更复杂。整个过程分为以下 4 个阶段:

    • 初始标记(CMS initial mark):标记 GC Roots 能直接关联到的对象
    • 并发标记(CMS concurrent mark):进行 GC Roots Tracing
    • 重新标记(CMS remark):修正并发标记期间的变动部分
    • 并发清除(CMS concurrent sweep):清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。

作用于整个Java堆包括新生代和老年代的。

  • Garbage First(简称 G1)收集器是历史发展的产物,也是一款更先进的垃圾收集器,主要面向服务端应用的垃圾收集器,是基于基于标记-整理算法实现,不产生内存碎片。它将内存划分为多个 Region 分区,回收时则以分区为单位进行回收,这样它就可以用相对较少的时间优先回收包含垃圾最多区块。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。从 JDK 9 之后也成了官方默认的垃圾收集器,官方也推荐使用 G1 来代替选择 CMS 收集器。

小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信搜索太子爷哪吒公众号私聊我,感谢各位大佬!

每日三道面试题,通往自由的道路5——JVM的更多相关文章

  1. 每日三道面试题,通往自由的道路6——JVM

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们继续聊聊JVM的话题吧! 1. 那你知 ...

  2. 每日三道面试题,通往自由的道路4——JVM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然你有讲到字符串常量池是吧,那这样吧 1 ...

  3. 每日三道面试题,通往自由的道路10——JMM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们还是继续聊聊多线程的一些其他话题吧! ...

  4. 每日三道面试题,通往自由的道路13——锁+Volatile

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 我们既然聊到了并发多线程的问题,怎么能少得了锁 ...

  5. 每日三道面试题,通往自由的道路14——MySQL

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天我们是不是聊到了锁,而你提到了MySQL? ...

  6. 每日微软面试题——day 6(打印所有对称子串)

    每日微软面试题——day 6(打印所有对称子串) 分类: 2.数据结构与算法2011-08-14 14:27 9595人阅读 评论(15) 收藏 举报 面试微软string测试systemdistan ...

  7. 三道JS试题(遍历、创建对象、URL解析)

    最近在网上看到了三道不错的JS试题,还是很基础(一直认为学好前端基本功很重要...),现在记录如下: 原帖地址:http://www.w3cfuns.com/forum.php?mod=viewthr ...

  8. 8月份21道最新Java面试题剖析(数据库+JVM+微服务+高并发)

    前言 纵观几年来的Java面试题,你会发现每家都差不多.你仔细观察就会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构 ...

  9. 【高频Java面试题】简单说说JVM堆的内存结构和GC回收流程

    目录 前言 JVM堆内存结构简述 JVM堆内存结构图 堆初体验 结构详情 新生代 老年代 永久代/元空间 GC回收流程 GC回收流程图 GC回收详细流程 查看JDK自带可视化堆空间图 总结 前言 我们 ...

随机推荐

  1. 【BUAA软工】Beta阶段测试报告

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Beta阶段测试报告 测试报告 发现的bug Beta阶段的bug [已解决]CPP项目无法进行调试 [已解决] 注册界面注册后不能够自 ...

  2. 19 常用API

    API 什么是API? API (Application Programming Interface) :应用程序编程接口 简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了 1 ...

  3. COS 数据湖最佳实践:基于 Serverless 架构的入湖方案

    01 前言 数据湖(Data Lake)概念自2011年被推出后,其概念定位.架构设计和相关技术都得到了飞速发展和众多实践,数据湖也从单一数据存储池概念演进为包括 ETL 分析.数据转换及数据处理的下 ...

  4. Java语言的三大特性

    Java语言的三大特性 1.封装 1.1  概念: 封装也成为信息异常,隐藏对象的属性和实现细节,仅对外公开接口(外部不可以直接看到对象的属性细节并且不能直接更改属性的值,只能通过方法来读取或更改属性 ...

  5. windows下安装python 且 安装pip

    1.安装python 第一步,windows下面的Python安装一般是通过软件安装包安装而不是命令行,所以我们首先要在Python的官方主页上面下载最新的Python安装包.  下载地址是:http ...

  6. bashshell删除列

    删除所有空白列cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log7删除文件中的所有空格sed -i s/[[:space:]] ...

  7. linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

  8. 配置trunk和access

    配置trunk和access 拓扑图 PC地址设置 PC1 :192.168.1.1 vlan10 PC2 :192.168.1.2 vlan10 交换机配置 LSW3配置 <Huawei> ...

  9. 30-- A 代码记录分析

    张的代码 30--  -A if(BT_INFO.RX.CACHE == BT_RX_CACHE[0]) { BT_INFO.RX.CACHE = BT_RX_CACHE[1]; } else { B ...

  10. 逗号字符的使用、字符数组与字符串数组、sizeof与strlen

    (1)连接两个表达式为一个表达式 for(ux=0,uxt=1;uxt<444;ux++,uxt++) 允许通过编译:他可以给FOR循环更多的初始化值: (2)一般定义的话要区别只有 字符数组 ...