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

    你可能感兴趣的文章
    Openlayers Draw的用法、属性、方法、事件介绍
    查看>>
    Openlayers Select的用法、属性、方法、事件介绍
    查看>>
    Openlayers Source基础及重点内容讲解
    查看>>
    Openlayers view三要素(zoom,center,projection)及其他参数属性方法介绍
    查看>>
    openlayers 入门教程(九):overlay 篇
    查看>>
    openlayers 入门教程(二):map 篇
    查看>>
    openlayers 入门教程(五):sources 篇
    查看>>
    openlayers 入门教程(八):Geoms 篇
    查看>>
    openlayers 入门教程(十三):动画
    查看>>
    openlayers 入门教程(十五):与 canvas、echart,turf 等交互
    查看>>
    openlayers 入门教程(十四):第三方插件
    查看>>
    openlayers 入门教程(四):layers 篇
    查看>>
    OpenLayers 项目分析(三)-OpenLayers中定制JavaScript内置类
    查看>>
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>