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 采用解释器+即时编译器混合模式共同执行程序。



相关文章
|
2天前
|
消息中间件 Java 应用服务中间件
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转
|
1天前
|
消息中间件 存储 算法
JVM实战—3.JVM垃圾回收的算法和全流程
本文详细介绍了JVM内存管理与垃圾回收机制,涵盖以下内容:对象何时被垃圾回收、垃圾回收算法及其优劣、新生代和老年代的垃圾回收算法、Stop the World问题分析、核心流程梳理。
JVM实战—3.JVM垃圾回收的算法和全流程
|
2天前
|
消息中间件 Java 应用服务中间件
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
|
3月前
|
NoSQL Java Redis
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
116 10
|
4月前
|
存储 IDE Java
实战优化公司线上系统JVM:从基础到高级
【11月更文挑战第28天】Java虚拟机(JVM)是Java语言的核心组件,它使得Java程序能够实现“一次编写,到处运行”的跨平台特性。在现代应用程序中,JVM的性能和稳定性直接影响到系统的整体表现。本文将深入探讨JVM的基础知识、基本特点、定义、发展历史、主要概念、调试工具、内存管理、垃圾回收、性能调优等方面,并提供一个实际的问题demo,使用IntelliJ IDEA工具进行调试演示。
71 0
|
5月前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
5天前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
JVM简介—1.Java内存区域
|
2月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
654 166
|
4天前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
4月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
804 1