. 从零到跑起一个 Java 程序
-
OS 创建进程
execve java …
→ 新进程的地址空间、handle、时间片就位。 -
Java Launcher 进场
可执行文件里的 C/C++ 的main()
解析参数,dlopen libjvm.so / jvm.dll
。 -
JNI_CreateJavaVM
诞生 JVM 实例
△ 分配堆、元空间、代码缓存等
△ 拉起 GC / JIT / 信号处理等守护线程 -
把 Launcher 的原生线程变成 Java main 线程
开始执行你写的public static void main
。 -
后续线程
你new Thread
或线程池建的用户线程 + JVM 自带 daemon 线程,一起跑到进程终结。
2. “一进程-一 JVM-多线程”的本质
-
进程:最粗的隔离——互不共享内存与句柄。
-
JVM 实例:运行时系统,本质是进程里的大型本地库 ➜ 只要进程结束,JVM 必然随之消亡。
-
线程:真正执行字节码/本地码的单位;现代 JVM 1:1 映射 OS 内核线程,由 OS 调度。
3. 线程共享/独享的内存区
私人 | 公共 |
---|---|
程序计数器 (PC) | Java 堆(对象) |
Java 虚拟机栈 | 元空间 / 常量池(类蓝图) |
本地方法栈 | 代码缓存(JIT 机器码) |
—— | 直接内存、MappedByteBuffer |
—— | 进程级资源:文件描述符、Socket 等 |
口诀:栈私有、堆共享;类定义与 JIT 代码也只有一份。多线程并行时,用
synchronized
/Lock
/volatile
等原语保证安全。
4. 何时退出?
-
只要还有 非 daemon 线程活着,JVM 不会
exit
。 -
当只剩守护线程,JVM 调
System.exit
;OS 回收进程,全部资源清空。