博客
关于我
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/

    你可能感兴趣的文章
    php 笔记 (早前的,很乱)
    查看>>
    PHP 第一天
    查看>>
    Redis使用量暴增,快速定位有哪些大key在作怪
    查看>>
    php 结课作业答案,北语201803考试批次《PHP》(结课作业)1.pdf
    查看>>
    PHP 统计数据功能 有感
    查看>>
    SpringBoot处理JSON数据
    查看>>
    Redis使用基本套路
    查看>>
    php 解决项目中多个自动加载冲突问题
    查看>>
    PHP 设置调试工具XDebug PHPStorm IDE
    查看>>
    php 身份证号检测
    查看>>
    PHP 输入输出流合集
    查看>>
    PHP 过滤器(Filter)
    查看>>
    php 运算符and or && || 的详解
    查看>>
    php 返回html字符串长度限制,记一次js中和php中的字符串长度计算截取的终极问题和完美...
    查看>>
    php 阿里云oss 上传回调
    查看>>
    PHP 面向对象 final类与final方法
    查看>>
    php+JQ+EasyUI自动加载数据
    查看>>
    php+sql server根据自增序号id区间查询第几条到第几条的数据
    查看>>
    php--------获取当前时间、时间戳
    查看>>
    php--正则表达式
    查看>>