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

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

JVM垃圾收集器详解

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


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

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

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


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

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

  • GenCollectedHeap:

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

    • 年轻代采用“适用性”(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/

    你可能感兴趣的文章
    python 多线程与GIL
    查看>>
    python 多进程-基础
    查看>>
    python 多进程-进阶-进程池
    查看>>
    python 多进程-进阶-进程间通信之Pipe
    查看>>
    python 多进程-进阶-进程间通信之Queue
    查看>>
    python 如何“否定“value : 如果为真则返回假,如果为假则返回真
    查看>>
    Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化
    查看>>
    python 字符串中特定字符替换,截取
    查看>>
    Python 字符串总结
    查看>>
    python 字符串显示中文_Python字符串开头的b"、u"、r"与中文乱码
    查看>>
    Python 字符串的几种拼装方式
    查看>>
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>
    python 学习 面向对象编程
    查看>>
    Python 学习日记第三篇 -- 字典
    查看>>
    Python 学习笔记(一)Data type
    查看>>
    python 安装echarts
    查看>>
    python 安装opencv及问题解决
    查看>>
    Python 安装程序:“写入文件 C:\Python27\pythonw.exe 时出错“
    查看>>
    Python 安装避坑指南:从入门到进阶
    查看>>
    Python 安装配置详解
    查看>>