目录:

  • 🧠 一、GC基础概念
    • 1. 什么是垃圾回收(Garbage Collection, GC)?
    • 2. 判断对象是否为垃圾的方法
  • 🧩 二、GC核心算法
    • 1. 标记-清除算法(Mark-Sweep)
    • 2. 标记-整理算法(Mark-Compact)
    • 3. 复制算法(Copying)
    • 4. 分代收集算法(Generational Collection)
  • 📌 三、主流垃圾收集器
    • 1. Serial 收集器(串行)
    • 2. Parallel Scavenge 收集器(并行)
    • 3. CMS(Concurrent Mark Sweep)收集器(并发)
    • 4. G1(Garbage-First)收集器(分区)
  • 🧱 四、GC收集器对比总结
  • 🔄 五、GC类型与触发条件
  • 🧪 六、常见GC异常与调优
    • 1. 内存泄漏(Memory Leak)
    • 2. 内存溢出(OutOfMemoryError)
    • 3. GC调优目标
    • 4. GC调优常用参数
  • 🧩 七、常见GC问题排查工具
  • 📋 八、常见面试题及答案
    • 1. CMS 和 G1 的区别?
    • 2. G1为何适合大内存?
    • 3. CMS的缺点?
    • 4. 如何选择合适的GC收集器?
    • 5. Full GC的触发条件?
    • 6. 如何优化GC性能?
  • 📚 九、GC调优实践建议
  • ✅ 十、总结:GC机制核心知识点
  • 📄 十一、完整GC日志示例
  • 📌 十二、推荐学习资料

🧠 一、GC基础概念

1. 什么是垃圾回收(Garbage Collection, GC)?

  • 作用:自动管理内存,回收不再使用的对象,防止内存泄漏和溢出。
  • 核心问题
    (1) 如何判断对象是垃圾?
    (2)如何高效回收垃圾?

2. 判断对象是否为垃圾的方法

方法说明
引用计数法每个对象维护一个引用计数器,引用增加时计数+1,引用失效时-1。无法解决循环引用问题。
可达性分析法从GC Roots出发,不可达的对象判定为垃圾。GC Roots包括:虚拟机栈中的局部变量、类静态属性引用、常量引用、JNI引用。

🧩 二、GC核心算法

1. 标记-清除算法(Mark-Sweep)

  • 步骤
    (1)标记:从GC Roots出发,标记所有存活对象。
    (2)清除:回收未被标记的对象。
  • 缺点
    (1)产生内存碎片(可能导致大对象分配失败)。
    (2)标记和清除效率较低。

2. 标记-整理算法(Mark-Compact)

  • 步骤
    (1)标记:同标记-清除。
    (2)整理:将存活对象向一端移动,清理边界外内存。
  • 优点:避免内存碎片。
  • 缺点:移动对象需要暂停所有线程(Stop-The-World)。

3. 复制算法(Copying)

  • 步骤
    (1)将内存分为两块,每次只用一块。
    (2)回收时,将存活对象复制到另一块,清空原区域。
  • 优点:高效,无内存碎片。
  • 缺点:内存利用率低(只使用一半)。

4. 分代收集算法(Generational Collection)

  • 思想:将堆内存划分为新生代(Young Generation)和老年代(Old Generation)。
  • 新生代:对象生命周期短,使用复制算法。
  • 老年代:对象生命周期长,使用标记-清除或标记-整理。

📌 三、主流垃圾收集器

1. Serial 收集器(串行)

  • 特点:单线程,适用于单核CPU或小内存场景。
  • 使用场景:Client模式(如桌面应用)。
  • 命令行参数
    -XX:+UseSerialGC

2. Parallel Scavenge 收集器(并行)

  • 特点:多线程,关注吞吐量(吞吐优先)。
  • 使用场景:后台计算任务(如批量处理)。
  • 命令行参数
    -XX:+UseParallelGC

3. CMS(Concurrent Mark Sweep)收集器(并发)

  • 目标:以最短停顿时间为目标,适合高并发、低延迟的Web应用。
  • 回收步骤:
    (1)初始标记(Initial Mark):暂停所有线程,标记GC Roots直接关联的对象。
    (2)并发标记(Concurrent Mark):并发标记所有存活对象。
    (3)重新标记(Remark):暂停线程,处理并发标记期间新增的对象。
    (4)并发清除(Concurrent Sweep):并发清除垃圾对象。
  • 优点:低停顿时间。
  • 缺点
    (1)内存碎片化(可能导致Full GC)。
    (2)对CPU资源敏感。
  • 命令行参数
    -XX:+UseConcMarkSweepGC

4. G1(Garbage-First)收集器(分区)

  • 目标:兼顾吞吐量和低延迟,适用于大内存(>6GB)和多核CPU。
  • 核心思想
    (1) 将堆内存划分为多个Region(大小相等,1~32MB)。
    (2) 优先回收垃圾最多的Region。
  • 回收步骤
    (1)初始标记(Initial Mark):暂停线程,标记GC Roots。
    (2)并发标记(Concurrent Mark):并发标记存活对象。
    (3)最终标记(Final Mark):处理并发标记期间新增的对象。
    (4)筛选回收(Live Data Counting and Evacuation):选择回收价值高的Region进行回收。
  • 优点
    可预测的停顿时间(通过 -XX:MaxGCPauseMillis 设置)。
    避免内存碎片(回收时进行压缩)。
  • 缺点
    内存占用较高(维护Region状态)。
  • 命令行参数
    -XX:+UseG1GC

🧱 四、GC收集器对比总结

在这里插入图片描述

🔄 五、GC类型与触发条件

在这里插入图片描述

🧪 六、常见GC异常与调优

1. 内存泄漏(Memory Leak)

  • 原因:对象不再使用但无法被GC回收(如缓存未清理、监听器未注销)。
  • 定位工具
    (1) MAT(Memory Analyzer):分析堆转储(heap dump)。
    (1) VisualVM:实时监控内存使用情况。
    (3) jmap + jhat:生成并分析堆转储。

2. 内存溢出(OutOfMemoryError)

  • 常见类型
    • Java heap space:堆内存不足。
    • GC overhead limit exceeded:GC频繁且效率低。
    • PermGen / Metaspace:方法区或元空间内存不足。
  • 解决方法
    • 增加堆大小(-Xmx)。
    • 调整元空间大小(-XX:MaxMetaspaceSize)。
    • 优化代码(减少对象创建、及时释放资源)。

3. GC调优目标

目标说明
吞吐量(Throughput)单位时间内处理任务的效率(适合后台计算任务)
停顿时间(Pause Time)每次GC暂停的时间(适合Web服务)
内存占用(Footprint)堆内存使用量(适合内存敏感场景)

4. GC调优常用参数

参数说明
-Xms / -Xmx设置堆初始和最大大小(如 -Xms2g -Xmx4g)
-XX:NewRatio新生代与老年代比例(默认1:2)
-XX:SurvivorRatioEden与Survivor比例(默认8:1:1)
-XX:MaxGCPauseMillisG1收集器的目标停顿时间(默认200ms)
-XX:G1HeapRegionSizeG1的Region大小(1~32MB)
-XX:+PrintGCDetails打印详细GC日志
-XX:+PrintGCDateStamps打印GC时间戳
-Xloggc:/path/to/gc.log输出GC日志到文件

🧩 七、常见GC问题排查工具

工具说明
jstat实时监控GC状态(如 jstat -gc 1234 1000 每秒输出GC信息)
jmap生成堆转储(jmap -dump:format=b,file=heap.bin 1234)
jhat分析堆转储(jhat heap.bin)
VisualVM图形化监控JVM内存、线程、GC等
MAT(Memory Analyzer)分析堆转储,定位内存泄漏
GC日志分析工具 如 GCViewer、GCEasy、GCPlot

📋 八、常见面试题及答案

1. CMS 和 G1 的区别?

在这里插入图片描述

2. G1为何适合大内存?

  • 分区管理:将堆划分为多个Region,可并行回收。
  • 可预测停顿:通过 -XX:MaxGCPauseMillis 设置目标停顿时间。
  • 避免碎片化:回收时进行压缩(Evacuation阶段)。

3. CMS的缺点?

  • 内存碎片化:可能导致Full GC(标记-清除算法的缺点)。
  • 并发阶段耗CPU:并发标记和清除阶段占用CPU资源。
  • Concurrent Mode Failure:老年代空间不足导致并发失败,退化为Serial Old收集器。

4. 如何选择合适的GC收集器?

在这里插入图片描述

5. Full GC的触发条件?

  • 老年代空间不足。
  • 方法区(元空间)内存不足。
  • 调用 System.gc()(可禁用 -XX:+DisableExplicitGC)。
  • 分配大对象(如大数组)。

6. 如何优化GC性能?

  • 合理设置堆大小:避免频繁GC。
  • 避免内存泄漏:使用缓存时注意释放。
  • 选择合适收集器:如G1适合大内存。
  • 监控GC日志:分析停顿时间和频率。

📚 九、GC调优实践建议

在这里插入图片描述

✅ 十、总结:GC机制核心知识点

在这里插入图片描述

📄 十一、完整GC日志示例

2023-10-23T15:30:00.123+0800: [GC (Allocation Failure) [PSYoungGen: 131072K->15360K(157248K)] 131072K->15360K(503936K), 0.0123456 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]

日志解析

  • GC类型:Allocation Failure(分配失败触发GC)。
  • GC区域:PSYoungGen(Parallel Scavenge新生代)。
  • 内存变化:131072K->15360K(回收后内存占用)。
  • 耗时:0.0123456 secs(GC耗时)。

📌 十二、推荐学习资料

  • 《深入理解 Java 虚拟机》(周志明)
  • 《Java 性能调优指南》
  • JVM 官方文档:https://docs.oracle.com/en/java/javase/17/gctuning/
  • GC日志分析工具:GCViewer、GCEasy、GCPlot
  • JVM调优视频教程(B站、慕课网、CSDN)

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04 - 【HTML】- 常用标签(下篇)

表格标签 1 表格 table 在HTML中&#xff0c;表格是通过<table>标签来创建的&#xff0c;它允许在html中以行和列的形式组织数据。HTML提供了一套完整的标签来创建功能丰富的表格。 2 表格的 结构 3 表格table代码结构 4 表格结构解析 <thead></thead>&…

nVisual从入门到精通—应用实例

五、应用实例 5.1 数据中心的规划设计 5.1.1 规划设计流程5.1.2 创建模型库 5.1.2.1 设备模型库 设备模型库基于组织内实际使用的设备型号进行构建&#xff0c;主要包含以下对象类型&#xff1a;机柜、网络设备、板卡、组合模型。 设备属性字段&#xff1a;除系统保留字段&…

代码可读性的详细入门

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录前言一、可读性的重要性二、用名字表达代码含义三、避免名字歧义四、良好的代码风格五、注释的价值六、如何编写注释七、提高控制流的可读性八、拆分长表达式九、变量与可读性十、抽取函数十一、一次只做一件事十二、用自然…

轮轨法向接触斑计算

轮轨法向接触斑计算 &#xff0c;同时输出 接触斑面积、长轴 a、短轴 b、最大 Hertz 压力 pmax 等关键指标 算法基于 Hertz 接触理论&#xff08;适用于单点椭圆接触&#xff09;&#xff0c;并给出如何扩展到 非 Hertz / 有限元验证的提示。1 理论回顾&#xff08;Hertz 椭圆…

实习结束,秋招开启

大家好&#xff0c;依旧是你们的老朋友仰望-星空~~&#xff0c;我又消失了3个月&#xff0c;快四个月了&#x1f604;&#xff0c;不少文章都 落灰了。这段时间其实一直在忙着找实习&#xff0c;然后准备面试题、刷算法、做项目啥的&#xff0c;也是比较忙碌的&#xff0c;也就…

14 C++ STL 容器实战:stack/list 模拟实现指南 + priority_queue 用法及避坑技巧

stack和queuestack的模拟实现和应用--底层就是顺序表从栈的接口中可以看出&#xff0c;栈实际是一种特殊的vector&#xff0c;因此使用vector完全可以模拟实现stack。#include<vector> namespace Stack { template<class T> class stack { public:stack() {}void p…

Linux基础指令(入门必备2.0)

创作初心&#xff1a;在加深个人对知识系统理解的同时希望可以帮助到更多需要的同学 &#x1f604;柯一梦的专栏系列 &#x1f680;柯一梦的Gitee主页 &#x1f6e0;️柯一梦主页详情 座右铭&#xff1a;心向深耕&#xff0c;不问阶序&#xff1b;汗沃其根&#xff0c;花自满枝…

《失落之魂》M站评分仅40?国产动作类游戏究竟何去何从?

前段时间频频预热的国产动作游戏《失落之魂》已正式发售&#xff0c;外媒Push Square发布了该作的阶段性评测。评测指出&#xff0c;尽管《失落之魂》在规模上已接近3A级&#xff0c;但能感受到其独立制作的根基。这款游戏于2016年通过索尼“中国之星计划”获得支持&#xff0c…

一个专为地图制图和数据可视化设计的在线配色网站,可以助你制作漂亮的地图!

ColorBrewer 是一个专为地图制图和数据可视化设计的在线配色工具&#xff0c;由宾夕法尼亚州立大学地理学教授 Cynthia Brewer 及其团队开发 。 它提供了科学、美观且考虑周全的配色方案&#xff0c;旨在帮助用户&#xff08;无论是科研人员、设计师还是GIS分析师&#xff09;…

Python图像处理基础(十六)

Python图像处理基础(十六) 文章目录 Python图像处理基础(十六) 10、图像增强和滤镜 10.1 ImageEnhance 10.1.1 亮度 10.1.2 对比度 10.1.3 颜色 10.1.4 清晰度 10.2 ImageFilter 10.3 预定义滤镜 10.4 参数化滤镜 10.4.1 模糊函数 10.4.2 反锐化蒙版 10.4.3 排序和平均滤波…

python中等难度面试题(1)

1、请解释Python中的深拷贝(deep copy)和浅拷贝(shallow copy)的区别&#xff0c;并举例说明它们在实际应用中可能引发的问题。 答&#xff1a; 在Python中&#xff0c;拷贝对象通常指的是创建一个新的对象&#xff0c;这个新对象是原始对象的一个副本。拷贝可以分为两种类型&a…

AI+Java 守护你的钱袋子!金融领域的智能风控与极速交易

当你在异国他乡用信用卡支付酒店费用&#xff0c;手机瞬间弹出银行短信“是否为本人操作”&#xff1b;当你盯着股票行情软件&#xff0c;看着某只股票的股价在3秒内从涨停跌至平盘&#xff0c;懊悔手动下单慢了一步——这些金融场景中的“安全感”与“遗憾”&#xff0c;背后都…

Docker跨架构部署实操第二弹

1. 项目内容 项目目录包含 Dockerfile 与 main.py&#xff0c;并且容器内路径固定为&#xff1a; 数据&#xff1a;/root/autodl-tmp/data模型&#xff1a;/root/autodl-tmp/models保存&#xff1a;/root/autodl-tmp/save 服务端口&#xff1a;9011&#xff08;容器内与宿主映…

PyTorch 学习率调度器(LR Scheduler)

文章目录 PyTorch 学习率调度器&#xff08;LR Scheduler&#xff09;1. 一句话定义2. 通用使用套路3. 内置调度器对比速览4. 各调度器最小模板① LambdaLR&#xff08;线性 warmup&#xff09;② StepLR③ MultiStepLR④ CosineAnnealingLR⑤ ReduceLROnPlateau&#xff08;必…

新后端漏洞(上)- Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)

漏洞介绍&#xff1a;Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问Actuator API的情况下&#xff0c;将可以利用该漏洞执行任意命令。漏洞环境&#xff1a;docke…

【OJ】C++ vector类OJ题

只出现过一次的数字&#xff08;简单&#xff09; 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 这道题使用异或就非常简单了&#xff0c;所有数异或到一起&#xff0c;相同的数据双双消除&#xff0c;只剩下一个的数。 C语言异或运算详解-CSDN博客 clas…

为什么外网主机可以telnet通内网nginx端口,但是http请求失败?

问题是这样的:我内网主机nginx配置了 域名80端口&#xff0c;然后防火墙没有配置80端口&#xff0c;但是外网机子去telnet 80端口可以通&#xff0c;用浏览器请求域名不能访问nginx&#xff0c;然后防火墙开了80端口后&#xff0c;浏览器就可以访问nginx了&#xff0c;为什么防…

【Linux游记】基础指令篇

​​​​​​ 枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C/Linux Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C&#xff0c;C更新的同时我也会更新Linux。Linux操作系统是很经典的…

阿里云-基于通义灵码实现高效 AI 编码 | 4 | 场景学习:3分钟写一个音乐闹钟小应用

文章目录一、初版需求与代码生成二、需求迭代与代码更新三、需求细化与功能完善3.1 pygame安装3.2 放置音乐文件3.3 执行代码免费个人运维知识库&#xff0c;欢迎您的订阅&#xff1a;literator_ray.flowus.cn 一、初版需求与代码生成 首先向通义灵码提出了基本需求&#xff1…

【算法笔记】欧拉降幂公式与欧拉函数

欧拉降幂公式 在数论中&#xff0c;欧拉降幂公式是一个强大的工具&#xff0c;用于简化大指数模运算。公式如下&#xff1a; ∀k>φ(m)&#xff0c;有Ak≡Akmodφ(m)φ(m)(modm)成立。\forall k > \varphi(m)&#xff0c;有 A^k \equiv A^{k \mod \varphi(m) \varphi(m…