java的类加载浅析

news2024/9/22 4:38:43

类加载

类加载器

类加载器是Java虚拟机(JVM)的一个组成部分,它的主要任务是在运行时动态加载类和资源,以便程序能够使用它们。类加载器从文件系统、网络或其他来源中获取类的字节码,并将其转换为JVM可执行的形式,这样程序就可以使用这些类和资源了。

类加载器分类

java9之前

当JVM启动时,会形成有3个类加载器组成的初始类加载器层次结构:

  1. Bootstrap ClassLoader:根类(或叫启动、引导类加载器)加载器。加载核心库,如 rt.jar
  2. Extension ClassLoader:扩展类加载器。主要加载lib/ext下面的 jar 包
  3. System ClassLoader(或Application ClassLoader):系统类加载器。负责加载classpath下的类

java8打印
图3

java9的变化

尽管JDK 9保持了三级分层类加载器架构以实现向后兼容,但是模块系统加载类的方式已经发生了一些变化。此外,Platform ClassLoader(平台类加载器)取代了Extension ClassLoader(扩展类加载器),平台类加载器其作用在于加载一些平台相关的模块,例如:java.activation、java.se、jdk.desktop、java.compiler等。JDK9类加载器层次结构如下图所示。
java16打印
图4

类生命周期

类的生命周期由7个阶段组成,类加载说的是前5个阶段:即加载—>验证—>准备—>解析—>初始化
(其中验证->准备->解析三个可以合为连接过程)
类的生命周期

各个阶段的解释

  • 加载:通过类装载器将编译后的.class文件加载到内存中,并在堆区创建出一个Class对象,用来描述这个类的类型信息。系统中所有的类都是java.lang.Class的实例。在这个阶段,还会进行验证.class文件的格式等操作。

  • 连接:在这个阶段,Java虚拟机会对类进行验证、准备和解析。

    • 验证:验证阶段是对类的结构和语义进行检查,确保它符合Java语言规范。这包括检查类的继承关系、方法重载、访问控制等。验证阶段是为了确保类在运行时不会出现异常或安全问题。
    • 准备:在此阶段,Java虚拟机会为类的静态变量(static变量)分配内存,并设置默认值。例如,静态整数变量默认值为0,静态布尔变量默认值为false等。需要注意的是,在这个阶段并不会执行静态变量的初始化代码。
    • 解析(可选的):将常量池内的符号引用替换为直接引用。符号引用是类中对其他类、字段或方法的引用,它包括类名、字段名和方法名等信息。直接引用则是指向内存中实际对象或方法的指针。解析阶段保证了类在运行时可以找到它所依赖的其他类、字段和方法。比如,现在有个方法play(),这个方法的地址是666666,那么play就是符号引用,666666就是直接引用。
  • 初始化:此阶段Java虚拟机会执行类的静态初始化代码,包括静态变量的赋值和静态块的执行。类构造器方法<clinit>会被执行,由JVM负责保证线程安全和只执行一次。在这个阶段,会按照静态变量定义的顺序依次执行相应的赋值操作。

对象构造器方法<init>:new一个对象的时候被调用

类构造器方法<clinit>:类加载的初始化阶段jvm会调用<clinit>方法

  • 使用:初始化阶段完成后,类进入使用阶段。在这个阶段,程序可以创建类的实例、调用类的方法、访问类的字段等。使用阶段是类的主要活动期,它可能持续很长时间。
  • 卸载:类的生命周期最后进入卸载阶段。在这个阶段,Java虚拟机会回收类占用的内存资源,释放与类相关的所有资源。只有在其定义的类加载器可以被垃圾回收器回收的情况下,类或接口才能被卸载。

补充:卸载需要满足:

  1. 该类所有的实例已经被回收
  2. 加载该类的类加载器被回收
  3. 该类对应的java.lang.Class对象没有任何对方被引用

三种类加载器加载的类在虚拟机的整个生命周期中是不会被卸载的,只有用户自定义的类加载器所加载的类才可以被卸载

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

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

相关文章

机器学习基础知识之交叉验证

文章目录 交叉验证定义1、随机子抽样验证2、K折交叉验证3、留一法交叉验证4、自助采样验证 交叉验证定义 在使用某一个数据集对模型进行训练时&#xff0c;模型的实际训练情况会受到数据集的直接影响&#xff0c;且其实际训练结果是难以确定的&#xff0c;极有可能出现欠拟合与…

【实验报告】实验四、彩色图像处理

一、实验目的 使用MatLab软件对图像进行彩色处理&#xff0c;熟悉使用MatLab软件进行图像彩 色处理的有关方法&#xff0c;并体会到图像彩色处理技术以及对图像处理的效果。 二、实验原理 &#xff08;一&#xff09;一幅RGB图像就是彩色像素的一个M x N x 3数组&#xff0…

视频搬砖项目【一个技术员是如何轻松利用视频搬运项目做到日入2000+】

无门槛人人可做副业项目&#xff0c;视频搬砖收益&#xff0c;实测一天2000&#xff01; 今天给大家分享一个微信看一看 的项目&#xff0c;操作非常简单&#xff0c;小白也很容易上手&#xff0c;不需要像某音一样去卖货&#xff0c;只要发布作品就能够有收益。 第一个、项目…

vue项目无法运行报错 error:0308010C:digital envelope routines::unsupported

文章目录 问题原因解决方法方法一方法二 问题 运行vue项目&#xff0c;报错 error:0308010C:digital envelope routines::unsupported 原因 网上查了一下&#xff0c;大体原因就是node版本不对&#xff0c;node版本太高 也有说我没有使用 Node JS 的 LTS&#xff08;长期支…

ROS2交叉编译操作

ROS2移植过程 在移植ROS2之前,先确认需要移植的版本以及其对应的依赖,这些信息可以在 ROS 2 Releases and Target Platforms 中有介绍,可依据自身需要使用的平台,参考该链接进行选择,下面以ROS2 Humble为例进行介绍ROS2移植操作。 ROS Humble依赖如下: 而ROS2的构建依赖…

sed进阶之保留空间和排除命令

shell脚本编程系列 保留空间 模式空间&#xff08;pattern space&#xff09;是一块活跃的缓冲区&#xff0c;在sed编辑器执行命令时保存着待检查的文本&#xff0c;但它并不是sed编辑器保存文本的唯一空间。sed编辑器还有另一块称作保留空间&#xff08;hold space&#xff0…

【深度学习】BERT是什么?怎么玩的?

RNN 也是一种Seq2Seq网络 这种RNN就不能并行运算&#xff0c;且对于长句子会造成损失遗忘或者梯度爆炸 Transfomer Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建&…

美国大学特别重视的批判性思维,是如何培养出来的?

美国大学非常注重培养学生的批判性思维&#xff0c;爱因斯坦有一句名言&#xff1a;“大学教育的价值&#xff0c;不在于学习很多事实&#xff0c;而在于训练大脑会思考。” 批判性思维有两个典型特征&#xff1a;&#xff08;1&#xff09;批判性思维善于对通常被接受的结论提…

SpringMVC学习总结

SpringMVC简介 我们首先要了解MVC是什么 MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xf…

oracle 19创建用户时出现“ORA-65096: invalid common user or role name”的错误

ORACLE 19命令 版本&#xff1a;Version 19.3.0.0.0 一、ORACLE 19创建用户命令 1、切换到oracle用户 [rootoracledb ~]# su - oracle Last login: Tue Jun 1 01:48:10 PDT 2021 on pts/5 2、以dba身份进入sql语句 [oracleoracledb ~]$ sqlplus "/as sysdba" …

2.rabbitMQ之交换机

1.交换机的作用 1.默认交换机会自动指定队列 2.之前一个信息必须被消费1次,现在的是一个消息可以被消费多次(发送到不同队列的前提下,正常情况下一个队列只能消费一次) 3.消息先发给交换机,然后交换机发给多个队列,可以达到多次消费的效果 如图mq3 2.交换机的类型 默认交换机…

【模块系列】DY-SV17F语音播放模块

前言 本文针对官方给的应用手册进行补充和加上个人理解。在官方的资料中已经介绍的很详细了&#xff0c;我就节选部分出来&#xff0c;基本认识模块就行了吧。本来还行自己介绍呢&#xff0c;没想到官方写这么详细了&#xff0c;也不知道介绍啥了&#xff0c;现在单纯的写为个人…

网络安全:钟馗之眼ZOOMEYE搜索引擎使用

网络安全&#xff1a;钟馗之眼ZOOMEYE搜索引擎 地址&#xff1a; 首页 - 网络空间测绘,网络安全,漏洞分析,动态测绘,钟馗之眼,时空测绘,赛博测绘 - ZoomEye("钟馗之眼")网络空间搜索引擎 zoomeye是针对互联网空间的搜索引擎&#xff0c;收录了互联网空间中的设备、…

103-Linux_I/O复用方法之epoll

I/O复用方法之epoll 一.epoll介绍二.epoll相关的函数1.epoll_create2.epoll_ctl3.epoll_wait 三.LT和ET模式1.LT模式2.ET模式 四.epoll实现TCP服务器1.代码(1)服务器端(2)客户端代码 2.运行结果截图 一.epoll介绍 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 sel…

小程序swiper控件的使用

swiper实现左右滑动,以及tab点击,并且给swiper绑定下拉刷新事件 <view class"swiper-tab"><view class"start swiper-tab-list {{currentTab0 ? on : }}" data-current"0" catchtap"swichNav">私教课</view><vi…

sed进阶之创建sed实用工具

shell脚本编程系列 加倍行间距 sed $!G data2.txt保留空间的默认值是一个空行&#xff0c;通过G命令可以将保留空间内的内容附加到模式空间内容之后&#xff0c;但是最后一行不需要附加&#xff0c;所以通过排除命令!进行排除 对可能含有空行的文件加倍行间距 sed /^$/d;$!G …

c++11上篇

c11 1.C11简介2.列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list 3.变量类型推导3.1 auto3.2 decltype3.3 nullptr 4.范围for循环5.final与override6.智能指针7.新增加容器---静态数组array、forward_list以及unordered系列8.默认成员函数控制9.右值引…

C++——类和对象[中]

0.关注博主有更多知识 C知识合集 目录 1.类的默认成员函数 2.构造函数和析构函数基础 3.构造函数进阶 4.析构函数进阶 5.拷贝构造函数 6.运算符重载 7.日期类 7.1输入&输出&友元函数 8.赋值运算符重载 9.const成员函数 9.1日期类完整代码 10.取地址重载 …

pandas简介

pandas的两个主要数据结构是&#xff1a;Series&#xff08;一维数据&#xff09;、DataFrame&#xff08;二维数据&#xff09;。 Series Series是一种类似于NumPy中一维数组的对象&#xff0c;它由一组任意类型的数据以及一组与之相关的数据标签组成。 import pandas as pd…

( 数组和矩阵) 240. 搜索二维矩阵 II ——【Leetcode每日一题】

❓240. 搜索二维矩阵 II 难度&#xff1a;中等 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,1…