类的生命周期(类加载,类加载器,双亲委派机制)

类加载:双亲委派机制 类的生命周期 类加载器 双亲委派机制 类的生命周期 类从被加载到虚拟机开始,到卸载出内存为止,它的整个的生命周期包括:加载、连接(验证、准备、解析)、初始化、使用和卸载七个阶段。 加载过程 将编译之后的Class文件加载至虚拟机,并存储在方法区。 连接过程 连接被分为了验证、准备、解析三部分。 验证:Class文件中的信息是否符合Java虚拟机的要求,是否安全(可能会做出危害虚拟机的行为)。 准备:为类变量分配内存,并设置类变量的初始... 阅读详情

类在Java内存中的变化

Java内存空间—堆,栈,方法区

Java内存空间需要了解的可以大致可分为三块区域:堆,栈,方法区。

  • 堆: 存放new的对象和数组。
    • 可以被所有的线程共享,不会存放别的对象引用。
    • 如果堆中没有内存完成实例分配,并且堆也无法完成扩展时,将会抛出OutOfMemoryError异常。
    • 堆可以处于物理上不连续的内存空间,只要逻辑上连续的即可。
  • 栈: 存放基本类型变量(包含这个基本类型的具体数值),引用对象的变量(存放这个引用类型在堆里的具体地址)
  • 方法区: 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    • 可以被所有线程共享
    • 当方法区无法满足内存分配需要时,将抛出OutOfMemoryError异常。

类的生命周期

类的生命周期如下图所示:
在这里插入图片描述
我们需要了解的是类的加载,链接,初始化,缓存。
在这里插入图片描述

  • 类的加载: 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。
  • 类的链接: 将java类的二进制代码合并到JVM的运行状态中的过程。
    • 验证:确保加载的类信息符合JVM规范,没有安全方面的问题。
    • 准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。
    • 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。
  • 类的初始化: 执行类构造器 <clinit>() 方法的过程。
    • 类构造器<clinit>()方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。
    • 当初始化一个类时,如果其父类还没有进行初始化,则先触发其父类的初始化。
    • 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。
  • 类缓存: 标准的javaSE类加载器可以按要求查找类,一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。但是JVM垃圾回收机制可以回收这些Class对象

类初始化的时机

类的主动引用会触发类的初始化,但是类的被动引用不会发生类的初始化。

  • 主动引用
    • 当虚拟机启动,会先初始化main方法所在的类
    • new一个类的对象
    • 调用类的静态成员(除了final常量)和静态方法
    • 使用Java.lang.reflect包的方法对类进行反射调用
    • 初始化一个类时,其父类如果没有初始化,则会先初始化它的父类
  • 被动引用
    • 访问一个静态域时,只有真正声明这个域的类才会被初始化。如:通过子类引用父类的静态变量,不会导致子类初始化
    • 通过数组定义类引用,不会触发此类的初始化
    • 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
public class testClassInit {
    static {
        System.out.println("main类被加载");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //主动引用
//        Son son=new Son();

        //通过反射主动引用
//        Class.forName("com.yang.learning.AnnotationAndReflection.Son");

        //不会产生类的引用的方法
//        System.out.println(Son.b);

//        Son[] array=new Son[5];

        System.out.println(Son.M);
    }
}

class Father{
    static int b=2;
    static {
        System.out.println("父类被加载");
    }
}

class Son extends Father{
    static {
        System.out.println("子类被加载");
        m=300;
    }
    static int m=100;
    static final int M=1;
}

类加载器

类加载器可以分为:启动/根类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),应用程序类加载器(Application ClassLoader),自定义类加载器(User ClassLoader)。
在这里插入图片描述
为确保所有的类都被加载,Java中使用了一个双亲委派机制。即,如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

双亲委派机制分为向上委派和向下委派。

  • 向上委派:第一步: 将自定义加载器挂载到应用程序类加载器 第二步: 应用程序类加载器将请求委托给扩展类加载器 第三步: 扩展类加载器将请求委托给启动类加载器。
  • 向下委派:第一步: 启动类在加载路径下查找并加载Class文件,如果没有找到就交给扩展类加载器加载 第二步:扩展类加载器在它的加载路径下查找并加载Class文件,如果还是没有找到,再交给应用程序类加载器加载 第三步:应用程序类加载器在加载路径下查找并加载Class文件,如果还是没有找到,就交给自定义加载器进行加载 第四步:自定义加载器在用户指定的位置进行查找并加载Class文件,如果还是没有找到,JVM抛出ClassNotFund异常。这时类加载失败,JVM也启动失败。
    在这里插入图片描述
public class testClassLoader {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取系统类的加载器
        ClassLoader systemClassLoader=ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);

        //获取系统类的加载器的父类加载器--》扩展类加载器
        ClassLoader parent=systemClassLoader.getParent();
        System.out.println(parent);

        //获取扩展类加载器的父类加载器--》根加载器(C/C++)
        ClassLoader grandParent=parent.getParent();
        System.out.println(grandParent);

        //测试当前类是哪个类加载器加载的
        ClassLoader classLoader=Class.forName("com.yang.learning.AnnotationAndReflection.testClassLoader").getClassLoader();
        System.out.println(classLoader);

        //测试JDK内置类是那个类加载器加载的
        classLoader=Class.forName("java.lang.Object").getClassLoader();
        System.out.println(classLoader);

        //如何获得系统类加载器可以加载的路径
        System.out.println(System.getProperty("java.class.path"));
    }
}
JVM (三) - 类加载机制 通常情况下,我们都是直接使用系统类加载器。但是,有的时候,我们也需要自定义类加载器。比如应用是通过网络来传输 Java 类的字节码,为保证安全性,这些字节码经过了加密处理,这时系统类加载器就无法对其进行加载,这样则需要自定义类加载器来实现。自定义类加载器一般都是继承自 ClassLoader 类,从上面对 loadClass 方法来分析来看,我们只需要重写 findClass 方法即可。try { 阅读详情

相关推荐

第 2 章 一 类的生命周期、类加载子系统 (类加载过程、类加载器的分类、双亲委派机制)、SPI是什么、沙箱安全机制

第 2 章 类加载子系统 1、内存结构概述 如果自己想写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 完整框图: 2、类加载子系统 (重点) 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还

Guizy 1258

JVM入门学习笔记

jvm相关学习笔记

bugbugkingking的博客 302

ComfyUI节点流实战:用Wan2.1制作电商短视频全流程(附人物/商品模板)

本文提供了一份详尽的ComfyUI实战教程,指导用户如何利用通义万相Wan2.1图生视频模型,高效制作适用于抖音等平台的电商短视频。内容涵盖从环境部署、核心工作流搭建,到针对服装、3C数码等品类的高级提示词模板与参数调优,旨在帮助电商从业者快速生成高质量、高保真商品展示视频,显著提升内容生产效率。

potato的博客 1281

双亲委派模型

双亲委派模型

weixin_44979389的博客 484

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2197

比亚迪唐/秦开发者必看:253个车辆接口实战指南(附常用功能调用示例)

本文为比亚迪唐/秦开发者提供了一份详尽的车辆接口实战指南。文章聚焦于比亚迪开放的253个车辆接口,从开发环境搭建、核心状态监控到高频控制功能(如空调与充电管理),结合真实代码示例,帮助开发者快速上手并规避常见问题,高效开发车载应用。

weixin_28327051的博客 612

JVM类加载机制

一、内置类加载器 1.跟加载器(c++代码的一段加载逻辑) 2.扩展类加载器 Launcher.ExtClassLoader 3.应用类加载器 Launcher.AppClassLoader 三个内置加载器是逻辑上的父子关系,并非Java语法上的继承关系,具体详见sun.misc.Launcher构造方法,ExtClassLoader实例通过传参设置为AppClassLoader的parent属性。 二、双亲委派 双亲委派的具体过程为,自下而上检查是否加载过某类,有则直接返回,没有则委派给父加载器(详见ja

卧龙城 201

Wezterm的安装和简单配置

希望 wezterm 的主题配色,保持和 powershell 默认配色一致,也就是 Compell 主题。目的是在频繁使用 wezterm 时,原本的根据颜色判断文件信息(尤其是WSL里的Linux下,文件和目录颜色)依然可以使用。wezterm 默认用 cmd.exe, 我是 win11,希望默认用 powershell。

baiyu33的博客 4269

JVM双亲委派

JVM双亲委派机制: 类加载:类加载时线程互斥,所以可以通过内部类进行创建 类加载原理: 向上加载向下委派 当类进行加载时,会寻找他的父类(递归),寻找到最高的父类时向下委派加载,直到不可向下委派为止。 约基础的类由约上层的加载器进行加载,但是如果基础类有调用回用户类->线程上下文类加载器 1、防止类重复加载无意义消耗资源。 2、防止核心类被用户类篡改加载。 双亲委派机制三次破坏: 第一次: 版本问题,双亲委派机制在JDK1.2引入。但类加载器和抽象类CLassLoader在JDK1.0就已经存在,面

LiFormJie的博客 533

07RK3568 I2S主模式 FPGA

RK3568与fpga通过i2s0连接,fpga连接音频芯片ES8388,RK为i2s主模式。调试时发现可正常采集来自fpga的数据。不可发送数据至fpga。由于i2s后连接fpga这里用了Rockchip的dummy-codec,一个虚拟的编解码器。

qq_39451352的博客 303

SAN存储与协议,了解SCSI、FC和ISCSI

在前面我们介绍SAN存储及iSCSI协议的时候了解到SAN存储其实是一个CS架构的系统。存储系统本身就是整个系统的服务端。以IP-SAN(也就是基于iSCSI的SAN存储)为例,其整体架构如图1所示。 图1 CS架构 对于存储系统来说,通常是由专业的存储厂商提供,比较知名的如EMC、NetAPP、IBM和日立等等。国内存储厂商也迅速崛起,比较知名的如华为、宏杉、浪潮和同友等等。另外,还有一些小的存储厂商,他们往往集中在某个领域,比如专注文件系统或者块存储等等。 除了专业的存储设备外,其实Linux

shuningzhang的专栏 2685

【JAVA面经】9.类的生命周期与JVM类加载器

Java 提供类,允许开发者实现自定义类加载器,常用于特殊的加载机制,如模块化加载或热部署。

沐七小殿下的 博客 627

使用ChatGPT工具阅读文献的实战教程

本文介绍核心内容为使用ChatGPT工具阅读文献,希望对学习和使用ChatGPT的同学们有所帮助。为了兼顾质量和速度,本专栏的更新频率为一周一到两更。 文章目录 1. 前言 2. 实战教程 2.1 下载工具并登录 2.2 提取文献中的关键信息

herosunly的博客 15万+

JVMの类加载器与双亲委派机制

类的生命周期,类加载器,双亲委派机制

西岭千秋雪的博客 1027

大厂硬件笔试机试题ASIC设计方向-卷3

本文提供了30道硬件工程师机试题目,涵盖数字逻辑、模拟电路、CMOS和信号处理等核心领域。选择题和判断题均配有详细解析,重点考察Verilog编程、CMOS特性、触发器设计、采样定理等知识点。题目难度适中但覆盖面广,如Verilog中阻塞/非阻塞赋值的区别、CMOS静态功耗来源、Nyquist采样定理、通用逻辑门判断等。备考建议强调掌握逻辑门设计、Verilog时序电路编写和CMOS特性理解。这些题目反映了华为等大厂硬件机试的典型考查内容,通过系统复习可有效提升机试成绩,为后续面试奠定基础。

启芯硬件的博客 545

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

类的生命周期

1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。程序员可以使用Java代码拓展的不同的渠道。2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。3、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。

2302_77971734的博客 1466

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

深入浅出JVM(一)类加载

文章目录前言一、JVM是什么?二、使用步骤1.引入库2.读入数据总结前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 JVM这三个字母,可以说是超高频出现在我们的开发生活,听上去很高大上。人对于未知事物,总是有种敬畏之心。其实JVM并没有我们想象中那么难,只是内容繁琐(但是每个知识点都很重要)。我记得我在学校参加面试的时候,面试官问我看过哪些书?说深入理解JVM,以及JAVA编程思想,这俩本书是必看的(你连这俩本书都没看过,我对你很失望啊,下一位)。Obviously 我被pass

weixin_42216907的博客 1211

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JVM:字节码文件,类的生命周期,类加载器

JVM:字节码文件,类的生命周期,类加载器

这里有一只小马吖 769

java的深入探究JVM之类加载与双亲委派机制

前言前面学习了虚拟机的内存结构、对象的分配和创建,但对象所对应的类是怎么加载到虚拟机中来的呢?加载过程中需要做些什么?什么是双亲委派机制以及为什么要打破双亲委派机制?类的生命周期类的生命周期包含了如上的7个阶段,其中验证准备解析统称为连接 ,类的加载主要是前五个阶段,每个阶段基本上保持如上顺序开始(仅仅是开始,实际上执行是交叉混合的),只有解析阶段不一定,在初始化后也有可能才开始执行解析,这是为了支持动态语言。加载加载就是将字节码的二进制流转化为方法区。

qq_40902295的博客 1878

JVM 基础 - Java 类加载机制

通常情况下,我们都是直接使用系统类加载器。但是,有的时候,我们也需要自定义类加载器。比如应用是通过网络来传输 Java 类的字节码,为保证安全性,这些字节码经过了加密处理,这时系统类加载器就无法对其进行加载,这样则需要自定义类加载器来实现。自定义类加载器一般都是继承自 ClassLoader 类,从上面对 loadClass 方法来分析来看,我们只需要重写 findClass 方法即可。try {

珍惜当下 949

JVM---Java 类生命周期与类加载机制

Override// 实现类文件加载逻辑。

2302_80853925的博客 1149

类加载机制

首先,先了解一下,一个Java类是如何运行的。 看到这幅图之后,我们知道了我们的Java文件首先由.Java文件编译成.Class文件然后被加载进入JVM中的。那么更多的问题便随之出现了。 一个类是如何被加载进JVM中的?一个类是被什么加载进JVM中的?一个类被加载了,是否需要被卸载?此时,就要讲起我们的类加载机制了。 一、类的生命周期 首先就要了解到类的生命周期。 从第一步到第五步就是类的加载。...

Corp_Marcheon的博客 256

Java类加载器

Java 类加载器的作用是寻找类文件,然后加载 Class 字节码到 JVM 内存中,连接(验证、准备、解析)并初始化,最终形成可以被虚拟机直接使用的 Java 类型。

黎明鱼儿 602

类加载过程和类加载器

详解编译期处理、类加载阶段、类加载器、运行期优化

真滴不可理喻的博客 985
上一篇: Java--GUI图形用户界面编程(计算器,贪吃蛇)
下一篇: Java进阶--注解与反射
likehack
博客等级 码龄8年 526粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

likehack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值