详解JVM类加载

从类被加载到虚拟机内存中开始,到释放内存总共有7个步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、 卸载(Unloading)。其中验证,准备,解析三个部分统称为连接。

相关:JVM-1-CSDN博客

加载:

通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class对象

  1. 通过一个类的全限定名来获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口

在Java中,通过类的完全限定名加载类字节码文件时,会根据类加载器的规则进行查找。类加载器负责定位和加载类的字节码文件,它可以根据特定的策略在不同的位置进行搜索。
在Java中,有以下几种类加载器:
1.启动类加载器(Bootstrap Class Loader):这是Java虚拟机的一部分,负责加载Java核心类库,如java.lang包中的类。它是用本地代码实现的,不继承自java.lang.ClassLoader
2.扩展类加载器(Extension Class Loader):它负责加载Java扩展库,位于<JAVA HOME>/lib/ext目录下的JAR文件。它是由sun.misc.Launcher$ExtClassLoader实现的,是java.lang.ClassLoader的子类。
3.应用程序类加载器(Application Class Loader):也称为系统类加载器(System ClassLoader),它负责加载应用程序的类,包括用户自定义的类和第三方类库。它是由sun.misc.Launcher$AppClassLoader实现的,同样是java.lang.ClassLoader的子类


当使用类的完全限定类,名记载类字节码文件时,类加载器,会按照以下顺序进行查找:

1.首先,由启动类加载器尝试加载。启动类加载器只加载Java核心类库,无法加载应用程序的类。
2.如果启动类加载器无法加载该类,则由扩展类加载器尝试加载。它会搜索Java扩展库中的类。
3.如果扩展类加载器也无法加载该类,则由应用程序类加载器尝试加载。它会搜索应用程序的类路径(classpath)下的类。
4.如果应用程序类加载器仍然无法加载该类,则会抛出ClassNotFoundException异常,表示无法找到该类。
但因为存在双亲委派机制,所以在类加载器加载类时(双亲委派规则在应用程序类加载器和扩展类加载器尝试加载类时起作用):

1.当应用程序类加载器或扩展类加载器需要加载一个类时,它们首先会将加载请求委派给父类加载器。
2.父类加载器会按照相同的方式尝试加载该类。如果父加载器能够成功加载该类,那么加载过程结束,类被返回给子加载器。
3.如果父加载器无法加载该类,则子加载器会尝试自己加载。如果子加载器能够成功加载该类,加载过程结束。
4.如果子加载器仍然无法加载该类,它会将加载请求再次委派给父加载器的父加载器(即更上一级的加载器)。这个过程会一直循环进行,直到达到启动类加载器。

5.如果启动类加载器仍然无法加载该类,系统会抛出ClassNotFoundException异常,表示无法找到该类。

双亲委派机制:

即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载

优点:
1.避免类的重复加载
2. 避免Java的核心API被篡改

为什么将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构?

  1. 内存管理:方法区是Java虚拟机用于存储类信息、常量、静态变量等数据的区域。通过将字节码转化为方法区的运行时数据结构,可以更好地管理内存,有效地组织和存储类相关的数据。

  2. 动态链接:在类加载过程中,Java虚拟机会进行符号引用到直接引用的解析。这包括将类、方法、字段等符号引用转化为方法区中的直接引用,以便在运行时进行动态链接和方法调用。

  3. 运行时执行:将字节码转化为方法区的运行时数据结构后,可以更方便地对类进行解析、验证和初始化。这样,在程序运行时,Java虚拟机可以更高效地执行方法区中的代码,提高执行性能。

  4. 共享数据:方法区是所有线程共享的区域,存储着类的元数据信息和静态变量。通过将字节码转化为方法区的运行时数据结构,可以确保这些共享数据在内存中只有一份拷贝,节省内存空间。


其中,之所以要创建Class对象,是因为java.lang.Class对象是Java反射机制的核心。

这个可以看一下java中面向对象的一项重要原则:封装

封装是将数据和操作数据的方法组合在一起,形成一个称为类(Class)的单元。封装通过将数据隐藏在类的内部,只暴露必要的接口方法来实现。

就比如我们创建一个对象时:

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int newAge) {
        if (newAge >= 0) {
            age = newAge;
        }
    }
}

在这个示例中,name和age字段被声明为私有的,外部代码无法直接访问它们。通过公共的getName和setName方法以及getAge和setAge方法,外部代码可以间接地访问和修改这些字段的值。在setAge方法中,还添加了对年龄值的非负检查,以确保数据的完整性。
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins构建实用场景指南

1 总体说明 本文主要介绍在研发实战时,通过Jenkins解决企业级软件构建打包一些实用场景。通常是在打包构建前,通过命令和工具进行预处理,避免修改源码,可按需配置构建任务,自动持续集成。 2 Jenkins简介 2.1 复制任务 研发实战创建构建任务,推荐从已有的构建任务进行…

项目管理-项目成本管理

目录 一、成本管理概述 二、成本估算 2.1 定义 2.2 成本估算方法 2.2.1 自顶向下的估算 2.2.1.1 估算方法 2.2.1.2 优点 2.2.1.3 缺点 2.2.2 自底向上的估算 2.2.2.1 估算方法 2.2.2.2 优点 2.2.2.3 缺点 2.2.3 差别估算法 三、成本预算 3.1 定义 3.2 成本预算的…

vue+springboot+mybatis-plus改装

①添加依赖 <!-- mybatis-plus --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version> </dependency> pom.xml: <?xml version"…

springboot+java照相馆预约管理系统ssm

框架&#xff1a;ssm/springboot都有 jdk版本&#xff1a;1.8 及以上 ide工具&#xff1a;IDEA 或者eclipse 数据库: mysql 编程语言: java 前端&#xff1a;layuibootstrapjsp 详细技术&#xff1a;HTMLCSSJSjspspringmvcmybatisMYSQLMAVENtomcat 开发工具 IntelliJ IDEA: 一…

Oracle解析exp、imp及常见的问题

前言 在工作中经常需要不同数据库的导入和导出。exp和imp可以实现数据的迁移。 exo会转储产生对应的二进制文件,里面包括数据的定义信息、数据内容等,即为dump文件。 下面是使用exp和imp的一些场景 exp和imp主要有4中模式: 1)数据库模式 数据库模式也就是我们说的全备…

五分钟手撕“三大特性”<继承>(下)

目录 一、protected 关键字 二、继承方式 三、final 关键字 四、子类的构造方法 五、this和super &#xff08;一&#xff09;相同点&#xff1a; &#xff08;二&#xff09;不同点&#xff1a; 六、代码块的执行先后 一、protected 关键字 在类与对象中提到过&…

二维码门楼牌管理应用平台建设:网格化管理的新篇章

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、二维码门楼牌管理应用平台的实际应用四、二维码门楼牌管理应用平台的前景展望 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台的建设已成为城市网格化管理…

第十四届蓝桥杯省赛C/C++大学B组真题-飞机降落

思路&#xff1a;根据数据范围N<10猜测用DFS剪枝&#xff0c;因为菜狗不会状压dp。根据题目&#xff0c;一般这种飞机的题都会用到贪心的思想。思想是每架飞机都要卡极限最早降落时间&#xff0c;从而保证后面的飞机能够有充足时间降落。 代码参考博客MQy大佬有详细解答 #i…

IDEA中添加servlet模板

官方代码链接 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.*; import javax.servlet.http.*;

Java面试八股文(JVM篇)(❤❤)

Java面试八股文_JVM篇 1、知识点汇总2、知识点详解&#xff1a;3、说说类加载与卸载11、说说Java对象创建过程12、知道类的生命周期吗&#xff1f;14、如何判断对象可以被回收&#xff1f;17、调优命令有哪些&#xff1f;18、常见调优工具有哪些20、你知道哪些JVM性能调优参数&…

统计大写辅音字母

题目&#xff1a; 英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序&#xff0c;统计给定字符串中大写辅音字母的个数。 输入格式&#xff1a; 输入在一行中给出一个不超过80个字符、并以回车结束的字符串。 输出格式&#xff1a; 输出在一行中给出字符串中大写…

Golang数据类型

文章目录 数据类型的基本介绍基本数据类型整数类型字符类型浮点数类型复数类型布尔类型string类型 常量类型转换基本数据类型相互转换基本数据类型与string的转换 指针类型值类型和引用类型 数据类型的基本介绍 数据类型的基本介绍 Go中的每一种数据都定义了明确的数据类型&…

Mac电脑版鼠标连点工具 RapidClick for Mac

RapidClick for Mac是一款方便实用的自动点击工具&#xff0c;可以帮助Mac用户在使用电脑时轻松、快速地进行鼠标操作。它可以模拟人类手指点击的动作&#xff0c;让您的鼠标点击变得更加快捷高效&#xff0c;大大提升了工作和游戏的效率。 RapidClick for Macv1.5.1激活版下载…

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

C++ 使用共享内存的进程通信方式模拟生产者消费者模型

编码环境如下 系统环境&#xff1a;linux 信号量&#xff1a;使用Linux操作系统的SystemV信号量 生产者代码如下 #include <iostream> #include <sys/sem.h> #include <sys/shm.h> #include <string.h>#define SEM_KEY 0x5678 #define SHM_KEY 0xAB…

(2022级)成都工业学院数据库原理及应用实验七: 数据库安全

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、创建数据库hospital,在hospital数据库中创建科室表De…

mac电脑mysql下载与安装

mysql下载地址 历史下载地址 MySQL :: Download MySQL Community Server (Archived Versions) mac 版下载 mac版本分为 Intel 处理器 和 M系列处理器。 从 8.0.26开始&#xff0c; mysql 支持M系列处理器。 以前的都只有Intel 处理器的。 Intel 处理器选择 x86_64 M 系列处理…

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 举个例子&#xff1a;组件好比小霸王游戏机&#xff0c;插槽就是游戏机的插口&#xff0c;看用户插什么卡&#xff0c;就…

AI算力集群网络规模与集群算力发展分析

GPU集群网络、集群规模、集群算力 在过去十年中&#xff0c;60% 的创业公司在五年内失败。现在&#xff0c;成功的几率提高了 30%&#xff0c;达到 90%&#xff01;加入我们的创业加速器&#xff0c;提升您成功的可能性。 一、引言 在生成式 AI 和大模型的时代&#xff0c;我…

【管理】杨三角模型

企业成功 成功 战略 X 组织能力 1&#xff09;组织能力对于企业的重要性是和战略一样的&#xff1b; 2&#xff09;组织能力必须与战略适配&#xff0c;才能共同造就企业的成功。 员工思维&#xff1a;员工愿不愿意参与战略落地的实践&#xff1f;员工每天所关心、追求和重视的…