博客
关于我
9_ GC 四大算法详解
阅读量:673 次
发布时间:2019-03-16

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

JVM垃圾回收机制详解

在Java虚拟机(JVM)的内存管理中,垃圾回收(GC)是保障程序运行稳定性的重要机制。以下是一些关于GC垃圾收集机制的关键点和相关算法。


GC垃圾回收机制概述

JVM在进行GC时,并非每次都对上述三个内存区域一起回收。大部分时候,GC只是回收新生代(Young Generation)。GC回收区域又可以分为两种类型:

1. 普通GC(Minor GC)

  • 目标区域:仅针对新生代区域的GC。
  • 特点:在新生代中,大部分Java对象存活率较低,因此Minor GC很频繁且速度较快。

2. 全局GC(Major GC)

  • 目标区域:针对老年代区域的GC。
  • 特点:发生Major GC时,通常伴随一次Minor GC(但并非绝对),速度慢上10倍以上。

GC日志信息解读

在JVM日志中,出现的GC相关参数有以下几种形式:

YGC(Young GC)日志示例:

[GC (Allocation Failure) [PSYoungGen: 1580K->504K(2560K)] 1580K->764K(9728K), 0.0167268 secs]
  • 解读:PSYoungGen表示保证新生代内存,数值表示从1580K拦截到504K新的生成空间。数字中的括号表示标记(mark),数值表示最终分配空间。

FGC(Full GC)日志示例:

[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 592K->574K(7168K)] 592K->574K(9728K), 0.0040996 secs]
  • 解读:PSYoungGen和ParOldGen分别表示新生代和老年代的内存回收情况。592K->574K表示老年代从592K消耗到574K。

Java对象存活算法

在JVM中,内存管理核心问题之一是如何判断对象是否还能继续存活。主要采用两种算法:

1. 引用计数算法(Reference Counting Algorithm)

  • 实现:为每个对象设置计数器,计数器递减时释放对象。
  • 优点:实现简单,效率高。
  • 缺点:无法处理循环引用,计数器操作成本较高,现已被放弃。

2. 根搜索算法(Mark-and-Sweep)

  • 原理:从GC Roots开始遍历,标记遍历结束的对象,清理未被引用对象。
  • 实现:标记阶段为对象增加标志,清除阶段回收被标记的对象。

垃圾回收算法总结

现代JVM主要采用分代收集算法,将堆分为新生代和老年代,并选择最适的算法:

1. 复制算法(Copying)

  • 适用场景:新生代。
  • 优点:无内存碎片,效率高。
  • 缺点:内存浪费(50%左右空间利用率),不适用于高存活率对象。

2. 标记清除(Mark-Sweep)

  • 适用场景:老年代。
  • 优点:内存利用率高,不额外占用内存。
  • 缺点:效率低,需要暂停程序,内存碎片严重。

3. 标记压缩(Mark-Compact)

  • 合并优点:无内存碎片,整体效率较标记清除高。
  • 缺点:额外开销较大,整理存活对象引用地址。

4. 分代收集(Mark-and-Sweep+Compact)

  • 综合解决方案:新生代使用复制算法,老年代使用标记压缩化解内存碎片问题。

存活算法选择

根据对象存活特性,合理选择GC算法至关重要。新生代对象存活率低,复制算法效率更高;老年代对象存活率高,标记压缩和标记清除是更优选择。


常见面试问题解答

问题1:GC四种算法哪个更好?

  • 没有最佳算法,垃圾回收应根据对象存活特性选择合适算法。新生代使用复制算法,老年代使用标记压缩。

问题2:各算法优缺点对比

  • 复制算法:效率高,但内存浪费严重。
  • 标记清除:内存利用率高,但效率低且内存碎片严重。
  • 标记压缩:无内存碎片,但整理存活对象地址成本较高。

通过合理配置和选择,JVM垃圾回收机制能够在不同工作负载下稳定运行,最大化内存利用率。

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

你可能感兴趣的文章
OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
查看>>
OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
查看>>
OpenCV与AI深度学习 | 基于OpenCV实现模糊检测 / 自动对焦
查看>>
OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
查看>>
OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
查看>>
OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
查看>>
OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
查看>>
OpenCV与AI深度学习 | 基于YoloV11自定义数据集实现车辆事故检测(有源码,建议收藏!)
查看>>
OpenCV与AI深度学习 | 基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 基于YOLOv8实现高级目标检测和区域计数
查看>>
VS2003 Front Page Server Extension
查看>>
OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
查看>>
OpenCV与AI深度学习 | 基于YoloV8的药丸/片剂类型识别
查看>>
OpenCV与AI深度学习 | 基于YOLO和EasyOCR从视频中识别车牌
查看>>
OpenCV与AI深度学习 | 基于图像处理的火焰检测算法(颜色+边缘)
查看>>
OpenCV与AI深度学习 | 基于拉普拉斯金字塔实现图像融合(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 基于改进YOLOv8的景区行人检测算法
查看>>
OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
查看>>
OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
查看>>