Java源文件通过javac编译为.class字节码,经JVM类加载(加载、链接、初始化)、执行引擎(解释器/JIT)运行,main方法启动后JVM存活至非守护线程结束。
Java源文件怎么变成.class字节码
你写的 .java 文件不会直接被CPU执行,必须先经过编译器处理。JDK自带的 javac 命令负责这一步:它读取源码,检查语法、类型、符号引用等,生成符合JVM规范的二进制 .class 文件。
注意几个关键点:
-
javac不做任何优化(比如内联、逃逸分析),这些留给JVM运行时做 - 一个
.java文件里可以定义多个类,但只能有一个public类,且文件名必须和它一致 - 编译后的
.class里没有注释、无用空格,但保留了部分调试信息(如行号、局部变量表),可通过-g:none关闭 - 泛型在编译期被擦除,
List和List编译后都是List
JVM加载.class文件的三个核心阶段
类加载不是简单地把字节码读进内存,而是分阶段完成的:加载(Loading)、链接(Linking)、初始化(Initialization)。其中链接又细分为验证(Verification)、准备(Preparation)、解析(Resolution)。
常见误区是认为“new对象时才加载类”——其实不一定。例如静态字段访问、反射调用、子类初始化都会触发父类加载;而单纯声明一个类引用(如 MyClass obj;)不会触发加载。
立即学习“Java免费学习笔记(深入)”;
典型问题场景: