垃圾回收器Garbage Collector

本文深入探讨了Java虚拟机的内存区域,包括程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。重点介绍了垃圾回收的基础,如引用计数和可达性分析算法,以及强软弱虚引用的概念。文章还详细阐述了几种垃圾收集算法,如标记-清楚、复制、标记整理和分代收集,并解释了它们的工作原理和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要学习了《深入理解Java虚拟机:JVM高级特性与最佳实践》的第三章
本文简直就是读书笔记,求作者不要撕我

程序计数器(PC)、虚拟机栈(java)、本地方法栈(native)
线程私有,内存分配和回收具备确定性
e.g.栈帧Stack Frame进入和退出有条不紊,类结构确定下来时就已知内存

Java堆、方法区(逻辑堆)
线程共享,内存多样,运行时才可知
分配和回收是动态的,垃圾回收器关注的是这部分内存

1.对象已死吗
(原文标题不错就不改了)
1)引用计数算法Reference Counting
顾名思义,ref即为生命(被引用+1,失效-1)
简单,高效,but难以解决对象间相互引用的问题「死锁Dead Lock」

2)可达性分析算法Reachability Analysis
「路由Routing」「图论」「树」
这里写图片描述
GC Root(根),引用链Reference Chain(茎)
通过父节点指针上查,根不可达则out

3)强软弱虚引用
如何描述一些“食之无味,弃之可惜”的对象
强:Object obj = new Object(),never被回收
软:内存溢出异常前触发救场,in danger被回收
弱:生存到next time垃圾回收
虚:回收时,收到系统通知(较无关)

*4)不可达缓刑
「e.g.死亡时间Dead Time」
finalize() – 然而设计的并不好

*5)回收方法区

2.垃圾收集算法
1)标记-清楚算法Mark-Sweep
标记=前述「对象已死吗」判定
效率不高,内存碎片

2)复制算法Coping
这里写图片描述
大小等块,50%”浪费”

98%新生代朝生夕死,HotSpot Eden 8 : Survivor 1
每次使用Eden和一块Survivor(90%),将其中还存活着的复制到另外一块Survivor上(10%,”浪费”)

「分配担保Handle Promotion」
若另一块Survivor空间不够时,则通过分配担保(借钱)机制直接进入老年代

猴子也能懂:侥幸生还,不够借钱

3)标记整理算法Mark-Compact
顾名思义,存活的对象向一端移动并堆叠,清理掉边界以外的

4)分代收集算法Generational Collection
「分类讨论」
新生代Coping
老年代Mark-Sweep、Mark-compact

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值