博客
关于我
JVM篇-结合源码分析垃圾收集器的类型
阅读量:357 次
发布时间:2019-03-04

本文共 1495 字,大约阅读时间需要 4 分钟。

JVM垃圾收集器详解

JVM中的垃圾收集器是维护程序运行内存的一项重要任务。了解其工作原理和实现,可以帮助我们更好地优化应用性能。本文将从垃圾收集器的选择、初始化及空间管理等方面展开讨论。


一、垃圾收集器的选择与初始化

JVM在内存管理中采用不同的垃圾收集器(Garbage Collector, GC),主要根据性能需求和垃圾收集的特点进行选择。常见的垃圾收集器包括:

  • Serial GC:采用单线程进行垃圾收集,适合对并发性要求不高的场景。
  • CMS GC:多线程并发垃圾收集,擅长处理年轻代垃圾。
  • G1 GC:基于标记-整理算法,支持并发收集,适合多核环境。
  • Parallel GC:采用并行标记和整理,提升收集效率。
  • 垃圾收集器的选择会影响内存管理策略和性能表现。JVM在初始化时,根据配置参数(如UseParallelGCUseConcMarkSweepGC等)选择对应的垃圾收集器,并初始化相关的空间管理结构。


    二、垃圾收集器的空间管理

    垃圾收集器的核心任务是管理内存空间,包括年轻代和老年代的分配与回收。以下是主要空间管理类的实现细节:

  • GenCollectedHeap

    • 负责整个垃圾收集过程的核心逻辑。
    • 包含两个主要生成(Generation):年轻代老年代
    • 年轻代主要使用DefNewGenerationParNewGeneration,老年代使用MarkSweepCompactConcurrentMarkSweepGeneration
  • 空间分配策略

    • 年轻代采用“适用性”(appropriate allocation),老年代采用“标记-整理”(mark-compact)或“并发标记-整理”(concurrent mark-compact)。
    • 不同垃圾收集器支持不同的内存分配策略,如并行GC通过并行标记和整理提升效率。
  • 垃圾收集触发逻辑

    • 内存申请失败时,触发垃圾收集操作。
    • 垃圾收集器通过线程执行doit()方法,处理内存分配失败的逻辑。

  • 三、垃圾收集器的具体实现

    1. Serial GC的空间管理
    • GenCollectedHeap:核心逻辑与CMS类似,但采用单线程垃圾收集。
    • 年轻代实现DefNewGeneration,包含Eden空间、From空间和To空间。
    • 老年代实现MarkSweepCompact,采用标记-整理算法。
    2. CMS GC的空间管理
    • 年轻代实现ParNewGeneration,支持多线程垃圾收集。
    • 老年代实现ConcurrentMarkSweepGeneration,采用并发标记-整理。
    • 垃圾收集器ConcurrentMarkSweepPolicy,支持并发处理。
    3. Parallel GC的空间管理
    • 年轻代实现PSYoungGen,支持并行标记和整理。
    • 老年代实现PSOldGen,采用标记-整理算法。
    • 垃圾收集器ParallelScavengeHeap,支持并行处理。

    四、垃圾收集器的触发与执行

    • 触发逻辑

      • 内存申请失败时,触发垃圾收集操作。
      • 垃圾收集器通过线程执行doit()方法,处理内存分配逻辑。
    • 执行过程

    • 标记阶段:标记无用对象。
    • 清理阶段:回收标记对象。
    • 重组阶段:整理内存空间。

    不同垃圾收集器在执行过程中采用不同的算法和优化策略,如并行GC通过并行标记和整理提升效率。


    五、总结

    JVM中的垃圾收集器通过复杂的空间管理和内存回收机制,确保程序正常运行。了解其工作原理有助于我们优化内存使用和垃圾收集性能。建议开发者根据性能需求选择合适的垃圾收集器,并关注其内部实现细节。

    转载地址:http://bumr.baihongyu.com/

    你可能感兴趣的文章
    OAuth2 Provider 项目常见问题解决方案
    查看>>
    OAuth2 vs JWT,到底怎么选?
    查看>>
    Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_三项内容_Spring Security OAuth2.0认证授权---springcloud工作笔记141
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_授权码模式_Spring Security OAuth2.0认证授权---springcloud工作笔记144
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>
    OAuth2.0四种模式的详解
    查看>>
    OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
    查看>>