JVM原理及调优(3)——编译机制

Java JVM原理与性能调优:从基础到高级应用 优先理解业务:不同应用类型(Web/计算/批处理)需要不同策略数据驱动决策:基于监控数据而非猜测进行调优循序渐进:每次只调整一个参数并观察效果权衡取舍:吞吐量 vs 延迟 vs 内存占用。 阅读详情

系列文章规划:

  1. JVM原理及调优(1)——内存模型
  2. JVM原理及调优(2)——内存管理
  3. JVM原理及调优(3)——编译机制
  4. JVM原理及调优(4)——类加载机制
  5. JVM原理及调优(5)——垃圾回收和调优
  6. JVM原理及调优(6)——G1收集器及G1日志分析
  7. JVM原理及调优(7)——JDK常用内置工具

JVM只能够识别Class文件,Java源文件需要经过编译器编译生成字节码文件。

1. 编译

在 Java 中提到“编译”,自然很容易想到 javac 编译器将.java文件编译成为.class文件的过程,这里的 javac 编译器称为前端编译器,其他的前端编译器还有诸如 Eclipse JDT 中的增量式编译器 ECJ 等。相对应的还有后端编译器,它在程序运行期间将字节码转变成机器码(现在的 Java 程序在运行时基本都是解释执行加编译执行),如 HotSpot 虚拟机自带的 JIT(Just In Time Compiler)编译器(分 Client 端和 Server 端)。另外,有时候还有可能会碰到静态提前编译器(AOT,Ahead Of Time Compiler)直接把*.java文件编译成本地机器代码,如 GCJ、Excelsior JET 等,这类编译器我们应该比较少遇到。

javac 编译简要过程:

  • 词法、语法分析

    词法分析是将源代码的字符流转变为标记(Token)集合。单个字符是程序编写过程中的的最小元素,而标记则是编译过程的最小元素,关键字、变量名、字面量、运算符等都可以成为标记,比如整型标志 int 由三个字符构成,但是它只是一个标记,不可拆分。

    语法分析是根据Token序列来构造抽象语法树的过程。抽象语法树是一种用来描述程序代码语法结构的树形表示方式,语法树的每一个节点都代表着程序代码中的一个语法结构,如 bao、类型、修饰符、运算符等。经过这个步骤后,编译器就基本不会再对源码文件进行操作了,后续的操作都建立在抽象语法树之上。

  • 填充符号表

    完成了语法分析和词法分析之后,下一步就是填充符号表的过程。符号表是由一组符号地址和符号信息构成的表格。符号表中所登记的信息在编译的不同阶段都要用到,在语义分析(后面的步骤)中,符号表所登记的内容将用于语义检查和产生中间代码,在目标代码生成阶段,党对符号名进行地址分配时,符号表是地址分配的依据。

  • 语义分析

    语法树能表示一个结构正确的源程序的抽象,但无法保证源程序是符合逻辑的。而语义分析的主要任务是读结构上正确的源程序进行上下文有关性质的审查。语义分析过程分为标注检查和数据及控制流分析两个步骤:

    • 标注检查步骤检查的内容包括诸如变量使用前是否已被声明、变量和赋值之间的数据类型是否匹配等。
    • 数据及控制流分析是对程序上下文逻辑更进一步的验证,它可以检查出诸如程序局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等问题。
  • 字节码生成

    字节码生成是 javac 编译过程的最后一个阶段。字节码生成阶段不仅仅是把前面各个步骤所生成的信息转化成字节码写到磁盘中,编译器还进行了少量的代码添加和转换工作。 实例构造器()方法和类构造器()方法就是在这个阶段添加到语法树之中的(这里的实例构造器并不是指默认的构造函数,而是指我们自己重载的构造函数,如果用户代码中没有提供任何构造函数,那编译器会自动添加一个没有参数、访问权限与当前类一致的默认构造函数,这个工作在填充符号表阶段就已经完成了)。

2. 类文件结构

Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部都是程序运行的必要数据。根据 Java 虚拟机规范的规定,Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表。无符号数属于基本数据类型,以 u1、u2、u4、u8 来分别代表 1、2、4、8 个字节的无符号数。表是由多个无符号数或其他表作为数据项构成的符合数据类型,所有的表都习惯性地以“_info”结尾。

整个 Class 文件本质上就是一张表,它由如下所示的数据项构成。

这里写图片描述

从表中可以看出,无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会在其前面使用一个前置的容量计数器来记录其数量,而便跟着若干个连续的数据项,称这一系列连续的某一类型的数据为某一类型的集合,如:fields_count 个 field_info 表数据便组成了方法表集合。这里需要注意的是:Class 文件中各数据项是按照上表的顺序和数量被严格限定的,每个字节代表的含义、长度、先后顺序都不允许改变。

参考文献

  1. 深入理解 Java 虚拟机
JVM原理讲解和调优 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 阅读详情

相关推荐

JVM调优(保姆级总结)

JVM原理初探 原理初探: HelloWorld是如何编译运行的? 1.Javac命令是通过Java同居转换成字节码文件,因为计算机是不认识javac的只认识0101。 2.通过Java虚拟机编译字节码文件 3.再把Java字节码文件进入对应JVM JVM组成 总结: 问题一:JVM的组成? 1.类加载子系统 2.JVM运行时数据区 3.指定引擎 在main方法中运行输出以及调用其他方法输出结果,这是由谁执行的? 可以在mian方法中进行debag调试,发现是

m0_52348758的博客 2323

深入了解JVM:编译执行、类加载机制,内存管理等

JVM常见原理JVM(Java Virtual Machine)是Java程序的运行环境,它是一个虚拟的计算机,它可以在不同的操作系统上运行Java程序。JVM负责将Java程序编译后的字节码解释成机器码并执行,同时提供了垃圾回收、内存管理等功能。JVM的编译执行Java代码编译成字节码Java源代码首先被编译成字节码,字节码是一种中间代码,它可以在任何平台上运行。Java编译器将Java源代码编译成字节码,然后将字节码存储在.class文件中。字节码解释执行JVM将字节码解释成机器指令执行。

洛阳泰山的博客 1362

深入理解JVM:从原理到实战调优

JVM是Java程序运行的核心环境,其内存结构主要包括方法区、堆、虚拟机栈、程序计数器和本地方法栈。JVM通过垃圾回收机制自动管理内存,采用分代收集算法针对不同生命周期对象使用不同回收策略(如标记-清除、标记-复制等)。现代JVM提供多种垃圾回收器选择,包括注重吞吐量的Parallel GC、低延迟的G1/ZGC/Shenandoah等。JVM采用双亲委派模型加载类,通过解释执行和JIT编译混合运行字节码。实际调优需关注内存配置(-Xms/-Xmx)、GC参数选择和代码优化,推荐使用G1/ZGC并配合监控工

码道源码 1655

深入理解JVM—字节码编译机制

  对于写代码的人都知道,我们一般的程序编译过程都有语法分析、词法分析等一系列检查操作,然后生成对应的机器码或者字节码。对于C++来说,其编译过程可使用下图表示    当然我们知道还有一部分语言是使用解释器工作的,其标准流程如下:    我们大学的时候,很多老师会告诉我们, java是一门解释性语言,但是Java笔传统解释器执行做了一定的优化,它不是对源码文...

jbutton的专栏 390

【五斗米】JVM调优

JVM是Java虚拟机的简称,它是Java跨平台运行的核心组件。JVM通过将字节码文件(.class)转换为机器码实现"一次编译,到处运行"。其组成包括类加载系统、执行引擎、运行时数据区和本地接口。内存区域分为线程共享的堆(存储对象)和方法区(类信息),以及线程私有的程序计数器、虚拟机栈和本地方法栈。JVM采用分代垃圾回收机制:新生代使用复制算法,老年代采用标记-清除/整理算法。三色标记算法优化了可达性分析过程,减少STW时间。JVM调优主要涉及堆内存设置(-Xms/-Xmx)、选择合适

m0_64210833的博客 1838

ISP调试工程师相关面试问题_001

Qualcomm、MTK等ISP pipeline的框架原理及算法原理,还有调试经验。

notgoodenouf的博客 3544

JVM运行机制

本博客为炼数成金 JVM教程的第二课 博客大纲 1. JVM启动流程 2. JVM基本结构 3. 内存模型 4. 编译和解释运行的概念 JVM启动流程 JVM基本结构 PC寄存机 每个线程拥有一个PC寄存器 在线程创建时创建 执行下一条指令的地址 执行本地方法时,PC的值为undefined 方法区(用来保存类的原信息) ...

cd19930508的博客 1744

西安电子科技大学841学长经验分享(总成绩第三名)

西安电子科技大学841学长经验分享(总成绩第三名)

qq_30953547的博客 1081

JVM编译器优化机制

编译器优化机制 字节码是如何运行的? 解释执行:由解释器一行一行翻译执行 编译执行:把字节码编译成机器码,直接执行机器码 解释vs编译 解释执行 优势在于没有编译的等待时间 性能相对差些 编译执行 运行效率会高很多, 一般认为比解释执行快一个数量级 带来了额外的开销 怎么查看运行模式呢?  ~  java -version java version "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java Ho

javaer工具人的博客 558

【LLM】ms-Swift框架下SFT与GRPO协同优化的高效训练策略

本文深入探讨了ms-Swift框架下监督微调(SFT)与群组相对策略优化(GRPO)的协同训练策略,提升大型语言模型(LLM)的性能与效率。通过创新的架构设计和两阶段训练流程,结合GRPO的群组奖励估计与动态基线调整技术,显著优化了数学推理等任务的准确率。文章还分享了计算资源高效利用和参数调优的实战经验,为LLM训练提供了实用指导。

green的博客 994

无GPS室内飞行:基于PX4与MID360的FAST-LIO定点悬停实战解析

本文详细解析了基于PX4飞控与大疆MID360激光雷达的无GPS室内飞行技术,重点介绍了FAST-LIO算法在定点悬停中的应用。通过硬件配置、软件环境搭建、坐标系转换等实战经验,帮助开发者解决室内定位难题,实现精准悬停与稳定飞行。

weixin_29056781的博客 261

Java代码编译过程简述

Javac编译器,能将一种语言规范转化成另外一种语言规范,通常编译器都是将便于人理解的语言规范转化成机器容易理解的语言规范,如C/C++或者汇编语言都是将源代码直接编译成目标机器码,这个目标机器代码是CPU直接执行的指令集合。这些指令集合也就是底层的一种语言规范。

Hopefully Sky的博客 2万+

图像加密与解密(附matlab代码)

详细介绍了三种图像加密解密原理,并基于matlab开发了一套相应系统。

2439

《深入理解Java虚拟机JVM高级特性与性能优化(第3版)》核心技术解析与实践

现代垃圾收集器,如G1、ZGC和Shenandoah,采用了分代收集、并发标记和低延迟停顿等高级算法,通过精细划分内存区域和智能回收策略,有效平衡了吞吐量和响应时间。HotSpot虚拟机内置了C1、C2等多个即时编译器,通过热点代码探测、方法内联、逃逸分析、公共子表达式消除等技术,将高频执行的字节码动态编译优化为本地机器码,极大地提升了程序运行效率。JVM的类加载过程包括加载、验证、准备、解析和初始化五个阶段,其双亲委派模型保证了Java核心类库的安全性和稳定性。### 字节码执行与即时编译器。

liuyong_liu的博客 323

原生H5如何优雅拦截浏览器返回事件:全面屏侧滑退出的解决方案

本文深入探讨了在原生H5中如何优雅地处理浏览器返回事件,特别是针对全面屏手机侧滑返回手势的解决方案。核心是利用HTML5 History API,通过`history.pushState`方法在历史栈中插入记录,并监听`popstate`事件,从而实现在用户侧滑时平滑关闭全屏预览层而非直接退出页面,有效提升了移动端H5应用的原生交互体验。

i0j1k2l3m的博客 268

自助结账商品检测(Scanned Item Detection)——基于YOLOv8的RPC数据集实战

RPC数据集是由中国科学院自动化研究所发布的零售商品结账检测公开数据集,广泛用于自助结账和零售场景下的目标检测与识别。YOLOv8是YOLO系列最新版本,由Ultralytics推出,继承了YOLO家族的高效快速和高准确性,适用于实时检测场景。本文系统介绍了基于YOLOv8的RPC数据集自助结账商品检测方案,涵盖数据准备、训练、推理及UI界面设计。未来,可结合多模态感知、RFID融合技术,打造更加智能和稳定的自助结账系统。

YOLO 248

JVM 原理与调优实战

本文深入探讨了Java虚拟机(JVM)的核心技术,从JVM的基本概念、内存结构、类加载机制、执行引擎原理到垃圾回收机制,全面解析了JVM的运行机制。文章还提供了JVM调优的实战技巧,包括常见启动参数、调优目标以及监控与排查工具的使用。此外,通过典型性能问题的案例分析,帮助读者理解如何解决实际开发中的性能瓶颈。最后,文章总结了学习JVM的推荐路径,并预告了后续内容,为Java工程师提供了全面的JVM学习指南。

zhangxzq的博客 2777

5、快速入门

点击启动实例按钮,并设计一个business key,每个实例会有一个business key, 业务主键,也相当于一个流程实例唯一key,一般会与一次业务强相关,比如一个订单号 ,此处取为shopping_1;付款程序完成后会流转到物流发货任务,此时java工程的相应订阅会收到任务,并进入断点,且读到到toWhere变量。单击shopping可以进入实时流程图的执行图,此时流程流转到第一个任务,需要业务系统完成此任务,并通知引擎。添加类,分别订阅流程中的加入购物车任务和物流发货任务。

leyoliu的博客 3499

深入解读JVM调优、原理、实践与最佳实践

由于 JVM 的多线程是通过线程轮流切换并分配处理器时间来实现的,因此每个线程都需要一个独立的程序计数器,以在线程切换后能恢复到正确的执行位置。在了解了 JVM 的内存结构和垃圾回收机制后,我们可以通过调整 JVM 的参数来优化 Java 应用程序的性能。在当今快速变化的技术环境中,JVM 调优并非一劳永逸的任务,而是一个需要持续关注和实践的过程。JVM 中的垃圾回收机制负责跟踪对象的引用关系,确定哪些对象是可达的(仍然被使用),哪些是不可达的(可被回收)。JVM 栈是线程私有的,生命周期与线程相同。

hello.reader 2847

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JVM原理及性能调优

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。

2401_84704152的博客 2848

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入剖析 JVM:从组成原理到调优实践

JVM 作为 Java 程序的核心运行环境,深入理解其组成、类加载机制、垃圾回收原理及调优方法,能帮助开发者更好地优化程序性能,解决运行时问题,打造高效稳定的 Java 应用。JVM(Java Virtual Machine)是 Java 程序运行的基础环境,其核心组成可分为三大模块:内存结构、执行引擎、本地方法接口。JDK 8 后,方法区由元空间(Meta Space)实现,使用本地内存,避免了 “永久代” 的内存溢出问题。:线程私有,存储方法执行时的栈帧,包括局部变量表、操作数栈、动态链接等。

Chenchen0905_的博客 1552

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深入理解Java性能调优与JVM底层机制

Java性能调优是一个涉及多方面的过程,包括对JVM底层机制的理解、对内存管理和垃圾回收的优化、对代码执行效率的提升以及对I/O、数据库等系统层面的调优。通过深入了解JVM的内存模型、垃圾回收机制和JIT编译机制,结合实际的调优工具与策略,可以大大提升Java应用程序的性能。性能调优并不是一蹴而就的过程,需要不断监控、分析和迭代优化。在现代复杂的Java应用中,掌握这些底层知识并灵活运用,将为开发者提供无穷的潜力,帮助解决应用性能瓶颈,确保系统的高效、稳定运行。

码上飞扬的博客 1421

最全学习JVM调优,真服了

学习JVM调优是为了优化Java应用程序的性能和资源利用。本文将从以下几个方面详细介绍学习JVM调优的步骤和技巧,帮助读者更好地理解和应用这些调优技术。

2401_84925284的博客 1045

JVM调优,调的是什么?目的是什么?

jvm是java语言可以跨平台运行的基础jvm 是什么,他是一个可以运行字节码文件的机器;调优调的是什么?调整的jvm内存模型中的参数,以及GC垃圾回收器的选择,甚至可以选择使用哪种垃圾回收算法;那么调优的目的是什么?调优调的是: 减少GC 的次数,以及GC的STW 时间,这里的GC 大多数指FULL GC当然minor gc 可能时间会非常长,不过这个情况较为特殊,之后文中会说;与轻gc 类似,FULL GC 是发生在老年代的gc。

学海无涯,我用JAVA 4604

jvm 调优的方式

jvm调优的基本步骤

软件Java开发工程师 1659
上一篇: JVM原理及调优(2)——内存管理
下一篇: JVM原理及调优(4)——类加载机制
白水不开
博客等级 码龄18年 91粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值