📚

280

一杯咖啡的时间,聊聊技术与成长

连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 6 阅读 · 0 评论 · 0 赞
连载中 9/20

G1:把堆切成 Region 之后发生了什么

G1 不再物理分代,而是把堆划成两千多个 Region,谁垃圾多先收谁——停顿时间第一次变成可设置的参数。RSet 与混合回收,是理解 G1 的两把钥匙。

#G1收集器#Region#RSet#MixedGC#停顿模型
2026-09-15 · 4 阅读 · 0 评论 · 0 赞
连载中 8/20

经典收集器:吞吐量与停顿时间的第一次分家

Parallel 追求单位时间产量最高,CMS 追求单次停顿最短——两条路线各有代价。CMS 的四阶段并发设计很优雅,碎片与并发失败的坑也为 G1 铺了路。

#CMS收集器#Parallel#吞吐量优先#延迟优先#Concurrent Mode Failure
2026-09-14 · 59 阅读 · 0 评论 · 0 赞
连载中 7/20

回收算法:清除、复制与整理的三难选择

没有完美的回收算法,只有取舍:清除省空间留碎片,复制无碎片但费内存,整理两头顾却更慢。分代收集把三种算法按对象寿命各就各位。

#垃圾回收算法#标记清除#复制算法#标记整理#分代收集
2026-09-14 · 59 阅读 · 0 评论 · 0 赞
连载中 6/20

垃圾标记:可达性分析与四种引用的分工

引用计数过不了循环引用这一关,JVM 选择了从 GC Roots 往下摸——但摸到的就都能活吗?强软弱虚四种引用各守一岗,ThreadLocal 的内存泄漏就藏在弱引用里。

#可达性分析#GC Roots#四种引用#ThreadLocal泄漏#finalize
2026-09-13 · 160 阅读 · 0 评论 · 0 赞
连载中 5/20

双亲委派:为什么类加载器要讲究先来后到

同一个 Class 文件被两个加载器加载,JVM 会当成两个不同的类——这不是 bug 是设计。三层加载器、先问爹再自己干的模型,以及那些故意打破规则的场景。

#双亲委派#类加载器#Tomcat隔离#SPI#自定义类加载器
2026-09-13 · 153 阅读 · 0 评论 · 0 赞
连载中 4/20

类加载机制:Class 文件是怎么变成可用对象的

加载、验证、准备、解析、初始化五步各司其职——静态变量的坑大多出在"准备"和"初始化"的顺序差上。六种主动引用、一次 clinit 的线程安全,都在这篇。

#类加载机制#clinit#静态变量#初始化顺序#静态内部类单例
2026-09-12 · 170 阅读 · 0 评论 · 0 赞
连载中 3/20

对象的一生:从 new 一句到被回收

new Object() 这一行背后有五道工序,对象头里藏着分代年龄与锁标志,内存布局里藏着 8 字节对齐。对象怎么生、长什么样、怎么被访问,这篇讲透。

#对象内存布局#TLAB#对象头#对齐填充#对象访问定位
2026-09-12 · 180 阅读 · 0 评论 · 0 赞
连载中 2/20

运行时数据区:堆、栈、方法区到底怎么分

StackOverflowError 和 OutOfMemoryError 天天见,但一个在栈、一个在堆——线程私有的三块和全局共享的两块,一张地图把 JVM 的地皮划分讲清楚。

#运行时数据区#堆与栈#方法区#元空间#StackOverflowError
2026-09-11 · 172 阅读 · 0 评论 · 0 赞