当前位置: 首页 > news >正文

JVM面试真题总结(八)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

G1收集器如何划分堆内存?

G1收集器将整个堆划分成约 2048 个大小相同的独立 Region 区域

这些区域可以在逻辑上被划分为Eden区、Survivor区和Old区。

  • 与其他GC收集器不同的是,G1并不需要Eden区、Survivor区和Old区物理上连续存在
  • 而是可以分散在各个Region中。

每个Region都有一个用于垃圾回收的优先级,G1收集器会优先选择回收垃圾最多的Region

  • 这也是G1名字Garbage-First的由来。

G1收集器划分堆划分的好处是什么?

G1收集器重新划分了Java堆,主要是为了解决CMS收集器的一些问题,提高垃圾收集的效率

  • 以及更好地控制垃圾收集的停顿时间。

具体来说,有以下几点原因:

减少内存碎片

  • CMS收集器采用的是标记-清除算法,这样会导致大量的内存碎片。
  • 而G1通过将堆划分为多个大小相等的独立区域,可以更好地控制堆内存,避免出现大量内存碎片。

提高垃圾收集效率

  • G1收集器在后台维护了一个列表,记录了每个区域的垃圾对象的数量
  • 垃圾对象最多的区域会被优先回收,这样可以尽可能降低内存占用,提高效率。

控制垃圾收集的停顿时间

  • G1收集器在设计时就考虑到了暂停时间,它可以让用户指定最大的垃圾收集停顿时间
  • 然后系统会尽力保证按照用户的预期进行操作。

描述G1垃圾收集的工作过程

初始标记(initial mark)

  • 标记了从GC Root开始直接关联可达的对象。
  • STW(Stop the World)执行。

并发标记(concurrent marking)

  • 和用户线程并发执行,从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象

最终标记(Remark)

  • STW,标记再并发标记过程中产生的垃圾。

筛选回收(Live Data Counting And Evacuation)

  • 制定回收计划,选择多个Region 构成回收集,把回收集中Region的存活对象复制到空的Region中
  • 再清理掉整个旧 Region的全部空间。需要STW。

比较CMS和G1垃圾收集器的异同点

区别一:使用的范围不一样

  • CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。

  • G1收集器收集范围是老年代和新生代。

    • 不需要结合其他收集器使用。

区别二:使用的算法不一样

  • CMS收集器是使用标记-清除算法进行的垃圾回收。

  • G1收集器使用的是标记-整理算法进行的垃圾回收。

区别三:CMS收集器和G1收集器的优劣性

  • CMS收集器以最小的停顿时间为目标的收集器,容易产生内存碎片。

  • G1收集器不会产生内存碎片。

区别四:垃圾回收的过程不一样

  • CMS收集器:初始标记→并发标记→重新标记→标记清楚

  • G1收集器:初始标记→并发标记→最终标记→筛选回收

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024年华为9月4日秋招笔试真题题解
  • pdf文件转图片,base64或保存到本地
  • Linux 离线安装 Docker
  • 网络插件 Cilium 更换 Calico
  • 产品经理如何转型为AI产品经理,如何理解AI产品工程化
  • [产品管理-2]:产品经理的职责、在企业中的位置与定位
  • 加入图书页面以及和图片相关的viewmodel代码
  • CSS学习18--伸缩布局
  • io_uring异步IO
  • TDengine 与飞腾腾锐 D2000 完成兼容互认证,推动国产软硬件深度融合
  • Azkaban、oozie、airflow、dolphinschduler 对比分析
  • Jupyter Notebook远程登录配置
  • 前端用html写excel文件直接打开
  • 二维码扫码模组国产麒麟系统C语言SDK二次开发
  • 【PostgreSQL数据库表膨胀的一些原因】
  • hexo+github搭建个人博客
  • [ JavaScript ] 数据结构与算法 —— 链表
  • __proto__ 和 prototype的关系
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Django 博客开发教程 16 - 统计文章阅读量
  • docker-consul
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git学习与使用心得(1)—— 初始化
  • Gradle 5.0 正式版发布
  • Java到底能干嘛?
  • jquery ajax学习笔记
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Octave 入门
  • Tornado学习笔记(1)
  • vue-router 实现分析
  • 电商搜索引擎的架构设计和性能优化
  • 好的网址,关于.net 4.0 ,vs 2010
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入口文件开始,分析Vue源码实现
  • 入门级的git使用指北
  • 算法-图和图算法
  • 微服务核心架构梳理
  • 异步
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • Android开发者必备:推荐一款助力开发的开源APP
  • Prometheus VS InfluxDB
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • !!Dom4j 学习笔记
  • #if和#ifdef区别
  • #Linux(make工具和makefile文件以及makefile语法)
  • $ git push -u origin master 推送到远程库出错
  • (06)Hive——正则表达式
  • (1)Android开发优化---------UI优化
  • (39)STM32——FLASH闪存
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot火车票售卖系统 毕业设计 211004