JVM技术实战-预习一下编译器的运行模式

简介: JVM技术实战-预习一下编译器的运行模式

JIT即时编译器指定使用C1和C2


参数设置


HotSpot JVM 内置了两个JIT编译器,分别是Client Compiler(C1编译器)和Server Compiler(C2编译器),可通过下列指令显式指定使用哪种即时编译器


-client 指定java虚拟机运行在client模式下,并使用C1编译器


特点:C1编译器会堆字节码进行简单和可靠的优化,耗时短。以达到更快的编译速度。


-server 指定java虚拟机运行在server模式下,并使用C2编译器


特点:C2进行较长时间的优化,以及激进优化。但优化的代码执行效率更高。



C1和C2编译器的优化策略不同


C1主要有方法内联,去虚拟化,冗余消除


  • 方法内联:将引用函数代码编译到引用点处,这样可以减少栈帧的生成,减少参数传递以及跳转过程


  • 去虚拟化:对唯一的实现类进行内联


  • 冗余消除:在运行期间,把一些不会运行的代码折叠掉


C2的优化主要是在全局层面,逃逸分析是优化的基础,基于逃逸分析在C2上有如下几种优化-

  • 标量替换:用标量值替换聚合对象的属性值


  • 栈上分配:对于未逃逸的对象分配对象在栈而不是堆


  • 同步消除:清除同步操作,通常指synchronized



分层编译策略:


程序解释执行(不开启性能监控)可以触发C1编译,将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化


当显式指定了-server时,默认开启分层编译策略,由C1编译器和C2编译器相互协作共同来执行编译任务



此外


在JDK10之后Hotspot又加入了一个全新即时编译器:Graal编译器,目前处于实践状态,可以通过-XX:+UnlockExperimentalVMOptions,-XX:+UseJVMCICompiler 去激活,才可以使用

JDK9版本引入了AOT编译器(Ahead of time compiler 静态提前编译器),AOT编译工具jaotc,它借助Graal编译器,将所输入的java类文件转换成机器码,并存放至生成动态共享库之中,所谓的AOT编译,是与即时编译相对立的一个概念,即时编译指的是在程序的运行过程中,将字节码转换为可在硬件上直接运行的机器码,并部署至托管环境中的过程,而AOT编译指的是,在程序运行前,便将字节码转换为机器码的过程;




好处


java虚拟机加载已经与编译成二进制库,可以直接运行。不必等即时编译器的预热,减少java应用第一次运行慢的体验


缺点


破坏了java“一次编译到处运行”,必须为每个不同硬件,os编译对应的发行包,降低了java链接过程的动态性,加载的代码在编译器就全部已知;还需要继续优化中,最初只支持Linux X64 java base




java如何设置程序的执行方式(编译执行和解释执行)


java程序的执行方式可分为解释执行和jit即时编译执行,默认情况下这两种执行方式是并存的,也可以显式的为java虚拟机指定在运行时到底是完全采用解释器执行还是完全采用即时编译器执行。


参数设置:


  • -Xint  完全使用解释器模式执行程序;


  • -Xcomp 完全采用即时编译器模式执行程序。如果即时编译出现问题,解析器会介入执行;


  • -Xmixed 采用解释器+即时编译器混合模式共同执行程序。



相关文章
|
3月前
|
Java 编译器 Linux
JVM/编译器/CPU,究竟谁是卧底?一个曾经困扰我一个月的 bug
任何复杂的系统都可能因为一个小小的疏漏而无法运转,本文记录了一个困扰作者一个月的 bug 最终拨云见日的过程。
|
12天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
16天前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
42 2
|
17天前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
32 3
|
17天前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
25 3
|
17天前
|
安全 Java API
🌟探索Java宇宙:深入理解Java技术体系与JVM的奥秘
本文深入探讨了Java技术体系的全貌,从Java语言的概述到其优点,再到Java技术体系的构成,以及JVM的角色。旨在帮助Java开发者全面了解Java生态,提升对Java技术的认知,从而在编程实践中更好地发挥Java的优势。关键词:Java, JVM, 技术体系, 编程语言, 跨平台, 内存管理。
27 2
|
3月前
|
消息中间件 设计模式 安全
多线程魔法:揭秘一个JVM中如何同时运行多个消费者
【8月更文挑战第22天】在Java虚拟机(JVM)中探索多消费者模式,此模式解耦生产与消费过程,提升系统性能。通过`ExecutorService`和`BlockingQueue`构建含2个生产者及4个消费者的系统,实现实时消息处理。多消费者模式虽增强处理能力,但也引入线程安全与资源竞争等挑战,需谨慎设计以确保高效稳定运行。
87 2
|
3月前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用
|
17天前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
29 4
|
17天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
38 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS