JVM垃圾收集器相关面试题(1)

news2025/3/15 20:37:51

垃圾收集与内存管理摘要

一.核心垃圾收集算法对比

算法原理优点缺点适用场景
标记-清除两次遍历(标记存活对象→清除未标记对象)实现简单内存碎片化、双遍历效率低老年代(结合整理)
标记-复制内存对半分,存活对象复制到空白区无碎片、效率高内存利用率50%新生代
标记-整理标记后移动存活对象至内存端无碎片、内存利用率高对象移动开销大老年代

二.分代收集核心机制

内存分代结构

  • 新生代(1/3堆)

    • Eden区:80%空间,新对象初始分配区,通过连续内存分配优化短命对象处理
    • Survivor区:From/To各10%,存放至少存活一次的对象,采用复制算法
  • 老年代(2/3堆):存放长周期对象,采用标记-清除/整理算法

  • 元空间(本地内存):类元数据存储,GC条件更宽松

回收流程关键点

  1. Minor GC(新生代)

    • 触发条件:Eden区满
    • 对象晋升:年龄阈值(15)或Survivor空间不足
    • 复制效率:仅处理存活对象,存活率<10%时最优
  2. Full GC(全局)

    • 触发条件:老年代不足/显式调用
    • 性能影响:全堆扫描,停顿时间显著

三.永久代演进对比

特性Java7永久代Java8+元空间
存储位置堆内存本地内存
GC触发条件类+类加载器+反射引用全解除类加载器回收即释放
内存管理固定大小易OOM动态扩展
性能影响Full GC时扫描独立回收机制

四.对象存活判定

  • 可达性分析法:通过GC Roots(栈变量、静态属性、JNI引用)遍历引用链
  • 死亡判定流程:两次标记机制(可达性分析→finalize()自救机会→不可达回收)

关键设计理念:基于对象生命周期特征(98%对象朝生夕死)进行分代优化,通过空间换时间(复制算法)和延迟处理(老年代整理)平衡吞吐量与停顿时间。

正文

一.常见的垃圾收集算法

标记-清楚

原理:

  • 标记:从GC Roots(例如栈中的变量,静态变量等)开始便利,标记出所有被引用的对象

  • 清除:遍历整个堆,清除没被标记的对象。

缺点

  • 标记和清除各遍历一次,效率低下
  • 可能产生大量不连续的空间,当程序需要分配较大内存时,可能会因为无法找到连续的内存空间导致内存不足,从而提前触发垃圾回收。

标记-复制

原理:将内存空间化为等大的两块,一般称为(Form和To空间)。每次只是用其中的一块,当这一块用满后,就将存活的对象复制到另一块空间,然后把原来使用的空间直接清理掉。

优点:

  • 只需要复制存活的对象效率很高
  • 清除后的空间是连续的

缺点

  • 内存空间只占用一般,另一半用来存放复制后的内存,空间浪费严重

标记-整理

原理

  • 标记:与标记-清除算法相同,从GC Root开始遍历所有存活的对象
  • 整理:将存活对象向内存的一端移动,此过程不会清除垃圾对象,而是会把存活对象直接挪到垃圾对象,类似于赋值操作,然后直接清理掉边界以外的内存空间。

优点

  • 解决了标记-清除算法需要遍历两次和会产生内存碎片的问题,同时也不会和标记-整理算法一样浪费一半的空间

缺点

  • 整理过程需要移动对象,效率相对较低,尤其是对象过多的情况下

分代收集

原理

  • 基于对象存活周期不同,讲内存化为不同的代

  • 新生代:对象通常“朝生夕死”存活率低。一般采用标记-复制算法

  • 老生代:对象通常存活率高,占用空间大。一般采用标记-清除标记-整理算法

优点

  • 根据对象存活特点采用不同算法,提高垃圾回收效率,减少对应用程序性能的影响。

缺点

  • 需要对堆内存进行分代管理,增加了垃圾回收器的实现复杂度。

二.分代垃圾回收器工作原理详解

分代垃圾回收器是基于一个假说:大部分对象生命周期极短,少数对象长期存活。

堆内存分代结构

  • 新生代

    • 占堆内存的1/3

    • 分为Eden区(80%)和两个Survivor区(From+To 各10%)

      • 为什么要有Eden区?直接和正常的标记-复制算法一样不好吗?只要From和To两个分区
      • 因为大多数内存活不过一次GC,新对象直接在连续内存的 Eden 区分配,避免频繁内存整理。集中处理 “朝生暮死” 的对象,减少对 Survivor 区的频繁操作。
        如果只是用From和To两个Survivor区域,则无法隔离新对象和多次存活对象,导致每次 GC 需扫描全部区域,效率降低。
        所以我们再Survivor中存放的是至少存货过一次的对象,Eden区只存放新对象
    • 新对象优先在Eden区分配,若Eden区空间不足,则出发Minor GC

  • 老生代

    • 占堆内存2/3,存放长期存活的对象
    • 当老生代空间不足时,则出发Full GC或Major GC,回收整个堆
  • 元空间

    • 取代永久代,存放类元数据,常量池等,GC主要针对不在使用的类的加载器和常量池

对象分配与回收流程

1.对象分配

  • 新对象先分配到Eden区,若Eden区已满,则出发Minor GC

  • 大对象(如长数组)会直接进入老年代

2.Minor GC(新生代回收)

前面我们总体到Minor GC,那么他到底是个什么呢?

  • 存活对象:从 Eden 和 Survivor 区复制到另一个 Survivor 区(复制算法)。
  • 对象年龄:每熬过一次 Minor GC,年龄 + 1。
  • 晋升老年代:年龄达到阈值(默认 15)或 Survivor 区空间不足时晋升

3.Full GC(老年代回收):

  • 触发条件:老年代空间不足、显式调用System.gc()等。

  • 使用标记 - 清除或标记 - 整理算法,回收整个堆,耗时长

三.JVM 永久代中会发生垃圾回收吗

  • Java8前 永久代

    • 存储位置:JVM堆内存
    • GC 条件:类需满足:所有实例被回收 + 类加载器被回收 + 无反射引用。
    • 问题:容易因类加载过多引发` ‍```rustOutOfMemoryError: PermGen space‍````
  • Java8+ 元空间

    • 存储位置:本地内存,不再占用堆。

    • GC 条件:仅需类加载器被回收,自动释放类元数据。

    • 改进:

      • 内存动态扩展,内存取决于物理内存大小
      • 减少 OOM 风险,GC 效率更高。

四.如何判断对象是否存活?

可达性算法

  • 原理: 从CG Roots出发,遍历所有的引用链,无法到达的对象即为死亡

  • GC Roots 包括:

    • 虚拟机栈中局部变量引用的对象。
    • 方法区中静态变量和常量引用的对象。
    • 本地方法栈中 JNI (Java Native Interface)引用的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode:728. 自除数(python3解法)

难度&#xff1a;简单 自除数 是指可以被它包含的每一位数整除的数。 例如&#xff0c;128 是一个 自除数 &#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right &#xff0c;返回一个列表&#xff…

vue3-computed计算属性和reactive响应式系统结合使用

1.前言 vue3中使用reactive函数创建一个响应式对象&#xff0c;当对象数据发生变化的时候&#xff0c;依赖这些数据的计算属性和模板会自动的更新。 2.实例 2.1 简写 <template><div><p>用户名: {{ userName }}</p><p>用户名的大写形式: {{ u…

Pycharm 社区版安装教程

找到安装包双击安装文件---点击下一步 一般路径是&#xff1a;C:\Rambo\Software\Development 选择完成后就是如下地址&#xff1a; C:\Rambo\Software\Development\PyCharm Community Edition 2024.3.3 点击上述3个位置就可以了----下一步 等待安装就可以了---完成后点击完成…

Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;六&#xff09;创建、管理和删除本地用戶和组 前言一、用户和组概念用户类型对比表格主要组和补充组对比表格&#xff1a; 二、本地用户账户增删改查三、本地组账户 前言 上篇博客我们详细了解了从红帽和 DNF 软件仓库下载…

分享vue好用的pdf 工具实测

vue3-pdf-app&#xff1a; 带大纲&#xff0c;带分页&#xff0c;带缩放&#xff0c;带全屏&#xff0c;带打印&#xff0c;带下载&#xff0c;带旋转 下载依赖&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类&#xff1a; 创建文件 pdfConfig.ts /…

Markdown Poster – 免费Markdown转图片工具|优雅图文海报制作与社交媒体分享

Markdown Poster是什么 Markdown Poster 是一款高效的 Markdown 转图片工具&#xff0c;利用灵活编辑和实时预览功能帮助用户轻松制作优雅的图文海报。该工具内置丰富的海报模板和多种主题选项&#xff0c;支持导出为图片和 HTML 代码&#xff0c;适用于社交媒体分享、网站集成…

掌握市场先机:9款销售渠道管理工具深度测评

本文主要介绍了以下9款销售渠道管理工具&#xff1a;1.纷享销客&#xff1b; 2.销帮帮&#xff1b; 3.小满CRM&#xff1b; 4.有赞&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

OpenCV图像加权函数:addWeighted

1 addWeighted函数 在OpenCV 里&#xff0c;addWeighted 函数的作用是对两个图像进行加权求和&#xff0c;常用于图像融合、图像过渡等场景。函数如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 参数解释 src1&#xff1a;第一个输入图…

docker桌面版启动redis,解决无法连接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录&#xff0c;里面有个redis.conf文件&#xff0c;内容如下&#xff0c;启动时绑定这个配置文件目…

Scratch 3.0安装包,支持Win7/10/11、Mac电脑手机平板、少儿便编程的启蒙软件。

Scratch是一款由麻省理工学院&#xff08;MIT&#xff09; 设计开发的少儿编程工具。其特点是&#xff1a;使用者可以不认识英文单词&#xff0c;也可以不使用键盘&#xff0c;就可以进行编程。构成程序的命令和参数通过积木形状的模块来实现。用鼠标拖动指令模块到脚本区就可以…

Navicat for Snowflake 震撼首发,激活数据仓库管理全新动能

近日&#xff0c;Navicat 家族迎来了一位全新成员 — Navicat for Snowflake。Snowflake 是一款基于云架构的现代数据仓库解决方案&#xff0c;以其弹性扩展、高性能和易用性著称。这次首发的Navicat for Snowflake 专为简化 Snowflake 数据库管理任务而精心打造。它凭借其直观…

深度学习基础:线性代数本质2——线性组合、张成的空间与基

目录 一、线性组合 1. 用一个有趣的角度看向量坐标 2. 如果我们选择不同的基向量会怎样&#xff1f; 3. 线性组合 4. 张成的空间 ① 二维向量的张成的空间 ② 三维向量的张成的空间​编辑 5.线性相关 6.线性无关 7. 基的定义 一、线性组合 1. 用一个有趣的角度看向量坐…

第五天 Labview数据记录(5.4 EXCEL文件读写)

5.4 EXCEL文件读写 Excel 文件读写在数据处理、自动化办公、数据分析等领域具有重要的意义。以下是 Excel 文件读写的主要应用场景和意义&#xff1a;1. 数据管理和整理&#xff1b;2. 自动化办公&#xff1b;3. 数据分析和可视化&#xff1b;4. 系统集成&#xff1b;5. 报表生…

注意力机制,层归一化,RBA。KAN-ODE,小波KAN

目录 attention is all you need 翻译 多头注意力 8.6 Multi-head Self Attention 模型 模型架构 encoder安定 decode 注意力机制 位置编码 自注意力机制的优势 实验结果 结论 代码 Transformer 架构 代码实现思路 总结 编码器、解码器和位置编码的摆放顺序&…

电脑内存不足怎么办?

常规解决方法盘点 关闭后台程序&#xff1a;按下【Ctrl Shift Esc】组合键打开任务管理器&#xff0c;在 “进程” 选项卡里&#xff0c;把当前不用的程序统统 “结束任务” &#xff0c;像那些自动更新的软件、常驻后台的播放器&#xff0c;关了能释放不少内存。比如音乐软…

【RISCV LAB】0x01-安装实验仿真辅助工具

安装实验辅助工具 实验环境搭建安装 Verilator编译依赖下载源码编译安装测试安装 安装 RISC-V 交叉编译工具链编译依赖下载源码编译安装编译并安装添加环境变量并测试 安装 GTKWave其他模拟器推荐RARSemulsiV FAQ 实验环境搭建 Verilator 是一款开源的支持 Verilog 和 SystemV…

Trae插件革命:用VSPlugin Helper实现VSCode市场插件全自动安装

之前有读者留言说trae都没有c的插件用&#xff0c;确实是这样&#xff0c;trae的插件源用的是open vsx&#xff0c;而c/c插件是vscode官方插件市场的&#xff0c;如果想直接在trae中安装c/c插件是不行的&#xff0c;只能先从vscode官方插件市场把vsix后缀文件先下载下来&#x…

使用PHP进行自动化测试:工具与策略的全面分析

使用PHP进行自动化测试&#xff1a;工具与策略的全面分析 引言 随着软件开发的复杂性不断增加&#xff0c;自动化测试已成为确保软件质量的关键环节。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;拥有丰富的生态系统和工具支持&#xff0c;使其成为自动化测试的理想选…

字符串函数和结构题内存对齐

图下为函数使用&#xff1a; #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }

Odoo18 Http鉴权+调用后端接口

最近在调研Odoo18&#xff0c;包括它的前后端原理、源码等。发现官方的开发文档并不十分实用&#xff0c;比如标题这种简单的实用需求&#xff0c;竟然浪费了一点时间&#xff0c;特此记录。 官方文档&#xff1a;External API — Odoo 18.0 documentation 前提&#xff1a;首…