JVM篇:垃圾回收算法

标记清除

通过遍历GC Root后得到不再被引用的对象,对没被引用的对象做一个标记处理,然后对其进行清除。

优点:速度快

缺点:会产生内存碎片,可能会导致空闲的内存足够保存对象,但由于不连续而保存失败。

标记整理

和标记清除差不多类似,但不同的是它会对清理过的内存进行一个整理,不会产生内存碎片。

优点:没有内存碎片

缺点:涉及到内存地址移动,如果程序中引用变量的内存地址改变还需要进行修改。速度慢

复制算法

需要两块区域,一份From和一份To,将From中存活的区域进行一个复制到To区域。

复制完成后,清空From所用内存,并交换From与To的区域,使得To区域保持空

优点:不会产生内存碎片

缺点:需要双倍的内存空间

分代算法

在JVM中,垃圾回收通常是以上三种垃圾回收机制一起使用,而不是单独使用一种

新生代中,需要保存用完就可以回收的对象,清理比较频繁,而老年代保存的是需要长久使用的对象,因此清理频率低,同时清理速度慢。针对不同的区域采用不同的垃圾清理算法。在JVM中,使用的就是分代算法

所谓伊甸园,就是诞生对象的区域。不管是什么对象,都先存储在伊甸园。如下图所示,当伊甸园不满足容纳新的对象时,会进行一次小的垃圾回收(Minor GC),会将伊甸园中存活的对象复制到幸存区To中并且记录对象存活次数(每执行一次垃圾回收,所有没被回收的对象生命值+1,当生命值超过一定值后(最大为15次),则会放入老年代区域),然后将伊甸园内存清空,交换From与To的内存区域。等到下一次执行Minor GC时,除了扫描伊甸园存活对象之外还要扫描幸存区From中的对象,然后将所有存活的对象存放在幸存区To中后交换From与To的内存区域。

当所有的区域都不能够满足容纳新的对象时,先回进行一次Minor GC,当回收完依旧无法满足容纳新对象则会进行一次大的垃圾回收Full GC,此次回收会对所有的区域进行垃圾回收

当进行垃圾回收时,会暂停所用的用户线程(stop the world,即STW),因为涉及到了内存地址变化,所以其他线程都会停止等到垃圾回收结束后才会接着进行。

相关推荐
rit843249911 分钟前
人工鱼群算法AFSA优化支持向量机SVM,提高故障分类精度
算法·支持向量机·分类
佩佩(@ 。 @)35 分钟前
嵌入式:走馬燈-stm32GPIOF_LED9、10; GPIOE_D10、D12 流水綫蜂鸣器
stm32·嵌入式硬件·算法
知彼解己41 分钟前
字符串大数相加:从初稿到优化的思路演进
java·开发语言·算法
好多171 小时前
《JVM如何排查OOM》
开发语言·jvm·python
haing20191 小时前
使用deboor法计算三次B样条曲线在参数为u处的位置的方法介绍
算法·b样条曲线·deboor
qq_352109521 小时前
旋转数字矩阵 od
算法
大阳1231 小时前
51单片机4(温度传感器DS18B20)
开发语言·单片机·嵌入式硬件·算法·51单片机
iナナ1 小时前
Java优选算法——二分查找
数据结构·算法·leetcode
l1t2 小时前
利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
xml·c语言·数据结构·人工智能·算法·解析器
宇钶宇夕3 小时前
西门子 S7-200 SMART PLC 编程:转换 / 定时器 / 计数器指令详解 + 实战案例(指令讲解篇)
运维·算法·自动化