jvm 07 GC算法,内存池,对象内存分配

01 垃圾判断算法

1.1引用计数算法

cpp 复制代码
最简单的垃圾判断算法。

在对象中添加一个属性用于标记对象被引用的次数,每多一个其他对象引用,计数+1,
当引用失效时,计数-1,如果计数=0,表示没有其他对象引用,就可以被回收。

这个算法无法解决循环依赖的问题。

1.2 可达性分析算法

cpp 复制代码
通过一系列被称为"GC Roots"的根对象作为起始节点集,从这些节点开始,根据引用关系链向下搜索,
如果某个对象无法被搜索到,则说明该对象无引用执行,可回收。相反,则对象处于存活状态,不可回收。

JVM中的实现是找到存活对象,未打标记的就是无用对象,GC时会回收。

02.垃圾回收算法

2.1标记-清除算法

标记:Collector 从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的 Header 中记录为可达对象。标记的是引用的对象,不是垃圾!!

清除:Collector 对堆内存从头到尾进行线性的遍历,如果发现某个对象在其 Header中 没有标记为可达对象,则将其回收。

复制代码
 不足:
1效率问题:标记和清除两个过程的效率都不高。

2空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要 分配较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。

2.2 复制算法(Copying)

1将原有的内存空间分为两块,每次只使用一块,

2在垃圾回收时,将正在使用的内存中的存活对象复制到未被使用的内存块中,然后清除正在使用的内存块中的所有对象。

3交换两个内存的角色,完成垃圾回收。

2.3 标记---整理算法(Mark-Compact)

1标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的为垃圾对象

2整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界外所有的空间

标记-压缩算法

复制代码
 适合用于存活对象较多的场合,如老年代。

 它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
相关推荐
彧azz1 分钟前
Java学习语法篇:变量
java·学习
信誓旦旦的程序猿1 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)1 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt2 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei3 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩3 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
小溪学编程3 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
HZero.chen4 小时前
Java 匿名类简介
java·匿名类
用户3126874877204 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java
暖焰核心4 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript