Lambda 表达式

Lambda 与内部类 JDK 8 之前,要把「一段逻辑」当作参数传给方法,常见写法是匿名内部类——创建一个没有名字的类,并实现目标接口。Lambda 表达式针对其中最常见的一类场景做了简化:目标类型是函数式接口(通过 SAM 判定的接口)时,可以用 (参数) -> 表达式 代替整个匿名类。 同一件事,两种写法 以 Runnable 为例: // Runnable is an interface (not a class); SAM: single abstract method void run() // Left: Runnable r1 — variable type is the interface // Right: new Runnable() { ... } — not "new interface"; defines an anonymous class // that implements Runnable and overrides run(); compiler emits EnclosingClass$1.class Runnable r1 = new Runnable() { @Override public void run() { System.out.println("hello"); } }; // JDK 8 lambda; target type is still Runnable (functional interface) // Semantically same as the anonymous class above; often compiled via invokedynamic Runnable r2 = () -> System.out.println("hello"); 以 Comparator 为例(同样是「接口 + 匿名实现类」): ...

Created 17176-11-17 · Updated 9096-10-09 · 7 min · 1345 words · -

Rust Basic

Rust Basic Rust 是一种 AOT 编译(ahead-of-time compiled)的静态类型语言,编译型 / 解释型对照见 Compiled vs Interpreted。 Rustup Rust 的工具链管理器 Rustup 是一个命令行应用,能够下载并在不同版本的 Rust 工具链中进行切换 —— 如编译器 rustc 和标准库,该应用所支持的平台数量不少。事实上,rustc 本身就支持大约 56 个平台,而 rustup 实际上能够为其中14个平台管理编译器,为30个平台管理标准库。 Rust 1.8 中引入的 Rustup,是一个针对 Rust 语言的工具链管理器(toolchain manager),其目标是让交叉编译 Rust 代码更加简单。Mozilla 工程师 Brian Anderson 近期与我们分享了关于此的更多细节。 此外,rustup 能够追踪工具链的具体版本,包括 Rust 的 nightly 版本、beta 版本和发行版本。举个例子,你可以用 rustup 检查程序在下一个 Rust 发行版下的行为。但是之前,你需要安装当前平台下的 Rust beta 版本的工具链,然后利用该工具链运行单元测试。使用 rustup 之后,可以通过执行类似下面的代码完成: $ rustup install beta $ rustup run beta cargo test 再举一个例子,Anderson 介绍了如何使用 rustup 为使用 musl 标准库(而非大家常用的glibc标准库)的 Linux 版本创建静态二进制文件: ...

Created 1016-01-01 · Updated 9096-10-09 · 2 min · 326 words · -

Java Knowledge Map

背景 Java 相关文章分散在多篇文章中。本文用 关系图 + 索引表 串起 JVM 运行时、类加载、调试、字节码织入、生产诊断等概念,便于从一点跳到专题文。 与 BTrace 对话中沉淀的 attach / agent / ASM 链路,是下图右侧「生产诊断」分支的核心。 总览关系图 flowchart TB subgraph runtime [JVM 运行时] HS[HotSpot 简介] JVM[jvm 通用概念] CL[classloader] GC[java-gc 等] end subgraph native [Native 与通道] JVMTI[JVMTI] ATT[Attach API] JCMD[jcmd] end subgraph debug [调试与开发热更] JPDA[JPDA 远程调试] HOT[开发期热替换 DCEVM] SBDT[Spring Boot DevTools] end subgraph instrument [字节码与 Agent] INST[java.lang.instrument] ASM[java-asm] end subgraph prod [生产诊断] BTRACE[BTrace] TOOL[诊断工具选型] JFR[JFR] end HS --> CL HS --> GC HS --> ATT HS --> JVMTI JPDA --> JVMTI ATT --> INST INST --> ASM ASM --> BTRACE ATT --> BTRACE JCMD --> ATT HOT --> JPDA HOT --> ASM BTRACE --> TOOL JFR --> TOOL SBDT -.->|非 JVM HotSwap| CL 按主题索引 JVM 与 HotSpot 概念 文章 JVM 生态、实现选型 Java 虚拟机生态与选型 HotSpot 架构与站内索引 HotSpot 简介 HotSpot 启动参数 hotspot-options JIT / C1·C2 / 分层编译 hotspot-jit GC、分代(多篇) java-gc 等 Safepoint safepoint 类加载 概念 文章 双亲委托、命名空间、Agent 与业务 ClassLoader java classloader java.lang.Class(类型元信息、获取方式) lang-class Class.forName class-forname 调试体系(JPDA) 概念 文章 JPDA 三层 JDI / JDWP / JVMTI、远程调试 JAVA 调试与 JPDA JVMTI native 接口 JVMTI Attach 与内置诊断 概念 文章 Attach API、loadAgent、与 jcmd 区别 Java Attach API jcmd、Diagnostic Command jcmd 字节码、Agent、织入 概念 文章 ASM、Instrumentation、retransform、INVOKESTATIC 示意 Java ASM 与运行时字节码织入 BTrace 安装、attach、脚本、慢调用 BTrace 生产诊断工具选型(BTrace / Arthas / JFR) 生产环境诊断工具选型 JFR Java Flight Recorder 开发期热替换(非 BTrace) 概念 文章 HotSwap、DCEVM、HotSwapAgent 开发期热替换 Spring Framework 总览与演变 Spring Spring Boot DevTools Restart Spring Boot DevTools Spring Boot 总览 Spring Boot Spring IoC / 依赖注入 Spring IoC Spring Bean 生命周期 Spring Bean Lifecycle Spring WebFlux Spring WebFlux Java Virtual Threads Java Virtual Threads Spring Boot 3.x 迁移 Spring Boot 3.x Migration IDE / DCEVM 热更 vs attach 探针 见 java-asm、BTrace AOP / 其它织入 概念 文章 AspectJ 编译时织入 AspectJ CTW CGLIB、AOP cglib、aop BTrace 相关概念链(精读路径) 若从 BTrace 出发,建议按因果顺序阅读: ...

Created 31316-05-31 · Updated 11116-08-11 · 3 min · 470 words · -

Python venv, 虚拟环境与包管理工具(pdm、conda、pipx)

PDM https://pdm-project.org/zh-cn/latest/ https://juejin.cn/post/7315126100539473930 PDM 是一个支持最新 PEP 标准的现代 Python 包和依赖项管理器 PDM(Python Development Master)是一款新一代的 Python 包管理工具,旨在提供更为现代化、可靠且灵活的解决方案。与传统的 pip 和 Poetry 相比,PDM 在依赖版本管理、项目隔离和性能优化等方面展现出独特的优势。 # install pdm sudo apt install python3.10-venv curl -sSL https://pdm-project.org/install-pdm.py | python3 - # 安装程序会将 PDM 安装到用户家目录中, linux 系统 #$HOME/.local/bin Unix 系统 # 初始化项目 pdm sync # 加入新的依赖包, pdm会自动维护 pyproject.toml 文件, 但是版本范围可能需要改一下 pdm add redis # pdm install 和 pdm sync 的区别 # pdm install: 安装 pyproject.toml 中定义的所有依赖,并更新 pdm.lock(如果需要) # pdm sync: 严格按照 pdm.lock 文件安装依赖,不会更新 lock 文件,确保环境完全一致 # 推荐使用场景: # - 开发环境:使用 pdm install,允许依赖更新 # - 生产环境/CI:使用 pdm sync,确保依赖版本完全一致 pdm info --env # pdm use 切换到 Python 3.14 pdm use python3.14 pdm self update rm pdm.lock pdm lock 配置文件 pyproject.toml ...

Created 24246-11-24 · Updated 28286-07-28 · 2 min · 243 words · -

JVM HTTP 代理配置

概述 Java 程序访问外部 HTTP(S) 资源时,如果所在网络需要经过代理才能出网,可以通过系统属性告诉 JVM 走哪个代理,无需修改业务代码。本文整理常见的配置方式,并说明这些方式在现代 JDK(含 JDK 26)里是否依然有效。 经典方式:http.proxyHost / http.proxyPort java.net.URLConnection 以及后来的 java.net.http.HttpClient(JDK 11+)在没有显式指定代理时,都会使用 ProxySelector.getDefault(),而默认实现会读取以下系统属性: http.proxyHost / http.proxyPort —— HTTP 请求走的代理 https.proxyHost / https.proxyPort —— HTTPS 请求走的代理 http.nonProxyHosts —— 不走代理的主机列表,多个主机用 | 分隔 这几个属性在 JDK 26 上依然是标准、有效的配置方式。 命令行参数 java -Dhttp.proxyHost=proxy.example.com \ -Dhttp.proxyPort=8080 \ -Dhttps.proxyHost=proxy.example.com \ -Dhttps.proxyPort=8080 \ -jar app.jar 代码里设置系统属性 // Must be set before the first network call is made System.setProperty("http.proxyHost", "proxy.example.com"); System.setProperty("http.proxyPort", "8080"); 不要把代理地址硬编码在源码里,建议从配置文件读取。 Tomcat:catalina.properties 追加到 ${CATALINA_HOME}/conf/catalina.properties: ...

Created 5056-07-05 · Updated 16166-07-16 · 1 min · 205 words · -

JDK Tools: 命令行工具现状与过时工具

JDK 自带的命令行工具随着版本演进变化很大:CORBA、JAX-WS/JAXB、Java Web Start 等整套技术栈在 JDK 11 前后被移除,一批老工具也随之消失;同时 jshell、jlink、jpackage、jhsdb 等是后来才加入的。本文按「现在还在用」「名存实亡」「已从 JDK 移除」三类整理,方便判断一个工具在 JDK 26 上还值不值得用。 仍在用的核心工具 分类 工具 用途 编译与运行 java 运行 class/jar,也可直接运行单文件源码 编译与运行 javac 编译 Java 源码 编译与运行 jshell REPL,交互式执行 Java 代码(JDK 9 引入) 打包与模块 jar 打包/解包 jar 文件 打包与模块 jlink 生成裁剪后的自定义运行时镜像(JDK 9 引入) 打包与模块 jmod 创建和查看 jmod 模块文件(JDK 9 引入) 打包与模块 jpackage 生成平台原生安装包(JDK 14 引入,见下文 javapackager 的替代) 签名与安全 jarsigner jar 签名与验证 签名与安全 keytool 密钥、证书管理 文档与静态分析 javadoc 生成 API 文档 文档与静态分析 javap 反汇编 class 文件 文档与静态分析 jdeps 分析类/模块依赖关系(JDK 8 引入) 文档与静态分析 jdeprscan 扫描代码中用到的已废弃 API(JDK 9 引入) 文档与静态分析 jnativescan 扫描 FFM API(java.lang.foreign)受限方法调用(JDK 22 引入) 诊断与监控 jcmd 向运行中的 JVM 发送诊断命令,官方现在推荐的统一入口,详见 jcmd 诊断与监控 jconsole 图形化 JMX 监控 诊断与监控 jfr Flight Recorder 命令行工具,详见 Java Flight Recorder 诊断与监控 jhsdb HotSpot Serviceability Agent 统一入口,整合了旧版 jsadebugd/SA 调试功能(JDK 9 引入) 诊断与监控 jps 列出本机 JVM 进程 诊断与监控 jstat / jstatd JVM 统计信息采集 / 远程统计信息服务 诊断与监控 jwebserver 内置的简单静态文件 HTTP 服务器(JDK 18 引入) 调试 jdb 命令行调试器 RMI rmiregistry RMI 远程对象注册表 脚本 jrunscript 命令行脚本外壳工具,见下文「名存实亡」 其它签名工具 serialver 生成 serialVersionUID Windows 专属 javaw 不弹控制台窗口运行 Java 程序 Windows 专属 jabswitch / jaccessinspector / jaccesswalker Java Access Bridge 开关与辅助功能检查工具 Kerberos kinit / klist / ktab Kerberos 票据与密钥表管理 名存实亡:还在但不建议依赖 这几个工具没有被移除,仍出现在最新 JDK 的工具列表里,但官方已经不建议把它们当作首选: ...

Created 6066-02-06 · Updated 16166-07-16 · 3 min · 475 words · -

VisualVM: 线程与堆内存监控分析工具

VisualVM 是什么 VisualVM 是一个图形化的 JVM 监控与分析工具,可以查看应用程序的 CPU、内存占用,监控线程状态,生成线程转储(Thread Dump)或堆转储(Heap Dump),跟踪内存泄漏,监控垃圾回收,并支持简单的 CPU/内存 profiling。它也能浏览和操作 MBean,配合 JMX 做远程监控。 VisualVM 曾在 JDK 6 Update 7 之后随 Sun/Oracle JDK 一起分发;从 JDK 9 起被移出 JDK 发行包,独立成开源项目 visualvm.github.io,需要单独下载安装,本身要求 JDK 8 及以上运行,但可以监控 JDK 1.4 以上版本的目标进程。 安装与启动 从 visualvm.github.io 下载对应平台的安装包,解压后运行 visualvm(Windows 下是 visualvm.exe)。 如果 VisualVM 找不到本机 JDK,用 -jdkhome 显式指定: visualvm -jdkhome /path/to/jdk 插件默认安装在用户目录下,例如 Windows: %APPDATA%\VisualVM\<version> 线程监控与 Thread Dump 启动 VisualVM 后,“应用程序 > 本地” 节点会列出本机正在运行的 Java 进程。双击目标进程,切换到「线程」标签页,可以看到各线程的实时状态跟踪。 点击「线程 Dump」按钮会生成当前时刻的线程转储文件,里面包含每个线程的调用栈、锁等待对象等信息,用来定位线程阻塞、死锁的位置;关于线程转储的字段含义与死锁排查方法,参考 jstack。 VisualVM 线程状态 状态 说明 Running 正在运行 / 可运行(runnable) Sleeping 线程调用了 Thread.sleep() Wait 线程处于 wait 或 timed_waiting Park 线程调用了 LockSupport.park() Monitor 线程被 monitor 锁阻塞(blocked) 远程监控 VisualVM 也可以通过 JMX 或 jstatd 监控远程 JVM 进程,思路和本地类似,多了一步网络连接配置。 ...

Created 4046-11-04 · Updated 16166-07-16 · 2 min · 245 words · -

Java Thread.join() 原理与用法

join() 是做什么用的 join() 定义在 Thread 类里,作用是让当前线程等待另一个线程结束。谁调用了 t.join(),谁就会阻塞,直到线程 t 执行完毕才继续往下走。 容易搞混的一点是"谁等谁":t.join() 阻塞的不是 t 自己,而是执行这行代码所在的那个线程。 为什么需要 join() 典型场景:主线程启动一个子线程去做耗时运算,主线程处理完自己手头的事情后,需要用到子线程算出来的结果——这时就要用 join(),等子线程真正跑完再继续,否则可能拿到还没算完的结果。 用例子理解 写三个类来演示:CustomThread1 循环打印 5 次、每次间隔 1 秒;CustomThread 在 run() 里调用了 t1.join(),要等 t1 跑完才继续;JoinTestDemo 是入口。 class CustomThread1 extends Thread { public CustomThread1() { super("[CustomThread1] Thread"); } @Override public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start."); try { for (int i = 0; i < 5; i++) { System.out.println(threadName + " loop at " + i); Thread.sleep(1000); } System.out.println(threadName + " end."); } catch (InterruptedException e) { System.out.println("Exception from " + threadName + ".run"); } } } class CustomThread extends Thread { private final CustomThread1 t1; public CustomThread(CustomThread1 t1) { super("[CustomThread] Thread"); this.t1 = t1; } @Override public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start."); try { t1.join(); System.out.println(threadName + " end."); } catch (InterruptedException e) { System.out.println("Exception from " + threadName + ".run"); } } } public class JoinTestDemo { public static void main(String[] args) throws InterruptedException { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start."); CustomThread1 t1 = new CustomThread1(); CustomThread t = new CustomThread(t1); t1.start(); Thread.sleep(2000); t.start(); t.join(); // main thread waits for t to finish System.out.println(threadName + " end!"); } } main 线程先启动 t1,睡 2 秒后再启动 t,最后调用 t.join() 等 t 结束。执行顺序大致是: ...

Created 13136-01-13 · Updated 16166-07-16 · 2 min · 401 words · -

HotSpot

背景 OpenJDK 发行版里默认的 Java 虚拟机实现是 HotSpot(C++)。你安装的 java 命令、容器里的 JDK 镜像,除非明确换用 OpenJ9 或 GraalVM Native Image,否则跑的就是 HotSpot。 Java 领域还有哪些 JVM,见 Java 虚拟机。 HotSpot 是什么 HotSpot 得名于 热点探测(hot spot detection):大部分时间只执行少量代码,JIT 优先编译这些热点方法。内置 解释器、C1 与 C2 两个 JIT 编译器,默认通过 分层编译 在启动速度与峰值性能之间折中。 对比 HotSpot Eclipse OpenJ9 GraalVM Native Image 典型形态 OpenJDK 默认 java IBM Semeru native-image 产物 JIT C1 + C2 自有 JIT 构建期 AOT,无运行时 JIT 常用诊断 jcmd、JFR、Attach 自有工具 与传统 JVM 排障不同 历史 HotSpot 的技术 lineage 来自 Self / Strongtalk 一脉的动态编译与热点探测。Longview Technologies(对外也称 Animorphic)1994 年成立,1997 年 2 月被 Sun 收购;收购后 Sun 在其 VM 技术上为 Java 编写更强的 JIT(C2 等),因运行时持续探测并优化热点代码而得名 HotSpot。 ...

Created 31316-05-31 · Updated 16166-07-16 · 3 min · 507 words · -

HotSpot JIT 编译器(C1/C2)

背景 OpenJDK 默认的 HotSpot 虚拟机通过 解释器 + 即时编译(JIT) 执行字节码:冷代码先解释运行,热点方法再编译为本地机器码。本文归纳 C1/C2 分工、分层编译与热点探测;JDK 21 之后的 AOT 预热见 JDK 25 变更汇总。 C1 与 C2 HotSpot 内置两个 JIT 编译器,历史上也称 Client 编译器 与 Server 编译器,对应 C1 与 C2: 编译器 特点 C1 编译快,做简单、可靠的优化 C2 编译慢,做更重的优化,会依据运行时 profile 做激进优化 二者都只编译 热点代码(多次调用的方法,或多次执行的循环体),编译前须先做热点探测。 Client/Server 两套 VM 的划分在 64 位 JDK 上已基本消失:现代 HotSpot 统一走 Server VM,并通过 分层编译 把 C1 的快速启动与 C2 的峰值性能结合起来(见下一节)。 分层编译(Tiered Compilation) 自 Java 7 起,Server VM 默认启用 分层编译(-XX:+TieredCompilation,一般无需手动开)。HotSpot 用 5 个执行级别 在解释器与两个编译器之间过渡: ...

Created 30306-03-30 · Updated 16166-07-16 · 2 min · 354 words · -

Java 虚拟机

背景 日常说的「JVM」常混用两层含义: JVM 规范(JLS/JVMS):字节码、class 文件格式、类加载语义、JNI、JPDA 等,与具体实现无关。 JVM 实现:真正把字节码跑起来的运行时,如 HotSpot、OpenJ9。 安装 java 命令得到的是 JDK 发行版(见 OpenJDK JDK 发行版;安装命令见 openjdk),其中默认捆绑的虚拟机实现几乎都是 HotSpot。本文介绍 JVM 实现(HotSpot、OpenJ9、GraalVM Native 等)的差异与选型;HotSpot 的参数与工具见 hotspot。 JDK 发行版 vs JVM 实现 Temurin、Corretto、Dragonwell 等是不同厂商打包的 OpenJDK 发行版,默认都跑 HotSpot,不是三种并列的 JVM。换 Temurin 换 Corretto,通常只是换构建源与支持方;要换虚拟机实现才看 OpenJ9(Semeru)或 GraalVM Native Image。发行版对照见 openjdk-distributions.md。 规范层:各实现共同遵守什么 无论用哪种 JVM,下列概念在规范层是共通的: 概念 说明 字节码 javac 产出 .class,由虚拟机解释或 JIT 编译后执行 类加载 加载、链接、初始化;双亲委托等模型见 classloader JNI Java 与本地代码互操作规范,见 java-jni JPDA 调试体系(JDI / JDWP / JVMTI),见 java-debug-JPDA 规范 不 规定用哪种垃圾收集器、有哪些 -XX 开关、是否提供 JFR——这些是实现细节。 主流 JVM 实现对照 实现 典型发行版 特点 适用场景 HotSpot Oracle JDK、Temurin、Corretto、Dragonwell 等 生态最全;C1/C2 JIT、G1/ZGC/Shenandoah、JFR、jcmd、Attach 默认可用 默认首选;绝大多数服务端与桌面应用 Eclipse OpenJ9 IBM Semeru 常更低内存占用、较快启动;工具链与 HotSpot 不同 容器密度高、内存敏感;需验证 agent/诊断工具兼容性 GraalVM GraalVM CE/EE 可嵌 HotSpot 作 JIT 运行时,或通过 Native Image AOT 为本地可执行文件 极致冷启动(serverless、CLI);见 GraalVM 简介、Native Image JRockit 已停止独立发展 曾用于金融低延迟;特性已并入 HotSpot 仅作历史了解,见 jrockit ┌─────────────────────────────────┐ │ Java 语言 + JVM 规范 │ └─────────────────────────────────┘ │ ┌───────────────────────────┼───────────────────────────┐ ▼ ▼ ▼ OpenJDK HotSpot Eclipse OpenJ9 GraalVM (默认 java 命令) (Semeru 等) ┌──────┴──────┐ │ │ ▼ ▼ │ │ HotSpot 运行时 Native Image ▼ ▼ (JIT) (AOT 本地二进制) jcmd / JFR / Attach 自有诊断工具 选型建议 没有明确理由时,用 HotSpot(即常见 OpenJDK 发行版)。文档、agent、APM、排障经验都围绕它积累最多。 内存或启动是瓶颈,且已验证依赖(Attach、部分 agent、GC 日志格式)在目标环境可用,可评估 OpenJ9。 冷启动极敏感(函数计算、短生命周期进程),评估 GraalVM Native Image(见 GraalVM 简介、Native Image);需接受构建期分析、反射配置、动态类加载受限等成本。 不要混用概念:GraalVM 不等于「又一个 HotSpot」;Native Image 路径下没有传统 JIT 预热,也没有完整的 -XX 调优空间。 HotSpot 执行路径(概念) HotSpot 的典型路径(细节见专文): ...

Created 19196-05-19 · Updated 15156-07-15 · 2 min · 308 words · -

HotSpot JVM 启动参数

背景 本文汇总 OpenJDK HotSpot 常用启动参数(-、-X、-XX)。这些开关 不是 JVM 规范的一部分,其他实现(OpenJ9 等)名称与语义可能不同。 JVM 生态选型见 jvm;HotSpot 架构索引见 hotspot。GC 算法细节见 java-gc;JIT 与分层编译见 hotspot-jit。 参数分类 HotSpot 命令行参数分三类: 类型 前缀 说明 标准参数 - 规范要求所有实现支持,如 -version 非标准参数 -X 实现相关,如 -Xms、-Xmx;不保证跨版本兼容 不稳定参数 -XX HotSpot 专有调优项,可能无预警变更或移除 查看当前生效的 HotSpot 参数: java -XX:+PrintCommandLineFlags -version java -XX:+PrintFlagsFinal -version | grep -i gc 堆与元空间 堆大小 参数 别名 说明 -Xms<size> -XX:InitialHeapSize 初始堆大小;常与 -Xmx 设相同,避免运行期扩堆 -Xmx<size> -XX:MaxHeapSize 最大堆大小 -Xmn<size> -XX:NewSize 等 年轻代大小(eden + 2×survivor);显式设置会干扰 G1 等区域自适应,现代应用更常用比例或交给 G1 自动调整 <size> 可用 k/m/g(如 -Xmx2g)。 ...

Created 19196-06-19 · Updated 15156-07-15 · 3 min · 442 words · -

Spring AOT

是什么 Spring AOT(Ahead-Of-Time)是 Spring Framework 6 / Spring Boot 3 引入的构建期处理机制:在打包或 Native 编译之前,对 Spring ApplicationContext 做静态分析,生成预先计算好的 bean 定义、反射/资源 hint,以及(可选)面向 GraalVM Native Image 的入口代码。 默认 Spring Boot 应用在运行时做 classpath 扫描、@Configuration 解析、条件装配(@Conditional / @ConditionalOn*)和大量反射;Spring AOT 把这些工作尽量前移到构建期,使: 在 HotSpot JVM 上跑的处理后 JAR,启动更快(仍用 java -jar) 在 GraalVM Native Image 路径上,构建器能拿到闭世界分析所需的元数据 不要和 JDK AOT 混淆 博客与 JDK 发行说明里还有另一类「AOT」,含义不同: 名称 层级 做什么 Spring AOT Spring 框架 / Boot 插件 构建期处理 IoC 容器,生成 bean 与 Native hint GraalVM Native Image AOT GraalVM 工具链 字节码 → 本地机器码 + Substrate VM JDK AOT 缓存(JEP 483 等) HotSpot JVM 训练运行后缓存类加载/链接/剖析,缩短下次 JVM 冷启动 Spring AOT 常与 GraalVM Native Image 配合使用,但不是同一 thing;JDK 24+ 的 AOT 缓存与 Spring AOT 可以并存,也互不替代。JDK 侧见 JDK 25 变更汇总、JVM 编译器。 ...

Created 21216-06-21 · Updated 15156-07-15 · 3 min · 596 words · -

JDK 1.4

JDK 1.4(J2SE 1.4)于 2002 年 2 月发布。对外称 Java 2 Platform, Standard Edition 1.4;命名体系与后续演变见 Java 版本历史。 1.4 GA 后,下一代 Tiger(JDK 5) 的语言特性即在 JCP 并行规划——含 JSR 175 注解(2002 年 3 月立项),并非等 1.4 维护多年后才起步。详见 JDK 5 §发布历程。 注意:jdk14.md 记录的是 JDK 14(2020),与本文的 JDK 1.4 不是同一版本。 版本号说明 维度 JDK 1.4 平台品牌 J2SE 1.4 java.version 1.4.2_19 等 class major version 48 下一版本 JDK 5 完整命名演变见 Java 版本历史。 概览 语言 assert 断言(-source 1.4 编译,运行时 -ea 开启) 类库 java.util.regex 正则表达式(详见 分组与捕获) NIO(java.nio):Buffer、Channel、Selector、内存映射文件 java.util.logging(JUL,Java 原生日志,见 commons-logging 与 log4j、jcl-over-slf4j) java.util.prefs Preferences API(用户/系统配置持久化) URI 与 URL 区分(java.net.URI) 链式异常(Throwable.initCause()) Image I/O、Java Web Start、Sound API 等 JVM 与性能 HotSpot 成为唯一 VM(1.4.0 起移除 Classic VM;HotSpot 自 JDK 1.3 起已是默认实现,见 HotSpot) Parallel Scavenge 新生代收集器(1.4.0);1.4.1 起 GC 调优选项增强(见 Java GC) 1.4.2 引入自旋锁(-XX:+UseSpinning,见 Java Lock) 工具与诊断 JPDA(Java Platform Debugger Architecture)架构完善 assert 断言 JDK 1.4 在语言层新增 assert 关键字,用于开发/测试阶段的条件检查;默认关闭,生产环境通常不启用。语法、-ea / -da 运行参数及设计取舍详见 Java assertion。 ...

Created 20206-06-20 · Updated 15156-07-15 · 3 min · 461 words · -

JDK 1.0

JDK 1.0 于 1995 年 5 月 23 日由 Sun Microsystems 正式发布,是 Java 语言与平台的第一个对外产品版本。命名与后续演变见 Java 版本历史。 1.0 之前还有别的「版本」吗? 没有更早的对外编号版本。 在 1.0 之前只有 Sun 内部的研发代号与预览构建,不算正式产品线: 阶段 时间(约) 说明 Green 项目 1991 起 Sun 内部面向消费电子设备的研究项目 Oak 1991~1995 语言与运行时的内部代号(James Gosling 等) 更名 Java 1995 初 因商标冲突放弃 Oak,改用 Java Alpha / Beta 1995 上半年 面向开发者的预览版,供 Applet 等场景试用 JDK 1.0 1995-05 首个公开发布、可商用的 JDK 因此讨论「Java 最早版本」时,1.0 就是起点;Oak、Alpha、Beta 是开发史里的名称,不是 0.x 或更早的正式版本号。下一版为 JDK 1.1(1997 年 2 月)。 版本号说明 维度 JDK 1.0 对外名称 Java 1.0 / JDK 1.0 java.version 1.0.x class major version 45(1.0.2 起常见为 45.3) 下一版本 JDK 1.1 概览 1.0 已经具备今天仍熟悉的核心语言形态:类与接口、继承、包、final / static / synchronized、异常(含 checked exception)、数组、基本类型与 String。标准库规模很小——大约 212 个类、8 个包,许多今天常用的 API 尚未出现。 ...

Created 20206-06-20 · Updated 15156-07-15 · 2 min · 324 words · -

JDK 1.1

JDK 1.1 于 1997 年 2 月 19 日发布,是 JDK 1.0 之后的首个重要更新。1.0 以 Applet 与 AWT 打开知名度,1.1 则补上了企业开发所需的一批基础能力:数据库、远程调用、反射、序列化、JAR 打包等。命名与后续演变见 Java 版本历史。 版本号说明 维度 JDK 1.1 对外名称 Java 1.1 / JDK 1.1 java.version 1.1.x class major version 45(minor 3,即 45.3) 上一版本 JDK 1.0 下一版本 JDK 1.2(1998-12,集合框架与 Swing) 概览 语言 内部类(nested classes):成员内部类、局部内部类、匿名内部类、静态嵌套类(详见 Java 内部类) 类库与规范 反射(java.lang.reflect):运行时检查类、方法、字段并调用 JDBC(java.sql):标准数据库访问 API,Java 进入服务端开发的入口之一 RMI(java.rmi):远程方法调用 JavaBeans(java.beans):组件化与 IDE 工具链约定 对象序列化(java.io.Serializable 等):对象持久化与网络传输 JAR(Java ARchive):类与资源的打包格式,配套 jar 命令 国际化(java.util.Locale、ResourceBundle 等)与 Unicode 文本流(Reader / Writer) java.text:日期、数字格式化 java.math:BigDecimal、BigInteger AWT 委托事件模型(delegation event model):用监听器(如 ActionListener)替代 1.0 的 handleEvent() 继承式写法;GUI 代码结构变化较大,属于不兼容的 API 调整 JVM 与性能 引入 JIT 编译器(因平台而异),热点 bytecode 可编译为本地代码,性能较 1.0 纯解释执行明显提升 类卸载(class unloading)等运行时能力增强 仍为 Sun 早期 JVM;HotSpot 要到 1.3 才成为默认实现 工具 jar:打包与解包 JAR serialver:查看序列化类的 serialVersionUID jdb 等调试工具随 JDK 增强 1.1 尚未具备(后续版本才加入) 能力 大致引入版本 Swing、集合框架(HashMap 等) 1.2 java.lang.ref(软/弱/虚引用) 1.2 HotSpot 默认 VM 1.3(1.4 起唯一,见 HotSpot) assert、NIO、标准正则 1.4 泛型、enum、for-each、JUC 5 内部类 1.0 只有顶层类;1.1 起可在类或方法内部定义嵌套类,为回调、封装 helper、匿名监听器等场景提供语法支持: ...

Created 20206-06-20 · Updated 15156-07-15 · 3 min · 487 words · -

JDK 1.3

JDK 1.3(对外称 Java 2 Platform, Standard Edition, v1.3,代号 Kestrel)于 2000 年 5 月 8 日发布,是 JDK 1.2 之后又一次以运行时为核心的升级——最重要的变化不在语言语法,而在 JVM 本身:HotSpot 从此成为默认 VM。命名与后续演变见 Java 版本历史。 版本号说明 维度 JDK 1.3 对外名称 Java 2 SE 1.3 / JDK 1.3 代号 Kestrel java.version 1.3.x class major version 47 上一版本 JDK 1.2 下一版本 JDK 1.4 概览 JVM:HotSpot 成为默认 VM 这是 1.3 最重要的变化。HotSpot 早在 1999 年 4 月就以独立产品 Java HotSpot Performance Engine 发布,可配合 JDK 1.2 使用,但当时不是默认项;JDK 1.3 起 HotSpot 成为默认 VM,旧的 Classic VM 仍可通过参数选用,直到 JDK 1.4 才被彻底移除。详见 HotSpot。 ...

Created 14146-07-14 · Updated 15156-07-15 · 3 min · 437 words · -

JDK 1.2

JDK 1.2(对外称 Java 2 Platform, Standard Edition, v1.2,代号 Playground)于 1998 年 12 月 8 日发布,是 JDK 1.1 之后的一次「平台级」大版本——类库规模扩大近三倍(约 1520 个类、59 个包),并首次启用 Java 2 品牌。命名与后续演变见 Java 版本历史。 版本号说明 维度 JDK 1.2 对外名称 Java 2 SE 1.2 / JDK 1.2 代号 Playground java.version 1.2.x class major version 46 上一版本 JDK 1.1 下一版本 JDK 1.3 「Java 2」中的 2 指平台代际(1.2 这次大改),并非版本号跳到了 2.0;这一代还拆出了 J2SE / J2EE / J2ME 三个平台方向。完整命名脉络见 Java 版本历史。 概览 语言 strictfp 关键字:约束浮点运算严格遵循 IEEE 754,保证跨平台一致性;这个「严格模式 vs. 默认模式」的区分后来被认为没必要,JDK 17 的 JEP 306 让所有浮点运算恢复为始终严格,strictfp 从此变成没有实际效果的保留字(详见下文「与现代 Java 的关系」) 类库 集合框架(java.util.Collection / List / Set / Map 等):统一的容器体系,ArrayList、HashMap、HashSet 等新增实现;1.0/1.1 的 Vector、Hashtable 被改造为实现 List / Map 接口以便互操作(详见 Collection List Set Map 区别) Swing(javax.swing)并入核心,与 AWT、Java 2D、Accessibility、Drag and Drop 一起构成 JFC(Java Foundation Classes) java.lang.ref:软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference),配合 ReferenceQueue 提供比 finalize() 更可控的对象回收前/回收后通知机制 Java 2D API(java.awt.geom 等):矢量图形、坐标变换、复杂渲染 拖放 API(java.awt.dnd):跨组件、跨应用的拖放交互 Accessibility API(javax.accessibility):屏幕阅读器等辅助技术支持 Java IDL(org.omg.CORBA):内置 CORBA ORB,是后续 RMI-IIOP(JDK 1.3)的基础 安全模型重写:java.security.Policy / ProtectionDomain 引入细粒度、可配置的权限模型,取代 1.1「Applet 沙箱 vs. 本地代码完全信任」的二元划分 Java Plug-in:让浏览器脱离自带(常常过时)的 JVM,改用独立安装、可控版本的 JRE 运行 Applet JVM 与性能 内置改进版 JIT 编译器——但仍是 Classic VM 自带的实现,不是 HotSpot(HotSpot 此时尚未发布,详见下文「与 HotSpot 的关系」) 默认虚拟机依旧是 Classic VM;HotSpot 要到 JDK 1.3 才成为默认项 1.2 尚未具备(后续版本才加入) 能力 大致引入版本 HotSpot 成为默认 VM 1.3 RMI 可选兼容 CORBA IIOP 1.3 JNDI 并入核心 1.3 assert、NIO、标准正则 1.4 泛型、enum、for-each、JUC 5 集合框架 1.0/1.1 只有 Vector、Hashtable、Stack 等各自为政的容器类,缺少统一抽象。1.2 引入的集合框架用一组接口(Collection、List、Set、Map)加多种实现(ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap)统一了这块: ...

Created 14146-07-14 · Updated 15156-07-15 · 3 min · 536 words · -

JDK 7

JDK 7(Java SE 7)于 2011 年 7 月发布,是 Java 6 之后的一次重要版本更新。相对 JDK 6,主要变化集中在语言语法、NIO 文件 API、并发框架、JVM/GC 和诊断工具几方面。 概览 语言与编译器 钻石操作符(Diamond Operator)<> try-with-resources 自动资源管理 多异常捕获(multi-catch) switch 支持 String 二进制整数字面量(0b 前缀) 数字字面量中的下划线 类库 NIO.2(java.nio.file):Path、Files、目录遍历、WatchService 异步 I/O:AsynchronousSocketChannel 等 并发增强:ForkJoinPool、Phaser、LinkedTransferQueue、ThreadLocalRandom JDBC 4.1 invokedynamic 与 Method Handles(JSR 292,为 JVM 动态语言与后续 Lambda 铺路) JVM 与 GC G1 垃圾收集器(6u14 起实验性提供,7u4 起转为正式支持) 字符串常量池从 PermGen 移至 Java Heap 64 位 HotSpot 默认启用 Compressed Oops 工具与诊断 jcmd 与 Diagnostic Command 框架(见 Attach API) VisualVM 随 JDK 分发 钻石操作符 泛型实例化时,若右侧类型参数可从左侧声明推断,可省略重复的类型参数,写 <>: ...

Created 25256-03-25 · Updated 14146-07-14 · 3 min · 521 words · -

JDK 9

JDK 9(Java SE 9)于 2017 年 9 月 21 日发布。相对 JDK 8,最重要的变化是 Java 平台模块系统(JPMS),以及 java.version 去掉前导 1.(JEP 223)。版本号背景见 Java 版本历史。 版本号说明 维度 JDK 8 JDK 9 java.version 1.8.0_xxx 9、9.0.1 等 里程碑 对外 Java 8、对内仍 1.x 对外与系统属性一致 详见 Java 版本历史。 概览 平台与模块化 Java 平台模块系统(JPMS,Project Jigsaw) jlink:定制运行时镜像 jmod:模块打包格式 基于模块的 Runtime 镜像 语言与 API JShell(REPL) 接口 private 方法 集合工厂方法(List.of、Set.of、Map.of 等) Stream API 增强(takeWhile、dropWhile、iterate) Optional 增强 Process API 改造 VarHandle、Stack-Walking API 多版本 JAR(Multi-Release JARs) HTTP/2 Client(孵化) JVM、GC 与工具 G1 成为默认 GC 移除 JDK 8 标记过时的 GC 组合(JEP 214);CMS 被标记废弃(JEP 291) 统一 JVM 日志(Unified JVM Logging) 从 JDK 中移除 Java EE / CORBA 等模块(改由外部维护) Compact Strings(内部字符串存储优化) 模块系统(JPMS) JDK 9 引入 module-info.java 描述模块依赖与导出包,目标是强封装、可裁剪的运行时: ...

Created 5056-01-05 · Updated 14146-07-14 · 2 min · 421 words · -