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

JVM面试真题总结(六)

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

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

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

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

在这里插入图片描述

解释GC的标记-整理算法及其优点

GC(垃圾收集)的标记整理算法是一种用于回收垃圾对象并释放内存空间的方法。

这个算法主要包含两个阶段:标记阶段和整理阶段。

标记阶段:

  • 在这个阶段,垃圾收集器会遍历所有的对象,对于还在使用的对象进行标记。
  • 在使用的定义可以是直接在使用,也可以是被其他在使用的对象引用。

整理阶段:

  • 在标记阶段之后,垃圾收集器会进行整理,移动所有被标记为在使用的对象,使他们在内存中连续分布。
  • 然后,它就可以一次性地回收所有未被标记的对象,也就是垃圾对象,从而释放大片连续的内存空间。

标记整理算法的一个主要优点是它可以有效地处理内存碎片问题

  • 因为它会把所有在使用的对象整理到一起,释放出大片连续的内存空间。

不过,它的代价是需要移动对象,这会增加一定的开销。

在实际的应用场景中,标记-整理算法通常用于堆内存的垃圾回收

  • 特别是处理老年代(Old Generation)的垃圾回收。

解释GC的标记-清除算法及其缺点

标记-清除(Mark-Sweep)是最早的垃圾收集算法之一

其过程主要分为两个阶段:标记阶段和清除阶段。

标记阶段

  • 这一阶段的任务是遍历所有的可达对象。
  • 从一个固定的根对象(root)开始,递归地访问对象图。
  • 在访问到每一个可达对象时,都将其标记为可达。
    • 在Java中,根对象通常包括全局变量和当前执行方法的局部变量。

清除阶段

  • 在标记阶段完成后,清除阶段开始。
  • 在这个阶段,垃圾收集器会遍历堆内存,把未被标记(也就是不可达)的对象进行清除,回收其占用的内存。

标记-清除算法的优点是实现简单,且不需要移动存活对象。

但是,它有两个显著的缺点:

效率问题

  • 标记和清除两个过程的效率都不高。

空间问题

  • 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配大对象时
    • 无法找到足够的连续内存,从而提前触发另一次垃圾收集动作。

因此,现代的垃圾收集器通常不单独使用标记-清除算法,而是结合其他算法一起使用

  • 如标记-整理算法或分代收集算法,以解决其带来的效率和空间问题。

解释GC的复制算法及其适用场景

复制算法是垃圾收集中的一种常见算法,它主要被用于新生代的垃圾回收。

  • 复制算法的基本思想是将内存分为两个相等的区域(或者不等也可以,如新生代中的Eden和Survivor区)
  • 每次只使用其中一个区域。
    • 当这个区域用完时,就把还活着的对象复制到另一个区域,然后再把已使用过的区域清空。

具体来说,例如在Java的新生代中,内存被分为一个Eden区和两个Survivor区(分别记为S0和S1)。

大部分情况下,新创建的对象会被分配在Eden区。

当Eden区满时,就会触发一次Minor GC,GC会检查Eden区中的所有对象

  • 把还活着的对象复制到一个Survivor区(如S0),然后把Eden区完全清空。
  • 在下一次Minor GC时,会再次检查Eden区和S0区
    • 把还活着的对象复制到另一个Survivor区(如S1),然后清空Eden区和S0区,以此类推。

复制算法的主要优点是:

  • 它可以快速地回收垃圾对象,因为只需要清空已使用过的区域就可以了
  • 而且,由于活着的对象会被复制到另一个区域,因此这个过程也自然地完成了内存的整理,避免了内存碎片的产生。

然而,复制算法也有一些缺点:

  • 首先,它需要两个区域来进行复制,这意味着在任何时候
    • 都有一半的内存空间是闲置的,这在内存紧张的情况下可能是一种浪费
  • 其次,如果有大量对象需要复制,那么复制过程可能会消耗一定的时间和CPU资源。

不过,对于新生代这样对象存活率较低的区域,复制算法通常是一种非常高效的垃圾收集方式。

解释GC的可达性分析算法及其优势

GC可达性分析算法是垃圾收集器用来判断哪些对象:

  • 活的(即仍然可能被程序使用)和哪些对象是死的(即不再被程序使用)的一种算法。

这个算法的基本思想是通过一系列的称为GC Roots的对象作为起始点

从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain)。

  • 当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

在Java语言中,可作为GC Roots的对象包括以下几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象:

    • 比如方法中创建的对象引用。
  • 方法区中类静态属性引用的对象:

    • 比如类中的静态变量。
  • 方法区中常量引用的对象:

    • 比如字符串常量池中的引用。
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

通过这种方式,GC可达性分析算法可以找出所有被程序还可能会使用的对象。

  • 在标记阶段完成后,未被标记的对象将被视为不可达,之后在清除阶段被回收。
http://www.lryc.cn/news/435151.html

相关文章:

  • C语言代码练习(第十八天)
  • linux上使用rpm的方式安装mysql
  • html 中如何使用 uniapp 的部分方法
  • Samtec连接器小课堂 | 连接器电镀常识QA
  • 大模型备案全网最详细流程解读(附附件+重点解读)
  • 基于2143规则编码的uint8_t如何转换成float
  • [项目][WebServer][整体框架设计]详细讲解
  • SprinBoot+Vue网上购物商城的设计与实现
  • 【数据结构】2——二叉树遍历
  • 数据结构应用实例(五)——关键路径
  • 组播 2024 9 11
  • 揭秘开发者的效率倍增器:编程工具的选择与应用
  • 在AI的时代,程序员如何才不被淘汰
  • tabBar设置底部菜单选项以及iconfont图标,setTabBar设置TabBar和下拉刷新API
  • 2024C题prompt
  • Numpy中数组的形状处理
  • 【动态规划】子序列问题二(数组中不连续的一段)
  • 可视耳勺方便吗?可视耳勺热销第一名品牌!
  • micropython 3-wire spi 9bit 写入的问题
  • 导致JVM内存泄露的ThreadLocal详解
  • windows下关闭解除占用端口的进程
  • Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(Python)
  • 版权与开源协议:一场创新与自由的边界之争
  • 学生用的蓝牙耳机推荐有哪些?实测四款实力出众机型!
  • MIT6.824 课程-GFS
  • 力扣第200题 岛屿数量
  • 协议头,wireshark,http
  • vscode ssh离线远程连接ubuntu调试
  • Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号
  • 元学习之应用案例