(一)JVM实战——jvm的组成部分详解

server/2025/2/13 6:11:29/

前言

本节内容是关于java虚拟机JVM组成部分的介绍,通过其组成架构图了解JVM的主要组成部分。

正文

ClassFile:字节码文件

- javac:javac前端编译器将源代码编译成符合jvm规范的.class文件,即字节码文件

- class文件的结构组成:魔术、Class文件版本、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合、属性表集合

- javap:解析字节码,将字节码文件解析为可读的机器码

类加载器子系统(Class Loader):负责将编译后的Java字节码加载到内存中,并在运行时创建对应的类和对象。类加载器根据类的名称、包名等信息来查找并加载类。

- 类的加载过程

①Loading(装载)阶段:将java类的字节码文件加载到机器内存中并在内存中构建出java类的模版对象(类数据结构),存储在方法区(1.8之前永久代,1.8之后元空间),实例对象在堆中

②Linking(链接)阶段

        -验证:格式检查、语义检查、字节码验证、符号引用验证。

        -准备:为类的静态变量分配内存,并将其初始化为默认值;同时final修饰的static静态变量会在此直接赋值

        -解析:将类、接口、字段和方法的符号引用转为直接引用

③Initialization(初始化)阶段

        - clinit方法为类的静态变量赋正确的初始值(显示赋值给static修饰的变量或者在静态代码块中赋值)

④类是使用阶段

⑤类的卸载阶段

- 类加载器

①引导类加载器Bootstrap ClassLoader:加载JAVA_HOME/jre/lib/rt.jar,没有父加载器,没有继承Class Loader,是系统加载器,C语言实现

②扩展类加载器Extension ClassLoader:加载JAVA_HOME/jre/lib/ext子目录下加载类库,父加载器是Bootstrap ClassLoader

③系统类加载器App ClassLoader:父加载器是扩展类加载器Extension ClassLoader

运行时数据区(Runtime Data Area):也称为Java堆,它是JVM用来存储对象实例和数组的地方。Java堆在JVM启动时就被创建,用于存储动态分配的内存。

方法区(Method Area):用于存储类的结构信息,如类的字段、方法信息、静态变量、常量池等。方法区在JVM启动时被创建,它是各个线程共享的内存区域。

堆(Heap):用于存储对象实例和数组对象。所有通过关键字 new 创建的对象都会在堆上分配内存。堆是Java虚拟机管理的最大的一块内存区域,它在JVM启动时被创建,并被所有线程共享。

程序计数器(Program Counter Register):用于存储当前线程正在执行的Java虚拟机字节码指令的地址。每个线程都有自己独立的程序计数器,用于记录下一条即将执行的指令地址。

本地方法栈(Native Method Stack):类似于虚拟机栈,但是用于执行本地(Native)方法的栈空间。本地方法栈也是线程私有的,存储的是调用本地方法时的状态信息。

虚拟机栈(VM Stack):每个线程在执行Java方法时,都会创建一个对应的栈帧(Stack Frame),用于存储方法的局部变量、操作数栈、动态链接、方法出口等信息。虚拟机栈的大小可以在启动时通过参数进行调整。

执行引擎(Execution Engine):负责执行Java字节码指令。执行引擎有两种主要实现方式:解释器和即时编译器(JIT)。解释器逐条解释字节码指令并执行,而即时编译器将字节码转换成本地机器代码,以提高执行效率。

解释器:逐行解释执行。

即时编译器(Just-In-Time Compiler,JIT):将经过多次解释执行的热点代码(HotSpot)编译成本地机器代码,以提高执行速度。JIT编译器会根据运行时的性能数据进行优化,从而提升程序的执行效率。

JNI(Java Native Interface):允许Java代码与本地代码(如C/C++)进行交互。JNI提供了一组API,使得Java代码可以调用本地方法,以便获得更高的灵活性和性能。

NML(Native Method Libraries):本地方法库,支持本地的一些类库。

结语

本节内容到这里就结束了,我们下期见。。。。。。


http://www.ppmy.cn/server/13320.html

相关文章

RHCE--shell小实验

一、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查-次磁盘剩余空间。 [rootserver ~]# yum install mailx -y 安装邮件服务 [rootserver ~]# vim /etc/mail.rc 编写脚本 [rootserver ~]# vim dis…

贪心算法在单位时间任务调度问题中的应用

贪心算法在单位时间任务调度问题中的应用 一、引言二、问题描述与算法设计三、算法证明四、算法实现与效率分析五、C语言实现示例六、结论 一、引言 单位时间任务调度问题是一类经典的优化问题,旨在分配任务到不同的时间槽中,使得某种性能指标达到最优。…

7.Eureka注册中心

将user-service服务注册到eureka 将order-service服务注册到eureka eureka:client:service-url:defaultZone: http://localhost:10086/eureka/ <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix…

用户请求经过哪些处理(公网)

DNS服务器之间协作&#xff1a; 递归DNS查询&#xff1a;用户的请求首先发送到递归DNS服务器。 查询根DNS服务器&#xff1a;递归DNS服务器查询根DNS服务器&#xff0c;以找到管理.com顶级域的TLD DNS服务器。 查询TLD DNS服务器&#xff1a;根DNS服务器响应带有TLD DNS服务器…

【InternLM实战营---第六节课笔记】

一、本期课程内容概述 本节课的主讲老师是【樊奇】。教学内容主要包括以下三个部分&#xff1a; 1.大模型智能体的背景及介绍 2. Lagent&AgentLego框架介绍 3.Lagent&AgentLego框架实战 二、学习收获 智能体出现的背景 智能体的引入旨在克服大模型在应对复杂、动态任…

入门视觉(RM)

Opencv&#xff1a; 【youcans的OpenCV例程300篇】总目录-CSDN博客 ROS&#xff1a; Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 C&#xff1a; C 类 & 对象详解 - 知乎 (zhihu.com) Linux&#xff1a; 快速入门Linux操作系统学习笔记-CS…

Linux搭建本地DNS服务器

目录 DNS进行域名解析的过程&#xff1a; 环境介绍&#xff1a; 环境准备&#xff1a; 1.安装bind 2.编辑主配 3.配置正向解析文件 4.测试&#xff1a; DNS进行域名解析的过程&#xff1a; 用户要访问www.baidu.com&#xff0c;会先找本机的host文件&#xff0c;再找本…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动&#xff0c;传参有哪些方式&#xff1f; 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住&#xff1a;一般是对于Spring Boot应用特有的配置参数&#xff0c;确保它们遵循Spring Boot的配置属性命…