Go Runtime vs JVM:调度、GC、反射全方位对比
Go 运行时 vs JVM 运行时 一个 JVM 调优经验丰富的开发者第一次部署 Go 服务,看到监控数据时的反应: 这进程怎么只占 4MB? -Xmx 在哪设置?GC 日志怎么看? 接着打开 top ,看到 Go 服务起了几千个 goroutine,内存和 CPU 都低得离谱。而旁边跑了类似流量的 Spring Boot 服务, -Xmx512m 、GC 日志一大堆。 这不是魔法,是 Go runtime 和 JVM 的设计哲学完全不同。本文把两个运行时的核心差异讲清楚。 📌 前置知识:本文假定读者了解 JVM 的基本运行时概念(堆/栈/GC/类加载/JIT)和 Go 的 goroutine 基础知识。Go 版本为 1.22,对比 JVM HotSpot 17/21。 进程内存:4MB vs 512MB 的真相 维度 Go JVM(HotSpot) 最小内存 ~2-4MB ~50-200MB(含堆 + 元空间) 内存控制 自动,GOGC 环境变量 -Xmx / -Xms + 大量 JVM 参数 启动时间 毫秒级(AOT 编译) 秒级(类加载 + 解释执行 + JIT 预热) 部署产物 单一静态二进制(~10-20MB) JAR(需要 JRE/JDK 运行时) 内存占用大头 goroutine 栈 + 堆 + GC 元数据 堆 + 类元数据 + JIT 代码缓存 + 线程栈 两张图看清两个运行时各自的内存里到底装了什么: ...