JVM工作原理与实战(五):类的生命周期-加载阶段

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、类的生命周期

1.加载(Loading)

2.连接(Linking)

3.初始化(Initialization)

4.使用(Using)

5.卸载(Unloading)

二、加载阶段

总结


前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的加载阶段等内容。


一、类的生命周期

类的生命周期描述了一个类加载、连接、初始化、使用、卸载的整个过程。

1.加载(Loading)

加载阶段是类的生命周期的起始点。当应用程序首次需要使用某个类时,Java虚拟机(JVM)会负责加载这个类。加载是通过类的加载器(ClassLoader)完成的,它会查找并加载类的二进制数据。这个过程包括将类的字节码从文件系统、JAR文件或网络加载到内存中。

2.连接(Linking)

连接阶段是加载阶段的后续,它包括验证、准备和解析三个子阶段。

  • 验证(Verification):验证阶段主要是确保被加载的类文件数据符合JVM规范,没有安全方面的隐患,以及是否与应用程序的其它部分兼容。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。
  • 准备(Preparation):准备阶段是为类的静态变量分配内存,并设置默认的初始值。需要注意的是,准备阶段并不会执行任何初始化操作。
  • 解析(Resolution):解析阶段是将符号引用转换为直接引用。在Java中,符号引用是一个类的全限定名,而直接引用是一个直接指向内存中的地址的指针。解析阶段发生在运行时,而不是编译时。

3.初始化(Initialization)

初始化阶段是类加载过程中的最后一步,当准备和解析阶段完成后,JVM会执行类的构造器方法,这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块集合来的。需要注意的是,构造器方法中的代码只在类被首次使用时执行一次。

4.使用(Using)

一旦类被成功加载、连接并初始化后,就可以被实例化并用于执行应用程序的业务逻辑。在应用程序运行期间,类可能会被频繁地使用。

5.卸载(Unloading)

当应用程序不再需要某个类时,该类的实例以及与其相关的资源将会被回收,这个过程就是卸载。但是需要注意的是,只有当一个类不再被任何活动对象所引用时,它才会被卸载。另外,JVM的垃圾回收机制(Garbage Collection, GC)负责自动处理类的卸载和资源的回收。

二、加载阶段

加载(Loading)阶段是类生命周期的起始点,它涉及将类的二进制数据从文件系统或其他来源加载到Java虚拟机中。这个过程主要由类加载器完成,它根据类的全限定名获取字节码信息。类加载器可以通过多种方式获取字节码信息,包括从JAR文件、ZIP文件、网络或其他自定义源中读取。

加载阶段根据类的全限定名把字节码文件的内容加载并转换成合适的数据放入内存中,存放在方法区和堆上。在加载阶段,类加载器首先会检查类是否已经被加载过。如果已经加载过,则直接返回已加载的类信息,否则,它会进行以下操作:

  1. 通过类的全限定名获取类的二进制数据(字节码)
  2. 将字节码信息转换为方法区的内部表示。方法区是Java虚拟机的一个内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。在这个阶段,Java虚拟机会为每个加载的类生成一个InstanceKlass对象,该对象包含了类的所有信息,包括类的实现细节,例如多态的实现。
  3. 中创建一个java.lang.Class对象。这个对象的作用是提供一种在Java代码中访问类的信息的方式,以及存储静态字段的数据(从JDK8开始)。开发者通常只需要通过这个Class对象来访问类的信息,而不需要直接访问方法区中的所有数据。这种设计使得Java虚拟机能够更好地控制开发者对数据的访问范围,增强了安全性。

通过上述过程,类的加载阶段完成了类的二进制数据的读取和解析,并将其存储在Java虚拟机的内存中,为后续的连接和初始化阶段做好了准备。这个过程对于任何在Java虚拟机上运行的程序都是必不可少的,因为它是类能够被执行的前置条件。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了类的生命周期、类的加载阶段等内容,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CEC2017(Python):蜣螂优化算法DBO求解CEC2017

一、CEC2017简介 参考文献: [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem definitions and evaluation criteria for the CEC2017 special session and competition on single objective real-parameter numer…

Python 介绍和环境准备

一、概述 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的解释性编程语言。 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言: 这意味着,您可以在一个 Python…

MySQL8.0主从复制实现及遇到的个人问题

文章目录 1、准备两个服务器或者虚拟机2、主库配置3、从库配置4、配置过程中使用到的命令5、遇到的问题 1、准备两个服务器或者虚拟机 这里使用的VM虚拟机的Centos、MySQL版本是8.0.26、使用FinalShell进行远程操作。 2、主库配置 修改MySQL配置文件(/etc/my.cnf) #启用二进…

二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)

之前也是把堆部分的知识点梳理完毕(即二叉树链式顺序的实现):堆的应用:堆排序和TOP-K问题 那么讲完了二叉树链式结构的实现。今天就进入二叉树链式结构的实现: 文章目录 1.准备工作2.二叉树的遍历2.1前序遍历2.2中序遍…

User Friendly大会 | 每日互动刘宇分享AIGC时代的数智营销变革

近日,第十九届暨2023年User Friendly国际用户体验大会在深圳召开。本次大会以“开智启能,体验无界”为主题,邀请了各行业领袖精英齐聚,分享前沿新观点,碰撞体验新思潮。每日互动高级副总裁刘宇作为业内资深专家&#x…

二维码地址门牌管理系统:物业管理的未来趋势

文章目录 前言一、数字化管理与便捷服务二、身份认证与安全保障三、业主便利与贴心服务四、未来发展趋势 前言 在数字化时代,物业管理面临着不断增加的挑战。为了提高管理效率、服务业主,二维码门牌管理系统应运而生。本文将探讨这一新型管理方式&#…

navicat密码解密

https://github.com/HyperSine/how-does-navicat-encrypt-password 获取加密的密码 reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Servers /s /v host reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Servers /s /v pwd或者通过导出连接之后查看文…

Unable to connect to Redis server

报错内容: Exception in thread "main" org.redisson.client.RedisConnectionException: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 175.24.186.230/175.24.186.230…

【实用安装教程】在win系统下制作Mac OS镜像启动U盘

第一步:制作Mac OS系统引导镜像启动U盘 准备一个8G(或以上)的U盘插入到win系统的电脑上 去下载TransMac(Mac启动盘制作工具)v10.4按照说明安装好 插入准备好的U盘,U盘数据要转移,打开TransMac,右键U盘选…

ssm基于echarts的基金交易网站的设计与实现论文

摘 要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话…

基于Spring Boot+Vue的学生信息管理系统【附源码】

介绍 1)登录模块:用户通过输入可以输入编号、邮箱、手机号和密码来登录系统,如果输入错误会返回登录界面,并提示错误信息,成功登录后用户的登录信息会存储在浏览器中,系统会根据这些信息判断该用户的操作权限。 2)系统…

Windows反调试技术学习

Windows反调试 前言元旦快乐!!!通过 API 调用IsDebuggerPresentCheckRemoteDebuggerPresent(NtQueryInformationProcess)OutputDebugStringZwSetInformationThread(ThreadHideFromDebugger) 手动…

【占用网络】VoxFormer 基于视觉的3D语义场景方案 CVPR 2023

前言 本文分享“占用网络”方案中,来自CVPR2023的VoxFormer,它基于视觉实现3D语义场景补全。 使用Deformable Attention从图像数据中,预测三维空间中的体素占用情况和类别信息。 VoxFromer是一个两阶段的框架: 第一个阶段&…

理解UML中的依赖关系

理解UML中的依赖关系 在面向对象的设计中,理解各种类之间的关系对于构建一个清晰、可维护的系统至关重要。UML(统一建模语言)为我们提供了一种可视化这些关系的方式。今天,我们将深入探讨UML中的依赖关系(Dependency&a…

苹果Vision Pro将于1月27日上市!

在无数期待中,苹果全新产品Vision Pro头显终于定下上市日期。 彭博社记者马克古曼(Mark Gurman)于近日在X(前推特)平台爆料了这一信息,预计苹果Vision Pro头显将于2024年1月27日率先在美国上市。 在过去看…

如何计算非线性负载的功率需求?

非线性负载的功率需求计算是一个相对复杂的过程,因为非线性负载的电流和电压之间的关系不是简单的正比关系。在计算非线性负载的功率需求时,需要考虑负载的特性、工作状态以及电源电压等因素。 确定负载的类型:首先需要了解负载的具体类型&am…

RocketMQ单机部署完整学习笔记

文章目录 前言一、RocketMQ是什么?二、使用步骤1.安装MQ1.安装JDK2.安装mq3.MQ配置(核心) 2.搭建可视化dashboard1.下载源码2.修改配置3.启动 3.整合java1.生产者2.消费者3.启动生产者4.启动消费者5.dashboard添加消费组 三、总结全部的配置 前言 本文是基于4.X版本…

静态网页设计——电影角(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 使用技术:HTMLCSSJS 主要内容:本网页主要利用HTML语言编写,简要介绍世界上一些主要国家,例如,中,…

【已解决】You have an error in your SQL syntax

报错讯息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc,target_url,sort,status,create_by,modify_by,created,last_update_time FROM…

跑通CLAM

项目场景: 从github上下载CLAM代码,上传Camelyon-16中的部分WSI图像,将代码跑通。 CLAM项目地址: GitHub - mahmoodlab/CLAM: Data-efficient and weakly supervised computational pathology on whole slide images - Nature …