Java编译过程中的JVM
流程
-
源代码编写: 首先,开发者使用Java编程语言编写源代码。这些源代码通常保存在扩展名为
.java的文件中。 -
编译源代码: 使用Java编译器(例如
javac),这些.java文件被编译成Java字节码。字节码是一种中间形式的代码,保存在扩展名为.class的文件中。这个步骤不涉及JVM。 -
加载字节码: 当运行Java程序时,Java虚拟机(JVM)首先加载相应的
.class文件。JVM的类加载器负责这个过程。 -
字节码验证: JVM内部包含一个验证器,它确保字节码是有效且安全的,防止例如非法数据访问和内存损坏等问题。
-
解释/编译字节码: JVM可以以两种方式执行字节码:
- 解释执行: JVM的解释器会读取字节码指令,并逐条转换为对应的机器码指令执行。这个过程在运行时进行,所以称为“解释执行”。
- 即时编译(JIT编译): 高级的JVM实现(如HotSpot)包含即时编译器。它会将频繁使用的字节码片段编译成原生机器码,以提高执行效率。这种方式结合了解释执行的灵活性和编译执行的高效率。
-
执行程序: 经过解释或编译,字节码转换成机器码后,CPU就可以执行这些指令,完成程序的运行。
-
运行时环境: JVM还提供了一个完整的运行时环境,包括内存管理(垃圾回收)、线程管理、安全管理等功能。
具体介绍
编译源代码
-
源代码到字节码: Java编译器(如
javac)将Java源代码(.java文件)转换为Java字节码。这个转换过程涉及多个步骤,如语法分析、语义分析、生成中间表示、优化和最终生成字节码。 -
中间表示: 在编译过程中,源代码首先被转换成一种中间表示形式(例如抽象语法树)。这种中间表示有助于进行各种优化和分析。
-
生成字节码: 经过优化后,编译器将这种中间表示转换为字节码,这是一种与平台无关的低级代码,保存在
.class文件中。字节码既不是完全的机器代码,也不是高级语言代码,它专为JVM设计,易于跨平台移植和执行。
加载字节码
-
类加载: 当Java程序运行时,JVM通过其类加载器加载
.class文件。类加载器按需加载类文件,即在程序中首次引用类时加载该类。 -
类加载器的层级: JVM使用分层的类加载器,包括引导类加载器(加载Java核心库)、扩展类加载器(加载扩展库)和应用程序类加载器(加载应用程序的类)。这种层级结构有助于安全和模块化。
字节码验证
-
验证过程: 当类被加载到JVM时,内部的验证器会对字节码进行检查。验证确保字节码遵守Java语言规范,不会对JVM造成安全风险。
-
安全和健全性检查: 验证过程包括检查字节码的结构完整性、数据类型的正确性、操作码的合法性等。这确保了程序在运行时不会访问非法内存、执行非法操作或破坏JVM的内部结构。
-
执行环境的准备: 验证器还确保类的结构符合执行环境的要求,比如类的方法解析、字段解析等。
解释/编译字节码
-
解释执行: JVM的解释器以一种边解释边执行的方式运行字节码。这意味着每次运行程序时,字节码都会被解释为机器码。这个过程虽然灵活,但执行速度相对较慢。
-
即时编译(JIT编译): JIT编译器在程序运行时动态地将字节码编译成机器码。它通常会针对频繁执行的代码路径(热点代码)进行编译优化,以提高执行效率。JIT编译可以显著提高程序运行速度,但会增加一定的编译开销。
执行程序
-
运行机器码: 不论是解释执行还是JIT编译,最终字节码都会被转换成特定平台的机器码,由CPU执行。
-
动态链接: 在运行时,JVM还会处理类和方法的动态链接,即在运行时解析类和方法的引用。
运行时环境
-
内存管理: JVM负责管理程序运行时的内存分配和回收,包括垃圾回收机制,这有助于避免内存泄漏和其他内存相关问题。
-
线程管理: JVM提供线程管理功能,支持多线程程序的运行,包括线程的创建、执行和同步。
-
安全管理: JVM提供安全管理器,用于控制对类、方法和资源的访问,以及执行安全策略。
-
异常处理: JVM还负责处理运行时异常和错误,提供了一套异常处理机制来处理程序执行中的异常情况。
相关文章:
Java编译过程中的JVM
流程 源代码编写: 首先,开发者使用Java编程语言编写源代码。这些源代码通常保存在扩展名为.java的文件中。 编译源代码: 使用Java编译器(例如javac),这些.java文件被编译成Java字节码。字节码是一种中间形…...
Python BDD 框架比较之 pytest-bdd vs behave
pytest-bdd和behave是 Python 的两个流行的 BDD 测试框架,两者都可以用来编写用户故事和可执行的测试用例, 具体选择哪一个则需要根据实际的项目状况来看。 先简单看一下两者的功能: pytest-bdd 基于pytest测试框架,可以与pytest…...
【面经八股】搜广推方向:常见面试题(一)
【面经&八股】搜广推方向:常见面试题(一) 文章目录 【面经&八股】搜广推方向:常见面试题(一)1. 线下效果提升、线上效果不好。2. XGBoost 和 GBDT是什么?有什么区别?3. 偏差与方差。延伸知识(集成学习的三种方式: Bagging、Boosting、Stacking)。4. 随机森林…...
斐讯K2结合Padavan实现锐捷认证破解方法
前言 众所周知,校园网在传统模式下是不能直接插路由使用的,但苦于校园网只能连接一台设备的烦恼,不得不“另辟蹊径”来寻求新的解决路径,这不,它来了,它来了,它带着希望走来了。 本文基于斐讯…...
SpringBoot : ch06 整合 web (一)
前言 SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何…...
C++:OJ练习(每日练习系列)
编程题: 题一:把字符串转换成整数 把字符串转换成整数_牛客题霸_牛客网 示例1 输入: "2147483647" 返回值: 2147483647思路一: 第一步:it从str的第一个字符开始遍历,定义一个最后输…...
C语言—什么是数组名
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{1,2,3,4};printf("%p\n",arr);printf("%p\n",&arr);printf("%p\n",*arr);return 0; } 结论:数组名是数组首元素地址(下标为0的元素…...
如何与死锁斗争!!!
其他系列文章导航 Java基础合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、死锁场景现场 二、死锁是如何产生的 三、死锁排查思路 四、sql模拟死锁复现 五、死锁的解决方案 前言 为避免影响业务,应尽可能避…...
【Java并发】聊聊不安全的HashMap以及ConcurrentHashMap
在实际的开发中,hashmap是比较常用的数据结构,如果所开发的系统并发量不高,那么没有问题,但是一旦系统的并发量增加一倍,那么就可能出现不可控的系统问题,所以在平时的开发中,我们除了需要考虑正…...
数据结构--->单链表
文章目录 链表链表的分类 单链表单链表的存储结构单链表主要实现的接口函数单链表尾插动态申请新节点单链表头插单链表的尾删单链表的头删在指定位置之前插入单链表查找插入 在指定位置之后插删除指定位置元素删除指定位置之后的元素顺序输出链表销毁单链表 顺序表和单链表的区…...
RT-Thread 线程间同步【信号量、互斥量、事件集】
线程间同步 一、信号量1. 创建信号量2. 获取信号量3. 释放信号量4. 删除信号量5. 代码示例 二、互斥量1. 创建互斥量2. 获取互斥量3. 释放互斥量4. 删除互斥量5. 代码示例 三、事件集1. 创建事件集2. 发送事件3. 接收事件4. 删除事件集5. 代码示例 简单来说,同步就是…...
B 树和 B+树 的区别
文章目录 B 树和 B树 的区别 B 树和 B树 的区别 了解二叉树、AVL 树、B 树的概念 B 树和 B树的应用场景 B 树是一种多路平衡查找树,为了更形象的理解。 二叉树,每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。 …...
Go iota简介
当声明枚举类型或定义一组相关常量时,Go语言中的iota关键字可以帮助我们简化代码并自动生成递增的值。本文档将详细介绍iota的用法和行为。 iota关键字 iota是Go语言中的一个预定义标识符,它用于创建自增的无类型整数常量。iota的行为类似于一个计数器…...
PyQt6库和工具库QTDesigner安装与配置
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计12条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…...
性能测试:系统架构性能优化思路
今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题,而在上线后出现了比较严重的性能问题&#x…...
python字符串格式化
字符串格式化 # 2023年11月16日 星期四 y 2023 m 11 d 16 w 四 s %d年%d月%d日 星期%s%(y,m,d,w) print(s) s {}年{}月{}日 星期{}.format(y,m,d,w) print(s) s f{y}年{m}月{d}日 星期{w} print(s)...
Linux的基本指令(二)
目录 前言 学前补充 touch指令 mkdir指令 rmdir指令 rm指令 通配符* man指令 cp指令 mv指令(重要) 补充内容: 1、如何快速在Linux中写出代码 2、如何看待如此多的Linux指令 cat指令 前言 关于Linux的基本指令我们会分三到四篇文章进行分析,…...
每日一题--寻找重复数
蝶恋花-王国维 阅尽天涯离别苦, 不道归来,零落花如许。 花底相看无一语,绿窗春与天俱莫。 待把相思灯下诉, 一缕新欢,旧恨千千缕。 最是人间留不住,朱颜辞镜花辞树。 目录 题目描述: 思路分析…...
C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)
1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的(加减乘除)四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…...
kafka,RabbitMQ,RocketMQ,他们之间的区别,架构,如何保证消息的不丢失,保证不重复消费,保证消息的有序性
文章目录 Kafka、RabbitMQ、RocketMQ 之间的区别是什么?性能数据可靠性服务可用性功能 RabbitMQ如何保证消息不丢失?Kafka 的架构说一下?Kafka 怎么保证消息是有序的?Kafka 怎么解决重复消费?Kafka 怎么保证消息不丢失…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
