Java 10 新特性概览
局部变量类型推断 var编译器推断类型,不是无类型。不能用于字段、方法参数、Lambda 形参(后续版本逐步放宽)。可读性规则:右侧类型明显时用 var,否则写显式类型。 G1 并行 Full GC减少 Full GC 停顿极端情况下的单线程整理时间。仍应尽量避免 Full GC,而非依赖此优化。 其他Unmodifiable List.copyOf、Optional.orElseThrow 无参版本、应用程序类数据共享(CDS)改进。版本非 LTS,多数企业从 11/17 跳过。 课堂外的思考学习「Java 10 新特性概览」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬编。讨论后把新认识补进笔记末尾。 可复现实验为每个主题保留最小复现:一段可运行...
Java 9 新特性概览
模块系统 JPMSmodule-info.java 声明 requires/exports,解决 JDK 9 起 classpath 上「什么都可见」的封装问题。迁移大型项目可先强封装 JDK 内部 API 使用,再逐步模块化。 JShell交互式 REPL,适合验证小片段。生产代码仍要正经测试,但学习 API 效率极高。 其他印象点接口私有方法;集合工厂 of/ofEntries;G1 成为默认 GC;Process API 改进。HTTP/2 Client incubating 到 11 正式。 实践尝试把一个小库拆成 module,体会「exports 包」与反射 opens 的差异。 课堂外的思考学习「Java 9 新特性概览」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原...
《Java8 指南》中文翻译
学习定位Oracle Java 8 教程系统讲了 Lambda、Stream、日期时间、Nashorn 等。本文只记录自学脉络,不搬运译文:把教程当索引,每个主题配合 JSR 与 JEP 原文验证。 日期时间迁移java.time 取代 Date/Calendar:Instant 时间点、ZonedDateTime 带时区、Duration/Period 区分时间与日期差。旧 API 通过 atZone/ toInstant 互转。 接口演进default/static 方法让接口可演进而不破坏实现类。Collector 接口与 Stream 终端操作紧密相关。 建议读完教程章节后,用 JShell(Java 9+)快速验证 API,比只看文档记得牢。 课堂外的思考学习「《Java8 指南》中文翻译」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事...
Java8 新特性实战
Lambda 本质函数式接口 + invokedynamic 生成 lambda 元工厂。方法引用是语法糖:String::length 等价 x -> x.length()。 Stream 心智中间操作惰性,终端操作触发流水线。parallelStream 仅在无共享可变状态、计算密集且数据量大时考虑。 Optional 别滥用用于返回值表达缺省,不要作为字段或参数链式堆砌。orElseGet 传 Supplier 避免无谓构造。 组合示例1234567List<String> tops = orders.stream() .filter(o -> o.amount() > 100) .map(Order::customerName) .distinct() .sorted() .limit(10) .toList(); 课堂外的思考学习「Java8 新特性实战」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做...
Java 新特性专题:Java 8 到 Java 26 重要特性梳理
版本节奏Java 6 个月一版,LTS(8、11、17、21)值得长期跟进。非 LTS 预览特性可能调整,生产启用需评估。 学习策略Java 8 函数式与 Stream 是基础;11 起 HTTP Client、var;17 密封类与模式匹配;21 虚拟线程与分代 ZGC;后续版本关注字符串模板、结构化并发等预览项。 实践方式每版选 1–2 个能在当前项目落地的特性做小 spike,比通读 Release Notes 更有效。 课堂外的思考学习「Java 新特性专题:Java 8 到 Java 26 重要特性梳理」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬编。讨论后把新认识补进笔记末尾。 可复现实验为每个主题保留最小复现:一段可运行的 Java 片段、一条...
Java 后端线上问题排查:CPU、内存、GC、线程池、数据库与 Redis
CPU 100%先 top -Hp 找线程 tid,转 16 进制后 jstack 定位栈帧。常见:正则灾难、无限循环、GC 线程忙、线程池任务过重。 内存泄漏堆曲线单调上涨,Full GC 后不回落。MAT 看 Leak Suspects, dominator 找保留大对象的路径,重点怀疑静态集合、ThreadLocal、缓存无上限。 联动中间件慢 SQL 导致连接池占满,表现为线程 BLOCKED;Redis 超时堆积任务队列。排查要跨层证据链,不要只盯 JVM。 清单保留 GC 日志、开启 OOM heap dump、线程池命名、限流熔断,比事后 MAT 更值钱。 课堂外的思考学习「Java 后端线上问题排查:CPU、内存、GC、线程池、数据库与 Redis」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文...
2026 最新 JVM 面试题总结:内存区域、类加载、垃圾回收与线上排查
内存区域答法线程私有:PC、栈、本地方法栈;共享:堆、方法区(JDK8 元空间)。直接内存不属于运行时数据区但常一起考。 对象创建五步类加载检查 → 分配内存(指针碰撞/空闲列表)→ 零值初始化 → 设置头信息 → init 方法。逃逸分析可能栈上分配或标量替换。 GC 追问Safe Point 与 STW;G1 Remembered Set 跨区引用;ZGC 着色指针与读屏障。答收集器要绑定停顿目标与堆大小。 排查题「频繁 Full GC」从元空间、老年代晋升、System.gc、大对象直接进老年代四条线展开。 课堂外的思考学习「2026 最新 JVM 面试题总结:内存区域、类加载、垃圾回收与线上排查」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬...
Java内存区域详解(重点)
线程私有区PC 寄存器记录字节码行号;虚拟机栈存栈帧(局部变量表、操作数栈);本地方法栈服务 native。StackOverflowError 栈深度超限,OutOfMemoryError 无法扩展栈。 线程共享区堆存放对象实例与数组;方法区存类元数据、常量、静态变量,JDK8 后用 Metaspace 实现。 对象一定在堆吗逃逸分析后可能未逃逸对象栈上分配,或标量替换拆成字段。这是优化,不是规范保证。 直接内存NIO DirectByteBuffer 使用堆外内存,受 MaxDirectMemorySize 约束,回收依赖 Cleaner/GC 触发。 课堂外的思考学习「Java内存区域详解(重点)」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬...
JVM垃圾回收详解(重点)
判定与算法引用计数(Java 不用)、可达性分析;标记-清除、复制、标记-整理。分代假设:大部分对象朝生夕灭,老年代长寿命。 常见收集器Serial/Parallel 关注吞吐;CMS 低停顿已过时;G1 分区 + 可预测停顿;ZGC/Shenandoah 超低延迟,适合大堆。 参数起点-XX:+UseG1GC,-Xms=-Xmx 避免堆伸缩,-XX:MaxGCPauseMillis 设期望停顿。观察 GC 日志再调 InitiatingHeapOccupancyPercent。 记忆点Minor GC 清理 Young;Full GC 通常整堆+方法区,频率过高是告警信号。 课堂外的思考学习「JVM垃圾回收详解(重点)」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 pri...
JDK监控和故障处理工具总结
命令速查 jps -l:列 JVM 进程 jstat -gcutil pid 1s:GC 占比实时看 jmap -dump:live,file=heap.hprof pid:堆转储 jstack pid:线程栈与死锁 JDK9+ 推荐 jcmd 统一入口:jcmd pid VM.native_memory summary。 可视化VisualVM、JMC 飞行录制分析 CPU 热点;Async-profiler 生成火焰图定位 native/Java 栈。 流程CPU 高 → top -H + jstack 找热点线程;内存涨 → 对比两次 heap dump;GC 频繁 → 看 allocation rate 与 survivor 晋升。 课堂外的思考学习「JDK监控和故障处理工具总结」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老...