博客
关于我
JVM篇-结合源码分析垃圾收集器的类型
阅读量:358 次
发布时间: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/

    你可能感兴趣的文章
    PKUSC2018游记
    查看>>
    PK项目测试,做产品测试有这4大优势!
    查看>>
    pl sql 的目录 所在的目录 不能有 小括号,如 Program Files (x86)
    查看>>
    PL SQLDEVELOPMENT导出数据库脚本
    查看>>
    Queue
    查看>>
    PL/SQL Developer中文版下载以及使用图解(绿色版)
    查看>>
    pl/sql developer乱码,日期格式等问题解决
    查看>>
    PL/SQL 中的if elsif 练习
    查看>>
    PL/SQL 存储函数和过程
    查看>>
    query简单入门到精通细节 - (六)Jquery效果之“淡入与淡出”
    查看>>
    PL/SQL提示“ORA-01722:无效数字,将无效数字查找出来
    查看>>
    PL/sql语法单元
    查看>>
    PL/SQL连接远程服务器数据库,出现ORA-12154: TNS: 无法解析指定的连接标识符。
    查看>>
    pl/sql锁
    查看>>
    QueryPerformanceCounter与QueryPerformanceFrequency
    查看>>
    Plaid.com的监控系统如何实现与9600多家金融机构的集成
    查看>>
    Plain Stock Prediction:基于RNN的股票价格预测工具
    查看>>
    platform_driver与file_operations两种方法开发led驱动
    查看>>
    PlatON共识方案详解:应用CBFT共识协议,提高共识效率
    查看>>
    QueryDict和模型表知识补充
    查看>>