📚
280
一杯咖啡的时间,聊聊技术与成长
咖啡养成
连载中 10/20
ZGC:亚毫秒停顿是怎么炼成的
百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。
咖啡养成
连载中 9/20
G1:把堆切成 Region 之后发生了什么
G1 不再物理分代,而是把堆划成两千多个 Region,谁垃圾多先收谁——停顿时间第一次变成可设置的参数。RSet 与混合回收,是理解 G1 的两把钥匙。
咖啡养成
连载中 8/20
经典收集器:吞吐量与停顿时间的第一次分家
Parallel 追求单位时间产量最高,CMS 追求单次停顿最短——两条路线各有代价。CMS 的四阶段并发设计很优雅,碎片与并发失败的坑也为 G1 铺了路。
咖啡养成
连载中 7/20
回收算法:清除、复制与整理的三难选择
没有完美的回收算法,只有取舍:清除省空间留碎片,复制无碎片但费内存,整理两头顾却更慢。分代收集把三种算法按对象寿命各就各位。
咖啡养成
连载中 6/20
垃圾标记:可达性分析与四种引用的分工
引用计数过不了循环引用这一关,JVM 选择了从 GC Roots 往下摸——但摸到的就都能活吗?强软弱虚四种引用各守一岗,ThreadLocal 的内存泄漏就藏在弱引用里。
咖啡养成
连载中 5/20
双亲委派:为什么类加载器要讲究先来后到
同一个 Class 文件被两个加载器加载,JVM 会当成两个不同的类——这不是 bug 是设计。三层加载器、先问爹再自己干的模型,以及那些故意打破规则的场景。
咖啡养成
连载中 4/20
类加载机制:Class 文件是怎么变成可用对象的
加载、验证、准备、解析、初始化五步各司其职——静态变量的坑大多出在"准备"和"初始化"的顺序差上。六种主动引用、一次 clinit 的线程安全,都在这篇。
咖啡养成
连载中 3/20
对象的一生:从 new 一句到被回收
new Object() 这一行背后有五道工序,对象头里藏着分代年龄与锁标志,内存布局里藏着 8 字节对齐。对象怎么生、长什么样、怎么被访问,这篇讲透。
咖啡养成
连载中 2/20
运行时数据区:堆、栈、方法区到底怎么分
StackOverflowError 和 OutOfMemoryError 天天见,但一个在栈、一个在堆——线程私有的三块和全局共享的两块,一张地图把 JVM 的地皮划分讲清楚。