TAG

#JVM

共 15 篇文章

TLAB 与指针碰撞分配:HotSpot 线程本地分配缓冲区的生命周期与调优

本文聚焦 HotSpot 的 TLAB 机制,解释为何小对象分配通过指针碰撞完成,以及 TLAB 大小如何影响分配效率与 GC 停顿。通过高并发服务场景,分析 TLAB 初始化、分配流程、慢路径分配、参数调优及其与逃逸分析的关系,帮助读者理解并优化 Java 应用的对象分配性能。

G1 GC 字符串去重:哈希表维护与并发去重的性能边界

本文聚焦 G1 GC 的字符串去重功能,解释其如何通过共享字符数组降低堆内存占用,并分析并发去重线程与 SATB 的交互、哈希表维护机制,以及 -XX:+UseStringDeduplication 和 -XX:StringDeduplicationAgeThreshold 参数。读者将获得根据内存收益和 CPU 开销决定是否启用去重的判断方法。

HotSpot C2 自动向量化:Superword 算法如何将循环转换为 SIMD 指令

为什么有的循环能被 JVM 自动向量化,有的却不能?本文以数组求和与元素变换为贯穿场景,剖析 HotSpot C2 编译器 Superword 算法的基本步骤,解释循环展开、内存对齐、无别名等关键条件,并给出编写可向量化代码的实用指导,同时对比自动向量化与手写 SIMD 的权衡。

HotSpot C2 方法内联的决策机制:阈值、调用深度与去虚拟化

本文分析 HotSpot C2 编译器如何根据方法大小、调用频率和调用深度决定内联,解释为何某些热点方法未被内联,并演示如何通过 -XX:MaxInlineSize 等参数优化。以微服务中频繁调用的工具方法为贯穿场景,介绍内联收益与成本、虚方法去虚拟化技术,以及使用 -XX:+PrintInlining 诊断内联失败的方法,帮助读者平衡编译时间与运行时性能。

Shenandoah GC 并发疏散与 Brooks 指针:如何在不暂停应用的情况下移动对象

Shenandoah GC 通过并发疏散机制将对象移动与 Java 线程并行执行,从而将停顿时间控制在亚毫秒级。本文聚焦 Brooks 指针与读屏障如何实现“移动对象时不暂停应用线程”这一核心问题,以高并发 Web 服务在大型堆下的停顿优化为场景,逐步展开并发标记、并发疏散、引用更新等阶段的工程细节,并与 ZGC 进行对比,为读者提供吞吐与延迟之间权衡的决策依据。

JVM 分层编译的层级选择:C1/C2 编译器协作与预热期性能优化

分析 HotSpot 分层编译的五个执行层级,解释为何方法在 C1 编译后可能被 C2 重新编译,以及如何通过 -XX:TieredStopAtLevel 控制编译策略。以微服务启动后预热期的性能抖动为贯穿场景,讨论编译阈值、Profiling 数据收集、去优化机制,并与 Graal JIT 进行对比。读者将掌握根据延迟和吞吐需求调整编译层级的参数,并理解为何短生命周期方法不适合 C2 编译。

偏向锁的撤销与废弃:从 JEP 374 看同步优化演进

本文分析偏向锁在 Java 15 中被默认禁用并最终移除的工程原因,聚焦高并发下撤销开销如何抵消收益。以线程池频繁争用的同步块性能诊断为贯穿场景,解释偏向锁的获取、撤销、批量重偏向与批量撤销流程,并结合 JEP 374 的决策依据,说明现代应用为何应避免依赖偏向锁,以及如何通过 JFR 和锁分析工具诊断同步性能。

AppCDS 与类数据共享:JVM 启动提速的内部机制

本文深入解读类数据共享(CDS)与应用类数据共享(AppCDS)的内存映射原理,通过一个多实例微服务场景贯穿全文,回答如何有效降低多实例环境下的内存占用与启动时间。文章基于 JEP 310、JEP 350 及官方文档,详细说明共享归档的生成、使用、动态归档机制、常见失败模式及调优指南,并提供与替代方案的对比。