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

2024-04-24 20:28

本文主要是介绍(一)JVM实战——jvm的组成部分详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本节内容是关于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):本地方法库,支持本地的一些类库。

结语

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

这篇关于(一)JVM实战——jvm的组成部分详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932759

相关文章

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板