黑马JVM总结(十四)

(1)分代回收_1

Java虚拟机都是结合前面几种算法,让他们协同工作,具体实现是虚拟机里面一个叫做分代的垃圾回收机制,把我们堆内存大的区域划分为两块新生代、老年代

新生代有划分为伊甸园、幸存区Form、幸存区To

为什么要这样区域划分呢?因为java中有的对象需要长时间使用,长时间使用的对象呢我就把放到老年代当中,哪些用完就可以丢弃的对象把它放在新生代当中,这样根据对象生命周期不同的特点进行不同的垃圾回收策略,老年代的垃圾回收很久才发生一次,新生代的垃圾回收发生比较频繁,不同的区域采用不同的算法就可以对垃圾回收,更有效的对垃圾回收进行管理

新生代的垃圾比如我们在楼下设置的垃圾场手机生活中的盒饭,手纸等等频繁的垃圾

老年代:比如每家每户用旧的椅子等等,当以后空间紧张屋子里放不下的时候,来清理这些旧用垃圾 ,执行的频率较低

(2)分代回收_2

当我们新创建对象时,新对象会采用伊甸园的空间

当伊甸园的空间逐渐放满时,在新建对象放不下时,就会触发一次垃圾回收,小的垃圾回收Minor GC ,Minor GC会采用前面讲的可达性分析算法沿着GC Roor引用链去找,看这些对象哪些有用那些可作为垃圾,进行标记 ,标记成功了采用复制算法,把存活的对象复制到幸存区To中

然后把幸存的对象进行加1,然后把伊甸园中没有的对象回收掉了

再交换幸存区Form和幸存区To的位置;

然后伊甸园就可以继续存放新产生的对象啦:

当存满后又一次触发Minor GC,此时去看伊甸园中存活的对象找到以外,把幸存区中有没有继续存活的对象,把伊甸园中的对象复制到TO中并且寿命加1,在看一下幸存区中存活的对象移入到TO中去寿命变为2,其余的垃圾对象回收掉

然后再交换幸存区的位置:

幸存区的对象不会一直在幸存区中待着,当寿命达到一个阈值,比如经过15次垃圾回收,这个对象价值比较高,那么没必要把它一直在幸存区留着,把它移到老年代中去

当出现新生代和老年代的对象都要放满时,此时会触发一次Full GC

当老年代空间不足先尝试回收新生代,当新生代内存不够尝试触发Full GC,触发一个老年代的垃圾回收,从新生到老年做一个整个的处理

老年代采用的算法可能是标记+清除(时间稍微慢) 可能是标记+整理算法(时间比较慢)

通过垃圾回收,如果老年代的空间还是不足,就会触发内存溢出异常

(3)分代回收_3

相关推荐
星空露珠6 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
极光代码工作室7 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发
我是唐青枫7 小时前
Java Spring Security 实战详解:从登录认证到 JWT 权限控制
java·spring
ihuyigui7 小时前
海外签收通知短信接口
android·java·开发语言·前端·数据库·后端
海棠Flower未眠7 小时前
SpringBoot 消息死信队列(荣耀典藏版)
java·数据库·spring boot
暖和_白开水8 小时前
数据分析agent (七):contextvars 模块上下文request_id
java·前端·数据分析
QXWZ_IA8 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel8 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客8 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化
风栖柳白杨9 小时前
【面试】AI算法工程师_空白自测版本
人工智能·算法·面试