JAVA垃圾回收算法

标记-清除算法(Mark and Sweep):

该算法分为两个阶段,

  1. 首先标记所有仍然在使用的对象;
  2. 然后清理所有未标记的对象。
    缺点:
    无法处理对象间的空洞,清理后出现内存碎片。

标记-压缩算法(Mark and Compact):

该算法是标记-清除算法的改进。

  1. 首先标记出存活的对象
  2. 然后将它们压缩到一端
  3. 清理掉所有未压缩的空间。

缺点:

该算法可以减少内存碎片的问题,但是效率相对较低,因为需要对存活的对象进行移动操作。


复制算法:

该算法将内存分为两块,每次只使用其中一块。

当这一块内存用尽后,将仍然存活的对象复制到另一块中。

缺点:

内存使用率不高,只有原来的一半,复制算法的效率会相对较低。


分代算法:

根据对象存活周期的不同将内存划分为几块,每块采用不同回收算法。

  • JAVA分新生代和老年代:
    • 新生代采用复制算法
    • 老年代采用标记压缩算法
新生代里有 3 个分区 内存占比
Eden 未进过GC的对象 8
From Survivor 经过GC的对象,复制算法使用区域 1
To Survivor 经过GC的对象,复制算法使用区域 1

1、新生代

垃圾回收: Minor GC ([ˈmaɪnər])
Young 新生代 第一次Minor GC, 存活对象移动, 年龄+1 Minor GC, 存活对象移动, 年龄+1 Minor GC, 存活对象移动, 年龄+1 年龄==15 或者达到年龄阈值, 存活对象移动到老年代 大数组直接进老年代
或者 对象大小大于PretenureSizeThreshold To Survivor From Survivor Eden Old 老年代

参数配置
-Xms 表示初始化堆内存
-Xmx 表示最大堆内存
-Xmn 表示新生代的内存
-XX:SurvivorRatio 8表示新生代的Eden占8/10,S1和S2各占1/10.
-XX:MaxTenuringThreshold 新生代-复制清除算法 年龄阈值设置( 默认15)
-XX:PretenureSizeThreshold 新生代- 大对象阈值设置( 默认0 ),对象大于阈值直接进老年代

2 、老年代

垃圾回收: MajorGC ( [ˈmeɪdʒər])

主要存放应用程序中生命周期长的内存对象。

MajorGC采用标记压缩算法:

  1. 首先扫描一次所有老年代,标记出存活的对象,MajorGC的耗时比较长,因为要扫描再回收。
  2. 然后回收没有标记的对象。
  3. 存活的对象被移动到连续的内存区域中。
  4. 当老年代也满了装不下的时候,抛出OOM (Out of Memory)异常。

触发时机:

老年代的对象比较稳定,所以MajorGC不会频繁执行。

  • 新生代的对象进入老年代,导致空间不够用时触发。
  • 无法找到足够大的连续空间 分配给 新创建的大对象时触发。
相关推荐
Σίσυφος19004 分钟前
线性与非线性 、齐次非齐次
算法
sheji34169 分钟前
【开题答辩全过程】以 基于Java的智慧环卫垃圾收运管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言
(❁´◡`❁)Jimmy(❁´◡`❁)16 分钟前
4815. 【NOIP2016提高A组五校联考4】ksum
算法
jason成都16 分钟前
实战 | 国产数据库 R2DBC-JDBC 桥接踩坑记 - JetLinks适配达梦数据库
java·数据库·物联网
BullSmall21 分钟前
SEDA (Staged Event-Driven Architecture, 分阶段事件驱动架构
java·spring·架构
无限码力44 分钟前
科大讯飞秋招笔试真题 - 字符拼接 & 字典序最小的字符串拼接 & 圆心覆盖
算法·秋招·科大讯飞·科大讯飞笔试真题
Lips6111 小时前
第四章 决策树
算法·决策树·机器学习
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动
YuTaoShao1 小时前
【LeetCode 每日一题】2053. 数组中第 K 个独一无二的字符串
算法·leetcode·职场和发展
黎雁·泠崖1 小时前
Java&C语法对比:分支与循环结构核心全解析
java·c语言