Java编译到执行的过程
Java编译到执行的过程
执行过程:
编译→加载→解释→执行
运行过程
.Java→.class→装载到JVM→.class→可执行指令→调用系统硬件执行最终指令
详细过程
- 编译过程 包括语义分析\语法分析\注解处理, 这些过程处理完之后才生成字节码.class文件, 一般对于泛型擦除\注解处理在这个阶段处理.
- 加载过程 将.class字节码文件加载值JVM中, 加载过程包括装载\连接\初始化, 为节省内存开销, .class并不会一开始就被全加载到JVM中, 而是等到需要时候的才进行加载. .class文件通过类加载器装载到JVM, 为防止内存中出现多份同样的字节码, 使用了双亲委派机制(不会自己去尝试加载类, 把请求委托给父类加载器完成, 依次向上请求).
- 装载 加载类的二进制数据→在JVM堆中创建java.lang.Class类对象→类信息存储在JVM方法区
- 连接 对class信息进行验证, 为类变量分配内存空间并赋默认值 验证→准备→解析
- 初始化 为类的静态变量赋予正确的初始值
- 解释过程 字节码→操作系统可以识别的机器指令码
- 字节码解释器
- 即时编译器JIT, 把热点代码的指令码保存起来, 下次执行无需重复解释, 直接执行缓存的机器语言.
- JVM对 热点代码做编译, 非热点代码直接进行解释, 当JVM发现某个方法或代码块运行频繁时, 会把这部分代码认定为热点代码.(热点探测或计数器, 方法调用计数器和回边计数器)
- 执行过程 操作系统执行最终程序指令, 调用硬件执行解释器解析出的指令码
结合理解画图