Java 平台历代特性
Created|Updated|Java
|Word Count:16|Reading Time:1mins|Post Views:
Java 9 模块化,JDK 只依赖于 PATH 不依赖于 CLASSPATH。
Author: magicliang
Link: https://magicliang.github.io/2020/03/01/Java-%E5%B9%B3%E5%8F%B0%E5%8E%86%E4%BB%A3%E7%89%B9%E6%80%A7/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2026-04-19
Java栈帧省略机制详解:为什么异常堆栈会消失?
引言:诡异的异常堆栈消失现象 线上服务报错时,你打开日志准备排查问题,却发现异常堆栈信息神秘消失了: 1java.lang.NullPointerException 只有短短一行异常类名,没有完整的堆栈跟踪。你可能会怀疑:是日志框架出问题了?还是被什么拦截器截断了? 其实,这是 JVM 的一个性能优化机制,叫做 OmitStackTraceInFastThrow(快速抛出时省略堆栈跟踪)。从 JDK 5 开始引入,默认启用。 本文将深入剖析这个机制的设计动机、工作原理、触发条件,以及如何正确应对。 一、问题场景:异常堆栈去哪了? 1.1 复现现象 用一段简单的代码就能复现: 123456789101112public class ExceptionOmitDemo { public static void main(String[] args) { String msg = null; for (int i = 0; i < 500000; i++) { try { ...
2026-05-21
写一个 lambda 规约器
上一篇文章把 lambda 演算拆成三种表达式:变量、函数、调用。示例只做了最小的一步替换,用来说明函数应用可以变成表达式重写。 本文把这件事补成一个规约器:给定一个 lambda 表达式,持续执行 beta 规约,打印每一步轨迹,并处理替换过程中最容易出错的变量捕获问题。这个规约器仍然很小,但已经具备解释器和 AST 重写器的基本骨架。 规约器要解决什么 lambda 演算的核心计算规则是 beta 规约: 12(x -> body) argument -> body 中的自由 x 替换成 argument 例如: 12(x -> x) a -> a 更复杂一点的例子: 123(((x -> (y -> x)) a) b) -> ((y -> a) b) -> a 规约器需要完成三件事: 职责 作用 找到可规约位置 判断哪一个调用先执行 做安全替换 只替换自由变量,避免误改绑定变量 重复执行 直到表达式无法继续变化 这和解释器很接近。区别在于解释器通常维护环境和值,lambda 规约器直...

2026-05-14
缓存系统设计全景——从原理到生产的完整指南
缓存是提升系统性能的第一利器,但也是引发故障的第一杀手。从缓存穿透、击穿、雪崩三大经典问题,到多级缓存架构、分布式锁、热点 Key 治理,缓存设计几乎贯穿后端工程师的整个职业生涯。 本文将系统性地剖析缓存系统的设计原则与生产实践,从单机进程内缓存到分布式 Redis 集群,从理论模型到可落地的代码方案,构建一套完整的缓存知识体系。 Part 1: 缓存的本质与适用场景 什么是缓存 缓存是一种以空间换时间的优化技术,通过在计算代价较高的数据源(数据库、外部服务等)和消费方之间插入高速存储层,减少重复计算的执行次数。 存储介质延迟对比 存储介质 访问延迟 吞吐量 成本 CPU L1 Cache ~1 ns — 极高 CPU L3 Cache ~10 ns — 高 内存(RAM) ~100 ns ~10 GB/s 中 SSD ~100 μs ~500 MB/s 低 HDD ~10 ms ~100 MB/s 极低 网络(同机房) ~500 μs — — 网络(跨机房) ~50 ms — — 内存访问比 SSD 快 1000 倍,比 HDD ...

2025-07-29
Java 集合框架完全指南
Java 集合框架完全指南 本文系统性地介绍 Java 集合框架的核心概念、实现原理和设计模式。内容涵盖集合框架体系结构、列表与队列机制、哈希表家族的扩缩容策略、缓存淘汰算法实现以及系统级扩缩容设计。通过深入分析源码实现和性能特征,帮助理解各集合类的适用场景和最佳实践。 第一章:全景导图 文章结构 模式总览 模式名 口诀 覆盖场景 扩容因子1.5倍 扩容1.5倍,平衡空间时间 ArrayList扩容、StringBuilder扩容 队列六操作 add/offer/put,peek,poll/take 所有队列实现的标准操作 优先级堆 小顶堆TopK,大顶堆调度 PriorityQueue、任务调度 延迟队列 getDelay负值出队,compareTo排序 DelayQueue、缓存过期、订单超时 扰动函数 高16异或低16,分散哈希冲突 HashMap哈希优化 2的幂容量 位运算取余,快速计算索引 HashMap、ConcurrentHashMap 树化阈值8 泊松分布概率,红黑树优化 HashMap性能优化 反树化阈值6 低于阈值退...
2022-01-12
Java中的条件编译
一个流传已久的传说 在中文 Java 圈子里有这样一段传说:Google(或某家硅谷大厂)有一种「Java 条件编译」技术,可以在同一份源码里写「测试开关打开时才走的代码」,非生产流水线编译时整段代码都在,可以照常调试;上了生产、关掉开关,被 if 包围的那段 Java 代码就会被编译器当成死代码,从字节码里直接抹掉,线上绝对跑不到。 这段传说混杂了三个独立的问题: Java 是否真的存在「if 块在生产编译时从字节码消失」这种机制? 这是 Google 独有的私货,还是标准 Java 的能力? 如果代码真的被编译器去除,那调试还能怎么做? 回答它们需要三种证据:JLS §14.21、§13.4.9、§15.28 的规范条文给出语言契约;一组可复现的 javap 字节码实验给出实证;feature switch 工业谱系(javac 死代码消除、BuildConfig.DEBUG + R8、Manifold 预处理器、AspectJ 类加载织入、OpenFeature 运行时开关、HotSpot C2 运行时死分支折叠)给出工程参照系。 文中代码示例基准 Java 8,字节...
2026-02-07
G1/ZGC/Shenandoah 垃圾收集器对比
垃圾收集的核心挑战 垃圾收集器的设计始终面临三个核心指标的权衡:吞吐量、延迟和内存占用。这三个指标构成了一个不可能三角,优化其中一个指标往往需要牺牲其他指标。 吞吐量指单位时间内完成的工作量,通常用应用程序运行时间占总时间的比例来衡量。对于批处理任务、科学计算等场景,高吞吐量是首要目标。 延迟指垃圾收集造成的应用停顿时间。对于交互式应用、金融交易系统等对响应时间敏感的场景,低延迟至关重要。延迟通常关注最大停顿时间和停顿时间分布。 内存占用指垃圾收集器为了完成收集工作所需的额外内存空间。内存受限的环境下,收集器自身的内存开销成为关键约束。 传统垃圾收集器在三者之间做出明确取舍:Serial 和 Parallel GC 追求高吞吐量,但停顿时间较长;CMS GC 降低停顿时间,但牺牲吞吐量并占用更多内存。现代收集器试图在三者之间找到更优的平衡点。 G1(Garbage First)收集器 G1 收集器在 JDK 7u4 版本正式推出,是 JDK 9 之后的默认垃圾收集器。G1 的核心思想是打破传统分代收集的物理隔离,将堆内存划分为多个大小相等的 Region。 Region 化堆内存...
Announcement
人生只是,守株待兔
