0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

Java代码编译方式和JVM三种执行模式 | JIT,javac

1、编译分类

1.1、前端编译

把Java源文件编译为Class文件的过程。常见的前端编译器:

  • Oracle Javac
  • Eclipse JDT中的增量式编译器(ECJ)

1.1.1、优点

  • 辅助实现了Java新语法:泛型、内部类等;
  • 编译成Class文件直接给JVM解释器执行,省去编译时间,加快启动速度。

1.1.2、缺点

  • 几乎没有做任何措施优化代码的运行效率;
  • 解释器执行效率低。

1.2、后端编译

在JVM运行时,通过内置的即时编译器(Just In Time Compiler-JIT),把Class文件字节码编译为本地机器码。

常见的后端编译器:

  • HotSpot虚拟机的C1、C2编译器。

1.2.1、优点

  • 运行时收集监控信息,把热点代码编译为本地机器码,并进行各种优化,例如:
    • 运行数据分析,把堆栈操作转换为寄存器操作;
    • 消除子表达式等
  • 大大提升了执行效率。

当使用JIT编译器是,与解释执行相比,本地机器码很容易由硬件执行,将大大提高执行速度。

1.2.2、缺点

  • 收集监控信息影响程序运行;
  • 编译过程占用时间,使得启动速度变慢等;
  • 编译过程占用内存;
  • 使用较少的diam的程序无法从即时编译中收益。

1.3、静态提前编译

Ahead Of Time AOT编译

在运行期直接把Jaa源文件编译为本地机器码。

1.3.1、优点

  • 编译不占用运行时间,加快启动速度;
  • 编译本地机器码直接保存到磁盘,不占用内存。

1.3.2、缺点

  • Java语言动态性带来了额外复杂度,影响静态编译代码的质量;
  • 此方式一般不如JIT编译的质量。

2、三种执行模式

JVM中有三种执行模式:解释执行、混合模式和编译执行,默认情况下处于混合模式。

如果想看虚拟机的执行模式,可以执行以下命令:

1
2
3
4
java -version
java version "1.8.0_71"
Java(TM) SE Runtime Environment (build 1.8.0_71-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, mixed mode)

2.1、解释执行模式

该模式下表示全部代码均是解释执行,不做任何JIT编译,如果要开启这种模式,请使用-Xint参数:

1
2
3
4
java -Xint -version
java version "1.8.0_71"
Java(TM) SE Runtime Environment (build 1.8.0_71-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, interpreted mode)

这种模式会降低运行速度,通常低10倍或者更多。

2.2、编译执行模式

该模式下不管是否热点代码,对所有的函数,都进行编译执行,如果要开启这种模式,请使用-Xcomp参数:

1
2
3
4
java -Xcomp -version
java version "1.8.0_71"
Java(TM) SE Runtime Environment (build 1.8.0_71-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, compiled mode)

JVM在第一次使用时就会把所有的字节码编译为本地代码,从而优化执行速度,绕开缓慢的解释器。但是这种模式没有让JVM启用JIT编译器的全部功能。

2.3、混合模式

JVM默认的执行模式,部分函数会解释执行,部分会编译执行。如果函数调用频率高,被反复使用,就会认为是热点代码,该函数就会被编译执行。

References

【Java】实战Java虚拟机之五“开启JIT编译”

Java编译分类:前端编译和后端编译

JVM实用参数(一)JVM类型以及编译器模式

Java编译分类:前端编译和后端编译

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法