当前位置: 首页 > news >正文

工作记录-------java文件的JVM之旅(学习篇)---好理解

一个java文件,如何实现功能呢?需要去JVM这个地方。

java文件高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢?

JVM不能直接加载java文件的原因:

•Java源代码中包含了许多高级语言特性和语法,比如类、继承、多态、异常处理等等。这些高级特性在JVM中没有直接对应的形式,只有通过编译器的处理才能转化为JVM可以理解的字节码指令。
•Java源代码需要经过编译器的编译过程,才能生成相应的字节码文件,然后再由JVM加载、解释执行。在编译过程中,编译器对源代码进行语法分析、类型检查、优化等操作,最终生成与目标平台兼容的Java字节码文件。
•JVM只能够加载和运行符合Java虚拟机规范的.class字节码文件,而不能够直接加载和运行Java源代码文件。

编译
知道原因后,我又问JVM,我怎么才能变成class文件呢,JVM告诉我可以通过javac命令。
javac
javac 是 Java 编译器命令,用于将 Java 源代码文件编译成字节码文件(.class 文件)。
命令格式
javac [options] [source files]
•options:为编译选项,可以控制编译器的行为,例如指定类路径、生成调试信息、压缩文件等。
• source files:为需要编译的 Java 源代码文件,可以指定多个文件,用空格隔开。如果不指定源代码文件,则 javac 命令会在当前目录查找所有扩展名为 .java 的文件进行编译。
需要注意的是,javac 命令需要在正确配置 JDK 环境后才能使用。

具体实现
编译器在编译源文件时,需要对源文件进行语法分析、语义分析和类型检查等操作。
•语法分析:javac命令首先将源文件读入内存,然后进行词法分析和语法分析。词法分析器负责将源文件中的字符序列转换成一个个单词(Token),然后语法分析器将单词组合成可以被解释执行的语法结构,形成抽象语法树(AST)。
•语义分析:javac命令在生成AST之后,进行语义分析。语义分析器主要是为了检查程序中是否存在语义错误,例如变量未定义、类型不匹配等,如果发现语义错误,编译器会输出错误信息,并中止编译过程,不会生成字节码文件。
•类型检查:javac命令在语义分析的基础上,进行类型检查。类型检查器主要是检查程序的类型是否匹配和兼容,如果类型不匹配或不兼容,编译器会在编译期间报告错误。
•代码生成:javac命令在生成抽象语法树后,对其进行优化和转化,最终生成字节码文件。编译器会根据目标代码的平台和版本,生成适当的字节码文件。
执行
知道怎么变身后,我立即通过javac命令,让自己变成可以被JVM执行的class文件。

加载
变成class文件后,我怎么能进入JVM内部呢,是走着去还是坐车去呢?JVM告诉我要通过类加载器进入。

类加载器
Java类加载器是Java虚拟机(JVM)中的一个重要组件,它负责将类文件(.class文件)加载到JVM中。

分类
Java 中的类加载器是按照其加载类的特点进行分类的,主要有以下几种类型:

启动类加载器(Bootstrap ClassLoader):负责加载 JRE/lib/rt.jar 中的核心 Java 类库,是最顶层的类加载器,不是 Java 类(因为在 JVM 实现时就已经存在)。

扩展类加载器(Extension ClassLoader):负责加载 JRE/lib/ext 目录下的扩展类库,也是由 C++ 实现的类加载器。

应用程序类加载器(APP ClassLoader):负责加载应用程序的类,包括在 CLASSPATH 中指定的类库或者目录中的 Java 类。
自定义类加载器(Custom ClassLoader):继承自 ClassLoader 类,实现自己的类加载器,主要用于加载一些自定义的类或者修改某些类的字节码。

自定义类加载器

自定义类加载器主要包括两种类型:

•独立的自定义类加载器,通过重载 ClassLoader 类中的 findClass 方法来实现加载类文件的功能;
•基于 URLClassLoader 类实现的自定义类加载器,使用 URL 的形式来指定类文件的位置。

双亲委派

加载器那么多,我具体是哪个类进行加载得呢?双亲委派机制告诉我答案.

定义
双亲委派是一种Java类加载器的工作机制,它将类加载请求委派给父类加载器,直到顶级系统类加载器。基本思想是,除非有特殊需求,否则所有类的加载任务都应该由父类加载器完成,从而保证Java核心库的类型安全和稳定性,并防止恶意代码的自行布置。如果一个类没有在父类加载器中被发现,子类加载器才会尝试加载该类。这种类加载器之间的父子关系被称为“双亲委派模型”.

意义
为什么通过双亲委派进行加载呢?

•避免重复加载

•提高安全性

•维护Java平台的一致性

•代码优化

Linking
加载过后,我是否就可以被使用了呢?答案是否定的,我还要经历Lingking 阶段,包括Verification、Preparation 和 Resolution。

Verification(验证)
在验证阶段,Java虚拟机会进行语法与语义的检查,以保证class文件的完整性和正确性,同时保证被加载的class与虚拟机的版本兼容。主要的检查内容包括文件格式、字节码语义、符号引用等。

Preparation(准备)
在准备阶段,Java虚拟机会为类变量分配内存,并且赋予初始值。如果类变量包含有静态变量,那么这时也会初始化静态变量。因此,在这个阶段,类变量所使用的空间已经被分配,将其设置为默认初始值即可。

Resolution(解析)
在解析阶段,将类或接口中的符号引用转化为直接引用的过程。在 Java 虚拟机加载类时,符号引用是一种指向常量池中某个符号的引用,而直接引用则是指向内存中某个位置的直接指针。解析阶段可以理解为是在解决类之间的依赖关系,使各个类之间可以像使用自身成员一样使用别的类中的成员。

初始化
在验证、准备和解析后,我还要经过初始化,才能被使用。
定义
初始化是指在类加载过程的最后一步,JVM要对类进行一些初始化的操作,确保类可以安
全地使用。在这个阶段,往往包括静态变量显式赋值和静态代码块执行。

内容

静态变量显式赋值
当类加载器完成类的加载、验证、准备后,在初始化阶段,JVM对类的静态变量进行显式赋值。如果类定义了多个静态变量,JVM会按照代码中声明的顺序进行初始化,并且若发现此过程需要访问到其他未初始化的类,JVM会先完成这些类的初始化。
静态代码块的执行
除了静态变量的显式赋值,类的静态代码块也会在初始化阶段执行。当JVM执行类加载的Initializing阶段时,会执行类中所有静态代码块的内容,如果类中没有定义静态代码块,则不执行。这个过程一般用于在使用之前对类进行初始化。
接口初始化
当一个类在初始化时,如果发现其父类还未进行初始化,JVM会先对其父类进行初始化。如果该类实现了接口,也会对这个接口进行初始化操作,接口的初始化过程和类一样,都会进行静态变量显式赋值及静态代码块执行,同时还会检查接口中的所有静态方法。
功能实现
初始化之后,我才真正的进入JVM中,其它小伙伴需要我的时候,只需要创建我的实例,就可以使用我的功能了,得到我帮助得小伙伴都很感谢我。
GC
在JVM中我过得很开心,也留下了很多足迹。在我走后,如何让我得足迹不对其他小伙伴有影响呢?GC可以帮我解决这个问题。
定义
GC(Garbage Collection)是JVM提供的垃圾回收机制。在Java中,对象是动态分配的,内存是由JVM自动管理,而不是由程序员手动分配和释放。当一个对象不再被程序引用时,就应该由垃圾回收器回收其占用的内存,这样可以防止内存泄漏和提高内存的。
小结
通过我的旅行,你知道JVM是怎么加载一个类的了么?我们通过加载、Linking、初始化和使用等各个阶段,将Java类完整地载入内存并执行其中定义的方法和变量。这个过程中,每个阶段都扮演着不同的角色,并为类的正常运行提供了必要的支持。

相关文章:

工作记录-------java文件的JVM之旅(学习篇)---好理解

一个java文件,如何实现功能呢?需要去JVM这个地方。 java文件高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢?…...

城市内涝对策,万宾科技内涝积水监测仪使用效果

随着城市化进程的加速,城市道路积水问题明显越来越多,给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况,为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中,地…...

android的通知使用

在 Android 中,通知(Notification)是一种在状态栏显示消息的方式,通常用于向用户展示应用程序的重要信息、事件或更新。以下是一个简单的示例,演示如何在 Android 应用程序中使用通知: import android.app…...

001 opencv addWeighted

目录 一、环境 二、addWeighted函数 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、addWeighted函数 OpenCV中的cv.addWeighted函数是一个用于图像叠加的函数,它可以将两个具有相同尺寸和类型的图像按…...

2311rust,到35版本更新

1.32.0 rustup self update rustup update stablerustup更新自己. dbg宏 打印调试,你需要: let x 5; println!("{:?}", x); //甚至可能是 println!("{:#?}", x);在Rust1.32.0中,为此添加了个新的dbg!宏: fn main() {let x 5;dbg!(x); }如果运行此…...

UniPro提高集成能力 让客户专注于交付价值

一千个哈姆莱特就有一千个读者,一千个开发团队,也会有各不相同的软件工具和工作流程。工具与工具之间,功能上的割裂亦或重叠,都会给企业和团队的协作带来阻塞,结果就会导致团队之间各自为战、信息孤岛的形成以及资源的…...

Python---函数的作用,定义,使用步骤(调用步骤)

Python实际开发中,使用函数的目的只有一个 “让我们的代码可以被重复使用” 函数的作用有两个: ① 模块化编程 ② 代码重用 在编程领域,编程可以分为两大类:① 模块化编程 ② 面向对象编程 函数就是一个 被命名的、独立的…...

ERP智能管理系统:智能化的未来之路

ERP智能管理系统:智能化的未来之路 科技飞速发展,人工智能(AI)和大数据等先进技术的应用正在改变着企业的运营模式。其中,ERP智能管理系统在帮助企业实现智能化运营、提高效率、降低成本等方面发挥着越来越重要的作用。本文将为您详细介绍ERP…...

c++ memccpy和 = 都可以用于赋值操作

memccpy和都可以用于赋值操作,但它们的作用和使用方式有所不同。 是C中的赋值运算符,可以用于基本类型、对象、结构体等的赋值操作。对于结构体,它会执行成员到成员的赋值,也就是浅拷贝。如果结构体中有指针成员,赋值只…...

Golang for 循环中的隐式内存别名问题

Golang for 循环中的隐式内存别名问题 隐式内存别名是指在循环迭代过程中对同一变量的多次引用可能导致不可预期的结果。这主要涉及到 goroutine 和闭包的使用场景,在并发编程中容易引起 bug。 例如,下面的示例代码中存在隐式内存别名问题:…...

2023年亚太杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…...

Unity——利用Mesh绘制图形

什么是Mesh? Mesh 是用于表示和存储3D模型几何信息的类。它包含了顶点坐标、法线、UV坐标和其他与几何形状相关的数据,同时也包含了定义了这些数据如何连接以形成三角形的索引。 通过Mesh类,你可以创建、修改和渲染3D模型。一些常见的操作包括&#xf…...

web3资讯及远程工作

各位如果想了解区块链相关的消息可以通过如下网址了解,里面还会有相关职位招聘(包括远程工作),还可以在里面进行发帖,进入即可获得1000积分,后期可以兑换一些礼品Cryptosquare...

契约锁助力货物进出口全程无纸化,加速通关、降低贸易成本

我国作为全球最大的制造业国家和最大的货物贸易国家,政府始终注重引入数字化技术,创新管理和服务模式,帮助降低企业进出口成本,加速货物流通。 近年国家海关总署、商务部、税务总局及各地政府在进出口“报关”、“提货”、“收货备…...

生活中的综合能力

暖气管道不通 1 逐层排查哪层管道不通 2 排查该栋楼主管道和锅炉房总管道的连接口是否通畅 找不到主管道和总管道的连接口 查看其他楼和总管道的连接口 复盘: 先整体,后局部 求同求异思维:找差异,找正常暖气管道和异常暖气管…...

ES5中实现继承

本篇文章主要说明在ES5中最通用最兼容的继承实现方式,继承作为面向对象的三大特性之一,在js中实现继承对代码的简洁性,逻辑的连贯性都有很大的帮助。 实现思路 封装创建中间联系对象的函数 继承可以简单理解为建立子类和父类之间的联系&…...

面试鸭 - 专注于面试刷题的网站

网上面试题有很多,但此套面试题真实、原创、高频,全网最强。 题目涵盖大中小公司,真实靠谱,有频率和难度的标记,助你成为Offer收割机。 面试鸭地址:https://mianshiya.skyofit.com/ 本套题是我原创&…...

解决小程序路由超过10层限制

新建 navroter.js // 路由判断,小程序路由超过10层限制 // 避免小程序商品重复切换导致页面到结算单页时无法跳转到收货地址页,所以这里层级限制最大数为8 const MAX_VALUE 8 export function navigateTo(url) {let pages getCurrentPages()let dlt …...

【ceph】AI时代-数据为王-ceph存储将成为未来比较看好的赛道之一,为什么不all in一把学习一个不那么卷的赛道呢?

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

《小·意·思》特殊符号

title: 《小意思》特殊符号 date: 2023-11-17 15:27:21 updated: 2023-11-17 15:27:21 categories: 小意思 excerpt: 上下标号、标点、运算符、标号、时间相关、语言、货币、音乐、形状符号、其他符号。 comments: false tags: top_image: /images/backimg/SunsetClimbing.png …...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...