<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jdk on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/jdk/</link><description>Recent content in Jdk on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 06 Mar 2018 00:00:00 +0000</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/jdk/index.xml" rel="self" type="application/rss+xml"/><item><title>JDK LTS版本新特性（8 / 11 / 17 / 21）</title><link>https://liangweidonggood.github.io/p/08-jdk-lts-xin-te-xing/</link><pubDate>Tue, 06 Mar 2018 00:00:00 +0000</pubDate><guid>https://liangweidonggood.github.io/p/08-jdk-lts-xin-te-xing/</guid><description>&lt;h2 id="218-jdk-lts版本新特性8--11--17--21"&gt;§2.1.8 JDK LTS版本新特性（8 / 11 / 17 / 21）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;考察意图：是否跟得上Java生态演进，知道每个LTS版本的关键变化和升级价值。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;回答样板&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;Oracle 2017年宣布6个月发布周期（3月/9月），每2年一个LTS（长期支持版本）。截至目前四个主要LTS：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JDK 8（2014.03）——革命性版本，目前仍有海量存量&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;实际价值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Lambda + Stream API&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;函数式编程，集合操作的声明式写法&lt;/td&gt;
					&lt;td&gt;Java 8的核心卖点，改变了Java编程范式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Optional类&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;优雅处理null，避免NPE&lt;/td&gt;
					&lt;td&gt;链式调用，配合orElse/orElseGet兜底&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;新的日期时间API&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;java.time包（LocalDate/LocalDateTime/Instant）&lt;/td&gt;
					&lt;td&gt;线程安全+不可变对象，替代joda-time&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;接口默认方法&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;default&lt;/code&gt;关键字，接口可提供默认实现&lt;/td&gt;
					&lt;td&gt;不破坏实现类的情况下给接口加新方法&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Metaspace替代PermGen&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;方法区移到本地内存&lt;/td&gt;
					&lt;td&gt;不再OOM: PermGen space&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CompletableFuture&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;异步编程组合能力&lt;/td&gt;
					&lt;td&gt;thenApply/thenCompose/thenCombine编排异步任务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JDK 11（2018.09 LTS）——模块化成熟、HTTP Client标准化&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;实际价值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Java Platform Module System&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;从JDK 9开始的模块化（Project Jigsaw），JDK 11达稳定&lt;/td&gt;
					&lt;td&gt;拆大单体应用、控制可访问性、&lt;code&gt;module-info.java&lt;/code&gt;声明依赖（团队小不一定需要）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;HttpClient标准化&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;java.net.http.HttpClient&lt;/code&gt;替代第三方库&lt;/td&gt;
					&lt;td&gt;原生支持HTTP/2、WebSocket、异步请求&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ZGC实验性&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;亚毫秒停顿GC&lt;/td&gt;
					&lt;td&gt;JDK 11首次引入（实验性），JDK 15生产可用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Epsilon GC&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;只分配内存不回收的&amp;quot;假GC&amp;quot;&lt;/td&gt;
					&lt;td&gt;性能基准测试、短生命周期应用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Flight Recorder开源&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JFR性能分析工具（原商业版）&lt;/td&gt;
					&lt;td&gt;零性能损耗的生产环境Profiling&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;var局部变量推导&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;var list = new ArrayList&amp;lt;String&amp;gt;()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;减少样板代码（从JDK 10开始）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;移除内容&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java EE模块（JAXB/JAX-WS）被移除&lt;/td&gt;
					&lt;td&gt;迁移要注意：旧项目升级要额外加JAXB等依赖&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;收费政策&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Oracle JDK 11起商用收费&lt;/td&gt;
					&lt;td&gt;OpenJDK免费，以此版本为分界线&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JDK 17（2021.09 LTS）——当前主流LTS，G1/GC全面成熟&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;实际价值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sealed Classes&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sealed class Shape permits Circle, Rectangle&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;受控继承，编译期保证子类列表，增强类型安全&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Pattern Matching for switch&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;switch支持类型匹配和解构（预览）&lt;/td&gt;
					&lt;td&gt;减少instanceof+强转的模板代码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Record类&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;record Point(int x, int y){}&lt;/code&gt; 一行搞定数据载体&lt;/td&gt;
					&lt;td&gt;消除getter/setter/equals/hashCode/toString（从JDK 14正式）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Text Blocks&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;...&amp;quot;&amp;quot;&amp;quot;&lt;/code&gt; 多行文本块&lt;/td&gt;
					&lt;td&gt;SQL/JSON/HTML不再用string拼接（从JDK 15正式）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;增强型伪随机数生成器&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;新接口+新算法（LXM系列）&lt;/td&gt;
					&lt;td&gt;高性能多线程随机数生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Foreign Function &amp;amp; Memory API&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;替代JNI的现代方案（孵化）&lt;/td&gt;
					&lt;td&gt;安全高效调用C/C++代码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;macOS AArch64支持&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;原生支持Apple M1/M2芯片&lt;/td&gt;
					&lt;td&gt;无需Rosetta转译&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;G1成为事实标准&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;多年打磨，大堆场景表现稳定&lt;/td&gt;
					&lt;td&gt;多数项目升级JDK 17的直接理由&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JDK 21（2023.09 LTS）——最新LTS，虚拟线程时代来临&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;实际价值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Virtual Threads（虚拟线程）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Project Loom正式落地&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;JDK 21最大卖点&lt;/strong&gt;——数百万轻量级线程，阻塞操作几乎免费。Spring Boot 3.2已集成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Pattern Matching for switch（正式）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;switch模式匹配结束预览，正式GA&lt;/td&gt;
					&lt;td&gt;类型安全+解构式编程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Record Patterns&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;嵌套解构Record对象&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;if (p instanceof Point(int x, int y) &amp;amp;&amp;amp; x &amp;gt; 0)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sequenced Collections&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;有序集合统一接口 &lt;code&gt;getFirst()/getLast()/addFirst()/addLast()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;List/Deque/SortedSet有统一的操作有序元素的API&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;String Templates（预览）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;STR.&amp;quot;Hello \{name}&amp;quot;&lt;/code&gt; 字符串模板&lt;/td&gt;
					&lt;td&gt;替代String.format和字符串拼接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Scoped Values（预览）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;线程间共享不可变数据的新方案&lt;/td&gt;
					&lt;td&gt;替代ThreadLocal部分场景（轻量、明确生命周期）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Structured Concurrency（预览）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;结构化并发，&lt;code&gt;StructuredTaskScope&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;把多个并发子任务作为一个&amp;quot;工作单元&amp;quot;管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ZGC正式支持分代&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;ZGC从单代发展为分代回收&lt;/td&gt;
					&lt;td&gt;进一步提升吞吐量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Key Encapsulation Mechanism API&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;抗量子加密（PQC）支持&lt;/td&gt;
					&lt;td&gt;面向未来的安全&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;LTS升级路径建议&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;JDK 8 ──→ JDK 11（稳妥保守派，最小迁移成本）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ──→ JDK 17（推荐跳板，G1成熟+Record+密封类）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ──→ JDK 21（激进尝鲜派，虚拟线程巨大诱惑）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际项目选型经验&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;目前主力在JDK 8上，原因是客户本地部署环境限制——很多客户只有JDK 8的授权或安全基线认证。升级到JDK 11/17的最大阻力不是技术（代码兼容性很好），而是客户的环境审批流程。但如果是新项目或云端部署，我会直接选JDK 17——Record+Sealed Classes提升代码表达力、G1比JDK 8的Parallel更稳定、长期支持到2029年。如果场景有高并发连接需求（比如Netty做数万设备同时接入），那我就选JDK 21——虚拟线程让一个TCP连接一个虚拟线程成为可能，代码模型从异步回调退化为同步写法但性能不降。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;陷阱提示&lt;/strong&gt;：把var说成&amp;quot;和JS一样动态类型&amp;quot;（var是编译期类型推断，运行时强类型）；不知道JDK 11 Oracle JDK开始商用收费；不知道ZGC不同版本的状态（实验性/生产可用/分代）；把Record和Lombok @Data简单等同（Record是不可变对象，Lombok是可变）；不知道虚拟线程和平台线程的本质区别（虚拟线程由JVM调度，不绑定OS线程）。&lt;/p&gt;</description></item><item><title>各JDK版本垃圾回收器</title><link>https://liangweidonggood.github.io/p/03-ge-jdk-ban-ben-la-ji-hui-shou-qi/</link><pubDate>Tue, 06 Mar 2018 00:00:00 +0000</pubDate><guid>https://liangweidonggood.github.io/p/03-ge-jdk-ban-ben-la-ji-hui-shou-qi/</guid><description>&lt;h2 id="213-各jdk版本垃圾回收器"&gt;§2.1.3 各JDK版本垃圾回收器
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;考察意图：了解不同回收器的设计目标、适用场景和演进历史，能根据业务场景推荐合适的回收器。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;回答样板&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;JDK发展史就是&amp;quot;降低GC停顿时间&amp;quot;的演进史——从秒级到毫秒级到亚毫秒级：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;回收器&lt;/th&gt;
					&lt;th&gt;作用区域&lt;/th&gt;
					&lt;th&gt;算法&lt;/th&gt;
					&lt;th&gt;停顿特点&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
					&lt;th&gt;JDK版本&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Serial&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;新生代&lt;/td&gt;
					&lt;td&gt;标记-复制&lt;/td&gt;
					&lt;td&gt;单线程STW，几十~几百ms&lt;/td&gt;
					&lt;td&gt;单核、Client模式、几百MB堆&lt;/td&gt;
					&lt;td&gt;1.3+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Serial Old&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;老年代&lt;/td&gt;
					&lt;td&gt;标记-整理&lt;/td&gt;
					&lt;td&gt;单线程STW&lt;/td&gt;
					&lt;td&gt;配合Serial&lt;/td&gt;
					&lt;td&gt;1.3+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Parallel Scavenge&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;新生代&lt;/td&gt;
					&lt;td&gt;标记-复制&lt;/td&gt;
					&lt;td&gt;多线程STW，吞吐量优先&lt;/td&gt;
					&lt;td&gt;批处理、科学计算&lt;/td&gt;
					&lt;td&gt;1.4+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Parallel Old&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;老年代&lt;/td&gt;
					&lt;td&gt;标记-整理&lt;/td&gt;
					&lt;td&gt;多线程STW&lt;/td&gt;
					&lt;td&gt;配合Parallel Scavenge&lt;/td&gt;
					&lt;td&gt;1.6+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;老年代&lt;/td&gt;
					&lt;td&gt;标记-清除&lt;/td&gt;
					&lt;td&gt;并发低停顿，最耗时的并发标记和并发清除阶段与用户线程并发&lt;/td&gt;
					&lt;td&gt;互联网Web应用（响应时间优先）&lt;/td&gt;
					&lt;td&gt;1.5-14&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;G1&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;整堆&lt;/td&gt;
					&lt;td&gt;标记-整理+复制&lt;/td&gt;
					&lt;td&gt;可预测停顿，Region化&lt;/td&gt;
					&lt;td&gt;JDK 9默认、大堆(&amp;gt;4G)、对停顿有要求的服务端&lt;/td&gt;
					&lt;td&gt;7u4+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ZGC&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;整堆&lt;/td&gt;
					&lt;td&gt;染色指针+并发整理&lt;/td&gt;
					&lt;td&gt;亚毫秒级停顿(&amp;lt;1ms)&lt;/td&gt;
					&lt;td&gt;超大堆(&amp;gt;16G)、极致低延迟&lt;/td&gt;
					&lt;td&gt;11+(实验) / 15+(生产)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Shenandoah&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;整堆&lt;/td&gt;
					&lt;td&gt;并发复制+Brooks转发指针&lt;/td&gt;
					&lt;td&gt;低停顿&lt;/td&gt;
					&lt;td&gt;超大堆低延迟&lt;/td&gt;
					&lt;td&gt;12+(Red Hat主导)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;CMS（Concurrent Mark Sweep）——并发低停顿的先驱&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;四个阶段：①初始标记（STW，扫描GC Roots直接引用，极快）→ ②并发标记（与用户线程并发，从GC Roots遍历整个对象图，最耗时）→ ③重新标记（STW，处理并发标记期间变动的引用，修正标记结果）→ ④并发清除（与用户线程并发）。&lt;/p&gt;
&lt;p&gt;CMS的致命缺陷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内存碎片&lt;/strong&gt;——标记-清除不整理，碎片严重时触发Serial Old全堆整理（单线程，停顿秒级）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浮动垃圾&lt;/strong&gt;——并发标记和清除期间用户线程产生的垃圾，只能等下次GC处理。需预留老年代空间给这些浮动垃圾，否则触发&lt;strong&gt;Concurrent Mode Failure&lt;/strong&gt;，降级为Serial Old&lt;/li&gt;
&lt;li&gt;JDK 14已废弃，JDK 15移除&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;G1（Garbage First）——JDK 9+默认，划时代的分区回收器&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;核心创新——将堆划分为等大小的&lt;strong&gt;Region&lt;/strong&gt;（默认2048个，每个1~32MB），不再按物理分代。Region分为Eden、Survivor、Old、Humongous四种类型。&lt;/p&gt;
&lt;p&gt;G1的混合GC（Mixed GC）：不止回收新生代，还回收部分收益最高的老年代Region——&lt;strong&gt;每次回收&amp;quot;垃圾最多的Region&amp;quot;&lt;/strong&gt;，这也是Garbage First名字的来源。&lt;/p&gt;
&lt;p&gt;关键机制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SATB（Snapshot At The Beginning）&lt;/strong&gt;：并发标记开始时的对象图快照，保证标记正确性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSet（Remembered Set）&lt;/strong&gt;：每个Region维护其他Region指向本Region的引用，避免全堆扫描&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可预测停顿&lt;/strong&gt;：&lt;code&gt;-XX:MaxGCPauseMillis&lt;/code&gt;设定目标（默认200ms），G1自动调整回收Region数量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Humongous对象&lt;/strong&gt;：超过Region大小50%的对象放入Humongous Region。大量短命大对象会引发频繁GC——需要调整Region大小或优化应用代码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;G1 vs CMS直观对比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;G1无内存碎片（标记-复制+整理），CMS有碎片问题&lt;/li&gt;
&lt;li&gt;G1停顿可预测可控，CMS的不确定性大&lt;/li&gt;
&lt;li&gt;G1的吞吐量略低于CMS（RSet维护开销），但换来更稳定的延迟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ZGC（Z Garbage Collector）——亚毫秒级停顿的终极方案&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;核心创新——&lt;strong&gt;染色指针（Colored Pointer）&lt;/strong&gt;：在64位指针中嵌入GC状态信息（共4位：Finalizable/Remapped/Marked 1/Marked 0），标记阶段不修改对象头，只修改指针颜色。结合读屏障（Load Barrier）实现并发整理——应用线程读对象时发现指针颜色不对，触发地址修正，在访问过程中完成GC。&lt;/p&gt;
&lt;p&gt;关键特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;停顿时间不随堆大小增长——16MB堆&amp;lt;1ms，16TB堆也是&amp;lt;1ms&lt;/li&gt;
&lt;li&gt;支持TB级堆、毫秒级回收、JDK 15生产可用&lt;/li&gt;
&lt;li&gt;限制：仅Linux x64；吞吐量比G1低约5-10%（读屏障开销）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;JDK版本与默认回收器对照速查&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;JDK版本&lt;/th&gt;
					&lt;th&gt;默认回收器&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 8&lt;/td&gt;
					&lt;td&gt;Parallel Scavenge + Parallel Old（吞吐量优先）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 9-16&lt;/td&gt;
					&lt;td&gt;G1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 17+&lt;/td&gt;
					&lt;td&gt;G1（LTS）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 21&lt;/td&gt;
					&lt;td&gt;G1（新一代ZGC也在成熟，但G1仍是默认）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;面试官可能会问&amp;quot;你们项目用的什么回收器，为什么？&amp;quot;&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;项目部署在JDK 8上，默认Parallel Scavenge+Parallel Old。但我们实际指定了G1——原因：①堆内存配了4-8G，G1对这个区间的优化最好；②安全生产平台是面向客户的服务端应用，客户对接口响应时间敏感，G1的可预测停顿比Parallel的吞吐量优先更适合；③大量设备数据写入导致新生代对象产生速度快，Parallel的STW时间随堆增长接近1秒，G1的停顿控制在200ms以内。上了G1后加上 &lt;code&gt;-XX:MaxGCPauseMillis=100&lt;/code&gt;调优，P99延迟从800ms降到了300ms。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;陷阱提示&lt;/strong&gt;：把G1说成简单的&amp;quot;分Region的CMS&amp;quot;；不知道CMS在JDK 14已废弃；不知道JDK 8默认是Parallel而非G1；说不出ZGC的核心创新（染色指针）；GC选型说不出业务场景理由。&lt;/p&gt;</description></item></channel></rss>