jvm源码阅读笔记[5]:内存分配失败触发的GC究竟对内存做了什么?

本文详细解析了JVM源码中内存分配失败如何触发GC的过程。内容涉及判断JNI操作、增量收集失败条件、内存分配与扩容、Full GC的执行,以及在不同情况下的内存管理决策。通过实例解释了GC日志中的"allocation failure"现象,并通过流程图辅助理解整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    从零开始看源码,旨在从源码验证书上的结论,探索书上未知的细节。有疑问欢迎留言探讨
    个人源码地址:https://github.com/FlashLightNing/openjdk-notes
    还有一个openjdk6,7,8,9的地址:https://github.com/dmlloyd/openjdk
    jvm源码阅读笔记[1]:如何触发一次CMS回收
    jvm源码阅读笔记[2]:你不知道的晋升阈值TenuringThreshold详解
    jvm源码阅读笔记[3]:从内存分配到触发GC的细节
    jvm源码阅读笔记[4]:从GC说到vm operation
    jvm源码阅读笔记[5]:内存分配失败触发的GC究竟对内存做了什么?

    
    在第3篇文章中,我们总结到,当分配内存失败时,会通过VM触发一次由分配失败触发的一次GC,也就是我们经常能在GC日志里面看到的“allocation failure”

VM_GenCollectForAllocation op(size, is_tlab, gc_count_before);//VM操作
    VMThread::execute(&op);

    同时,在我们第4篇中也简单介绍了VMThread和VMOperation的原理和作用,写到每个VM操作的具体实现逻辑都是在它的doit()方法上。那么今天我们就来看看VM_GenCollectForAllocation的具体GC的过程和步骤。来看看vmGCOperations.cpp:

void VM_GenCollectForAllocation::doit() {
  SvcGCMarker sgcm(SvcGCMarker::MINOR);

  GenCollectedHeap* gch = GenCollectedHeap::heap();
  GCCauseSetter gccs(gch, _gc_cause);
  //通知内存堆管理器处理一次内存分配失败  
  _res = gch->satisfy_failed_allocation(_size, _tlab);//res=分配的结果
  assert(gch->is_in_reserved_or_n
<think>好的,用户之前让我介绍并发、JVM和框架相关的高频Java题目,现在又询问Markdown/PDF文档和Anki记忆卡的具体情况。我需要先理解用户的需求。 用户可能是在准备面试或者系统学习Java高级知识,需要这些资料来辅助复习。他们可能希望得到更结构化的学习材料,方便在不同场景下使用。Markdown/PDF适合系统学习,而Anki记忆卡适合利用碎片时间复习。 接下来,我要分析用户提到的三种资料形式的特点。Markdown和PDF适合详细阅读,便于打印和笔记。Anki记忆卡则是利用间隔重复算法帮助记忆,这对记忆概念和关键点特别有效。用户可能希望知道哪种形式更适合他们的学习方式,或者想了解如何获取这些资料。 同时,用户可能没有明确说出的是,他们需要高效的学习工具,尤其是时间紧张的情况下。Anki的记忆卡可以帮助他们高效记忆,而详细的文档则用于深入理解。此外,用户可能还关心这些资料的内容是否全面,是否包含足够的实战案例。 我需要确保回答中涵盖每种格式的优点、适用场景,以及如何结合使用。还要提到可能的附加内容,比如实战题目,这能解决用户潜在的实际应用需求。最后,应该询问用户的具体需求,以便提供更针对性的帮助,比如是否需要更多代码示例或调优案例。 需要注意的是,用户可能对如何制作Anki卡片或如何组织Markdown文档不太熟悉,所以解释清楚这些工具的使用方法也是有必要的。同时,保持回答简洁,分点说明,方便用户快速获取信息。</think>以下是关于 **Markdown/PDF文档** 和 **Anki记忆卡** 的详细介绍及适用场景分析: --- ### **1. Markdown/PDF文档** #### **特点** - **结构化知识**:内容按知识点分类(如并发/JVM/框架),层级清晰,适合系统化学习。 - **代码与注释**:可直接嵌入代码片段、配置示例和调优参数(如GC日志参数、线程池配置)。 - **便携性**:PDF支持离线阅读、打印标注,Markdown易于用Git管理版本和协作。 #### **适用场景** - **深度学习**:需要反复查阅底层原理(如JVM内存模型、Spring循环依赖源码)。 - **面试复习**:快速定位高频考点(如CAS缺陷、G1回收流程)。 - **团队分享**:作为技术文档库,统一团队知识体系。 #### **示例内容片段** ```markdown ## **G1垃圾回收器核心参数** - `-XX:+UseG1GC`:启用G1 - `-XX:MaxGCPauseMillis=200`:目标最大停顿时间 - `-XX:InitiatingHeapOccupancyPercent=45`:触发并发GC的堆占用率阈值 ``` --- ### **2. Anki记忆卡** #### **特点** - **主动回忆**:基于“间隔重复算法”,自动规划复习频率,强化记忆薄弱点。 - **碎片化学习**:支持手机/PC端同步,通勤或排队时刷题。 - **自定义内容**:可添加题目类型(如选择题、填空题)、关联图片或代码截图。 #### **适用场景** - **概念速记**:快速记忆高频术语(如偏向锁、TLAB、Spring Bean生命周期)。 - **面试冲刺**:每天刷30张卡,巩固易忘知识点(如`volatile`禁止指令重排序原理)。 - **错题本功能**:自动记录错误次数,针对性复习。 #### **示例卡片内容** - **正面**:`synchronized锁升级过程?` - **背面**: ```text 无锁 → 偏向锁(单线程) → 轻量级锁(CAS自旋) → 重量级锁(OS互斥量) ``` --- ### **3. 如何结合使用?** | **场景** | **推荐工具** | **优势** | |------------------|-----------------------|--------------------------------------| | 通勤碎片时间 | Anki记忆卡 | 手机随时刷题,强化记忆点 | | 系统化学习/实战 | Markdown/PDF文档 | 结合代码示例和原理图深入理解 | | 模拟面试/笔试 | PDF文档+Anki | 快速检索答案,查漏补缺 | --- ### **附加内容(可选)** 1. **实战场景附加题**(如设计秒杀系统) - 提供架构图、代码伪代码、压测参数(如JMeter线程组配置)。 2. **调优案例库** - 真实线上问题分析(如Full GC频繁、Redis缓存穿透)。 --- ### **如何获取?** 1. **定制化需求**: - 是否需要增加 **“高频考点标注”**(如大厂真题)? - 是否需要 **“代码实操项目”**(如手写线程池、简化版Spring)? 2. **格式优化**: - Markdown支持代码高亮(如Java/Python),PDF可提供书签导航。 如果需要示例或模板,可告知具体方向(如并发/JVM优先),我会进一步提供!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值