- Java Virtual Machine Tutorial
- JVM - Home
- JVM - Introduction
- JVM - Architecture
- JVM - Class Loader
- JVM - Runtime Data Areas
- JVM - The JIT Compiler
- JVM - Compilation Levels
- JVM - 32b vs. 64b
- JVM - JIT Optimisations
- JVM - Garbage Collection
- JVM - Generational GCs
- JVM - Tuning the GC
- JVM - Memory Leak in Java
- Java Virtual Machine Resources
- JVM - Quick Guide
- JVM - Useful Resources
- JVM - Discussion
Java 虚拟机 - 编译级别
JVM 支持五个编译级别 -
- 口译员
- 全面优化的 C1(无分析)
- 具有调用和后沿计数器的 C1(轻型分析)
- C1 具有完整的分析
- C2(使用前面步骤中的分析数据)
如果您想禁用所有 JIT 编译器并仅使用解释器,请使用 -Xint。
客户端与服务器 JIT
使用 -client 和 -server 激活各自的模式。
客户端编译器 (C1) 比服务器编译器 (C2) 更早开始编译代码。因此,当 C2 开始编译时,C1 已经编译了代码段。
但在等待期间,C2 会分析代码,比 C1 更了解代码。因此,如果优化抵消了它等待的时间,则可以用来生成更快的二进制文件。从用户的角度来看,需要在程序的启动时间和程序运行所需的时间之间进行权衡。如果启动时间很重要,则应使用 C1。如果应用程序预计运行很长时间(通常是部署在服务器上的应用程序),最好使用 C2,因为它生成更快的代码,从而大大抵消任何额外的启动时间。
对于 IDE(NetBeans、Eclipse)和其他 GUI 程序等程序,启动时间至关重要。NetBeans 可能需要一分钟或更长时间才能启动。当 NetBeans 等程序启动时,会编译数百个类。在这种情况下,C1编译器是最好的选择。
请注意,C1 - 32b 和 64b有两个版本。C2 仅出现在64b中。
分层编译
在 Java 的旧版本中,用户可以选择以下选项之一 -
- 口译员 (-Xint)
- C1(-客户端)
- C2(-服务器)
它来自 Java 7。它使用 C1 编译器启动,随着代码变得越来越热,切换到 C2。可以使用以下 JVM 选项激活它:-XX:+TieredCompilation。默认值在 Java 7 中设置为 false ,在 Java 8 中设置为 true。
在五层编译中,分层编译使用1 -> 4 -> 5。