冰河技术
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
  • JVM核心技术

    • 【置顶】冰河的第一本深入理解JVM书籍免费送
    • 第01章:JVM调优的几种场景
    • 第02章:类的编译、编译优化、常量这地、泛型擦除、条件编译
    • 第03章:类的加载过程
    • 第04章:JVM内存空间
    • 第05章:JVM堆内存分配机制
    • 第06章:JVM垃圾回收机制
    • 第07章:JVM垃圾回收算法
    • 第08章:CMS垃圾收集器
    • 第09章:G1垃圾收集器
    • 第10章:JVM 内存布局
    • 第11章:JVM各种参数配置
  • JVM生产实践

    • 第01章:6款JVM神级工具
    • 第02章:生产服务GC耗时长的排查案例
    • 第03章:GC暂停时长由30秒下降到190毫秒的优化案例
    • 第04章:产环境CPU狂飙900%的优化案例

《JVM核心技术》第07章:JVM垃圾回收算法

大家好,我是冰河~~

各位小伙伴应该都上班了吧,好啦,大家把心收回来好好工作吧,今天冰河继续给大家分享一篇关于JVM的文章。

在《JVM垃圾回收机制》一文中,我们知道了哪些类是需要清除的,那在java虚拟机中,他有哪些垃圾收集算法呢?

标记-清除

标记-清除算法就是,先标记哪些对象是存活的,哪些对象是可以回收的,然后再把标记为可回收的对象清除掉。从下面的图可以看到,回收后,产生了大量的不连续的内存碎片,如果这个时候,有一个比较大的对象进来,却没有一个连续的内存空间给他使用,又会触发一次垃圾收集动作。


复制算法

复制算法是通过两个内存空间,把一方存活的对象复制到另外一个内存空间上,然后再把自己的内存空间直接清理。 标记后,此时情况如下:


然后再把左边的存活对象复制到右边:


复制完后,再清理自己的内存空间:


右边的空间开始回收,再复制到坐标,如此往复。这样就可以让存活的对象紧密的靠在一起,腾出了连续的内存空间。 缺点就是空间少了一半,这少了一半的空间用于复制存活的对象。但是在实际过程中,大部分的对象的存活时间都非常短,也就是说这些对象都可以被回收的。

比如说左边有100M空间,但是只有1M的对象是存活的,那我们右边就不需要100M来存放这个1M的存活对象。因此我们的新生代是分成3个内存块的:Eden空间、From Survivor空间、To Survivor空间,他们的默认比例是8:1:1。

也就是说,平常的时候有Eden+Survivor=90M可以使用,10M用于存放存活对象(假设100M空间)。这个算法在《JVM堆内存分配机制》一文中的对象优先在Eden分配中提过了。

标记-整理

除了新生代,老年代的内存也要清理的,但是上面的算法并不适合老年代。因为老年代对象的生命周期都比较长,那就不能像新生代一样仅浪费10%的内存空间,而是浪费一半的内存空间。

标记-整理与标记-清除都是先标记哪些对象存活,哪些对象可以回收,不同的是他并没有直接清理可回收的对象,而是先把存活的对象进行移动,这样存活的对象就紧密的靠在一起,最后才把垃圾回收掉。

回收前,存活对象是不连续的。


回收中,存活对象是连续的。


回收后,回收垃圾对象。


性能与优化

由于每次GC,都会Stop The World,也就是说,此时虚拟机会把所有工作的线程都停掉,会给用户带来不良的体验及影响,所以我们要进来的减少GC的次数。

针对新生代,Minor GC触发的原因就是新生代的Eden区满了,所以为了减少Minor GC,我们新生代的内存空间不要太小。如果说我们给新生代的内存已经到达机器了极限了,那只能做集群了,把压力分担出去。

老年代的垃圾回收速度比新生代要慢10倍,所以我们也要尽量减少发生Full GC。

《JVM堆内存分配机制》一文中我们提到了几种进入老年代的方式,我们看看这些是怎么处理的:

  • 大对象直接进入老年代:这个没办法优化,总不能调大对象大小吧,那这些大对象在新生代的复制就会很慢了。
  • 长期存活的对象将进入老年代:年龄的增加,是每次Minor GC的时候,所以我们可以减少Minor GC(这个方法上面提到了),这样年龄就不会一直增加。
  • 动态年龄判断:有一个重要的条件就是在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,所以要加大新生代的内存空间。
  • 空间分配担保:这里面有一个条件是Minor GC后,Survivor空间放不下的就存放到老年代,为了让存活不到老年代,我们可以加大Survivor空间。

上面的方法,既有加大新生代的内存空间,也有加大Survivor空间,实时上,怎么优化,需要根据我们的实际场景来看,JVM的优化并没有银弹。

写在最后

在冰河的知识星球有大量从零开始带你手写的企业级生产项目,像DeepSeek大模型、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、分布式IM即时通讯系统、Sekill分布式秒杀系统、手写RPC、简易商城系统等等,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。

值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,并且冰河也正在为企业级高性能RPC框架录制视频,全程带你分析原理和手撸代码。 你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。


目前,领券加入星球就可以跟冰河一起学习《DeepSeek大模型》、《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件项目》、《手写简易商城脚手架项目》、《手写高性能RPC项目》和《Spring6核心技术与源码解析》、《实战高并发设计模式》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》和《手写高性能Polaris网关》,从零开始介绍原理、设计架构、手撸代码。

花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统与分布式IM即时通讯系统,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!

加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。

另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!

其他方式加入星球

  • 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
  • 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。

特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。

联系冰河

加群交流

本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:星球编号。

冰河微信

公众号

分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 冰河技术 微信公众号首发,强烈建议大家关注。

公众号:冰河技术

视频号

定期分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。

视频号:冰河技术

星球

加入星球 冰河技术,可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:hacker_binghe, 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习实战项目!

关注 冰河技术公众号,回复 星球 可以获取入场优惠券。

知识星球:冰河技术

好了,今天就到这儿吧,我是冰河,我们下期见~~

在 GitHub 上编辑此页
上次更新: 2026/4/29 16:18
Contributors: binghe001
Prev
第06章:JVM垃圾回收机制
Next
第08章:CMS垃圾收集器
阅读全文
×

扫码或搜索:冰河技术
发送:290992
即可立即永久解锁本站全部文章

星球会员
跳转链接