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



相关文章
|
1天前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
12 1
|
3天前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
|
5天前
|
存储 缓存 监控
深入JVM:解析OOM的三大场景,原因及实战解决方案
深入JVM:解析OOM的三大场景,原因及实战解决方案
|
13天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
38 3
|
19天前
|
存储 缓存 安全
JVM(三)-运行时数据区(栈、程序计数器)
JVM(三)-运行时数据区(栈、程序计数器)
13 2
|
20天前
|
运维 Java Shell
手工触发Full GC:JVM调优实战指南
本文是关于Java应用性能调优的指南,重点介绍了如何使用`jmap`工具手动触发Full GC。Full GC是对堆内存全面清理的过程,通常在资源紧张时进行以缓解内存压力。文章详细阐述了Full GC的概念,并提供了两种使用`jmap`触发Full GC的方法:通过`-histo:live`选项获取存活对象统计信息,或使用`-dump`选项生成堆转储文件以分析内存状态。同时,文中也提醒注意手动Full GC可能带来的性能开销,建议在生产环境中谨慎操作。
|
4天前
|
存储 缓存 算法
详解JVM内存优化技术:压缩指针
详解JVM内存优化技术:压缩指针
|
4天前
|
存储 缓存 监控
深入解析JVM内存分配优化技术:TLAB
深入解析JVM内存分配优化技术:TLAB
|
28天前
|
存储 Java 编译器
【JavaEE初阶】 JVM 运行时数据区简介
【JavaEE初阶】 JVM 运行时数据区简介
|
3天前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
10 0