当前位置: 首页 > news >正文

快速了解JVM的GC历史

写在前面

Java虚拟机(JVM)的垃圾回收(GC)机制是Java生态系统的核心组件之一,直接影响应用程序的性能和稳定性。从早期的简单标记清除算法,到现代的分代收集、并发回收等复杂策略,GC技术经历了多次重大演进。了解JVM的GC历史不仅能帮助开发者优化应用性能,还能深入理解Java内存管理的设计哲学,本文将梳理JVM垃圾回收的发展历史。

垃圾回收器算法

定位垃圾的算法

1. Reference Count(引用计数法)

这个很简单,不过多赘述

2. Root Searching (根可达算法)

GC roots:JVM stack,native method stack、runtime constant pool、static references in method area,Clazz

线程栈变量、静态变量、常量池、JNI指针

垃圾清除算法

  1. Mark-Sweep(标记清除)

​ 打上标记直接清除。碎片化严重

  1. Copying(拷贝)

    只能有一半的空间,将找到的不是垃圾拷贝到另一边

  2. Mark-Compact(标记压缩)

    回收的时候就将其整理好,效率最低

各种各样的垃圾清楚算法有利有弊,不同的垃圾回收器使用的方不尽相同,但是每种都有其特点

十种垃圾回收器

GC 的演化

随着内存大小的不断增长而演进

  • 几兆-几十兆 :Serial
  • 几十兆-上百兆1G:parallel Scavenge + parallel Old(JDK 1.8 默认)

  • 几十G Concurrent GC:CMS + ParNew、G1、ZGC 、Shenandoah(GC 线程和垃圾回收线程同时进行)

堆内逻辑分区

所有的垃圾回收器都将内存分为了新生代和老年代

new : old = 1:3

new 中 eden(伊甸):survivor:survivor = 8:1:1

第一次执行时扫描 eden 中的对象,将存活的对象拷贝到survivor区中,将eden中进行全部清除,下一次就对eden 和存储对象的survivor区进行扫描,将存活的对象放到另一个survivor区中,对eden 和 survivor全部清除,以此类推。如果survivor装不下了,就往 old 中扔。

1. Serial(年轻代)

a stop-the-world,copying which uses a single GC thread

单线程 STW 复制算法 年轻代垃圾回收

2. Serial Old(老年代)

a stop-the-world mark-sweep-compact collector that uses a single GC thread

单线程 STW 标记清除和标记压缩相结合 老年代垃圾回收

3. Parallel Scavenge(新生代)

多线程 STW 复制算法 新生代垃圾回收

4. Parallel Old(老年代)

多线程 STW 标记清除 + 标记压缩 老年代垃圾回收

5. CMS (老年代)

Concurrent Mark Sweep

三色标记算法

四个过程:初始标记 -> 并发标记 -> 重新标记 -> 并发清理

​ 1、找到 root 标记 此时 STW

​ 2、并发标记,不会产生 STW ,但是会存在标错的情况(三色标记算法)

​ 黑色:自己已经标记,并且fields都标记完成

​ 灰色:自己标记完成,还没来得及标记fields

​ 白色:还 没有遍历到的节点

​ 3、此时对错误的重新进行修正,会产生 STW

​ 4、并发清理

6. ParNew(年轻代)

配合 CMS 来进行使用,Parallel Scavenger 的加强版

7. Epsilon(什么都不干垃圾回收器)

8. G1(放弃了分代模型)

物理上不分代,逻辑上分代

9. ZGC(分页算法)

10.Shenandoah

调优

  1. 根据需求进行jvm规划和预调优
  2. 优化运行jvm运行环境
  3. 解决 jvm 运行过程中出现的各种各样的问题 OOM
常用参数

jps 显示当前运行的java 程序

jinfo port 显示当前运行程序的详细信息

jstat -gc port java的跟踪信息

jstack port 打印线程栈信息

top linux 显示进程 占用 cpu情况

top -Hp port 显示进程中的线程占用 cpu 的情况

jmap - histo port 不同的类占用内存的情况(STW)

jmap -dump:format=b,file=filename.hprof

arthas


The end.

http://www.xdnf.cn/news/975601.html

相关文章:

  • 【Lua热更新知识】学习三 XLua学习
  • 【AI 时代,食品科技远未触及天花板,新一轮颠覆性突破正在酝酿】
  • 神舟笔记本Control Center无法打开风扇设置
  • Web 架构之服务网格(Service Mesh)实战解析
  • 机器视觉开发-边缘提取
  • Python爬虫(54)Python数据治理全攻略:从爬虫清洗到NLP情感分析的实战演进
  • 2025-6-9Vue3快速上手
  • ubuntu22 arm 编译安装input leap
  • 数据的聚合
  • 审计效率升级!Word一键批量给数字添加千位分隔符
  • 传统机器学习与大模型 + Prompt 的对比示例
  • eureka如何绕过 LVS 的虚拟 IP(VIP),直接注册服务实例的本机真实 IP
  • SpringMVC异步处理Servlet
  • Wyn 商业智能与 3D 大屏的深度融合应用
  • 在ARM 架构的 Mac 上 更新Navicat到17后连接Oracle时报错:未加载 Oracle 库。
  • 高频面试之6Hive
  • 机器学习算法——集成学习
  • 电路图识图基础知识-变频器控制电动机系统解析(二十四)
  • 渗透测试PortSwigger Labs:遭遇html编码和转义符的反射型XSS
  • uniapp 云打包 iOS 应用上传到 app store 商店的过程
  • ZZU-ARM汇编语言实验 34
  • 【Rust UDP编程】rust udp编程方法解析与应用实战
  • uni-app bitmap.load() 返回 code=-100
  • XSP30是一款2~3节串联锂电池/锂离子电池升降压充电管理IC
  • Snipaste:轻量级截图,高效编辑
  • Spring中@Value注解:原理、加载顺序与实战指南
  • Springboot项目的目录结构
  • 西门子 SINAMICS S200伺服,重塑汽车焊接工艺新标准
  • 技术革新,EtherCAT转CAN网关,新能源汽车电池产线再升级
  • 汽车租赁小程序开发指南