JVM面试真题总结(六)

embedded/2024/9/23 11:42:37/

文章收录在网站: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.ppmy.cn/embedded/110672.html

相关文章

leetcode 1811 寻找面试候选人(postgresql)

需求 表: Contests ------------------ | Column Name | Type | ------------------ | contest_id | int | | gold_medal | int | | silver_medal | int | | bronze_medal | int | ------------------ contest_id 是该表的主键. 该表包含LeetCode竞赛的ID和该场比赛中金牌、银…

【Android】NestedScrollView的简单用法与滚动冲突、滑动冲突

一、NestedScrollView 1. 什么是 NestedScrollView NestedScrollView 是 Android 中一个用于处理垂直方向滚动的布局组件,它继承自 FrameLayout,同时支持嵌套滑动(Nested Scrolling)机制。相比于传统的 ScrollView,N…

webpack5-手撸RemoveConsolePlugin插件

写在前面 其实呢,这个东西也就那样,主要是我们得清楚webpack构建过程中的生命周期钩子, 就拿这个插件来说,我们想要把输出的js文件里面的内容中的console语句去掉,那么我们就需要找到webpack处理完文件时的钩子&#…

分库分表:应对大数据量挑战的数据库扩展策略

随着互联网技术的发展,数据量的爆炸性增长给数据库系统带来了前所未有的挑战。为了有效管理大规模数据并保持高性能,分库分表成为了一种常见的数据库扩展策略。本文将探讨分库分表的概念、动机、实施策略以及潜在的挑战和解决方案。 什么是分库分表&…

【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI

在FastAPI中,默认情况下,当应用启动时,Swagger UI 会通过在线加载 Swagger UI 的静态资源。这意味着如果应用运行在没有互联网连接的环境中,默认的 Swagger 文档页面将无法加载。 为了在离线环境中使用 Swagger UI,你…

太牛了!AI大佬的课程!吴恩达、李飞飞、李宏毅、Hinton、LeCun...

本文精心梳理了AI顶级大佬教授的人工智能课程,涵盖了深度学习、机器学习等多个领域的前沿内容。 这些课程将引领您深入了解决策树、朴素贝叶斯、逻辑回归、神经网络和深度学习等核心知识点,同时还将探索贝叶斯学习、支持向量机和核方法、聚类、无监督学…

【原创教程】自动化工程案例01:8工位插针装配机02

上一篇文章我们分析了8工位的每一个工位情况,这篇我们跟大家聊聊触摸屏部分。 触摸屏拥有:8个主页面,IO点和手动操作有2个分页面 主页面:主画面 涉及到保密问题,我们把标题栏给删掉,大家知道有标题栏就可…

骨传导耳机哪个品牌好用?精选骨传导耳机品牌排行榜前十名推荐

随着健康生活方式与运动热潮的兴起,骨传导耳机这一非常具有创新意义的蓝牙耳机逐渐走进大众视野,凭借其独特的传音方式既保证了音乐的享受,又可以兼顾运动时的安全与周围环境感知。但随着市场需求逐渐增加,市面上开始出现各式各样…