类加载机制学习补充

开源网格划分软件-Gmsh二次开发教程 (4)网格生成与控制​ ​本章将深入讲解Gmsh的网格生成技术,包括全局/局部网格控制、边界层生成、自适应细化等,并提供完整的代码示例。 阅读详情

一、准备阶段

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。对于该阶段有以下几点需要注意:

1、这时候进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在Java堆中。

2、这里所设置的初始值通常情况下是数据类型默认的零值(如0、0L、null、false等),而不是被在Java代码中被显式地赋予的值。

假设一个类变量的定义为:public static int value = 3;那么变量value在准备阶段过后的初始值为0,而不是3,因为这时候尚未开始执行任何Java方法,而把value赋值为3的putstatic指令是在程序编译后,存放于类构造器clinit()方法之中的,所以把value赋值为3的动作将在初始化阶段才会执行。

3、如果类字段的字段属性表中存在ConstantValue属性,即同时被final和static修饰,那么在准备阶段变量value就会被初始化为ConstValue属性所指定的值。

但是注意,并不是变量拥有ConstValue属性,就会在准备阶段被赋初值,前提是必须是static修饰的类字段。比如变量定义 public final int value = 3;value 字段也会存在ConstantValue属性,但是其赋值是在实例构造器init方法中执行的。

关于类构造器clinit()与实例构造器init()方法的解释,其中也测试了关于静态代码块,非静态代码块,变量初始化语句,构造函数的执行顺序问题,值得一看。
参考文章https://blog.youkuaiyun.com/lerous/article/details/113760668

public class Demo {

    public static final Super s = new Super();
    public static final int a = 1;
    public static int b = 2;

    public final int c = 2;
    public final int d;
    public int e = 2; // 初始化语句的执行优先级高于构造器,与代码块的执行顺序取决于位置顺序

    public Demo() {
        d = 4;
//        e = 6;
    }

    {

        b = 3;  // 多个"{}"按先后顺序最终合并到<init>中
//        d = 2;  // 代码块的优先级高于构造函数中的赋值动作,与代码位置无关,注释放开会导致构造器中的d=4语句报错
        e = 5;  // 提示此语句是无用的赋值,因为始终会被唯一构造方法中的e=6覆盖掉
    }


    public static void method() {
        int a = 1;
    }

    public void method2() {
        String s = "method2";
    }

    public final int method3() {
        return 5;
    }

    static {
//        int t = f; // 报错,非法向前引用,静态语句块对于定义在其后的边量,只能进行赋值,但不能访问
        b = 5;   // 静态代码块与静态变量的赋值语句的执行顺序取决于代码的位置顺序,多个静态块按顺序合并到cinit方法中
    }

    public static int f = 7;

    public static void main(String[] args) {

    }
}

再看一下反编译class文件的内容

Classfile /C:/Users/Administrator/Desktop/Demo.class
  Last modified 2022-2-10; size 772 bytes
  MD5 checksum 4ef38358d697751706e61bc7e6256ea4
  Compiled from "Demo.java"
public class Demo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #12.#38        // java/lang/Object."<init>":()V
   #2 = Fieldref           #11.#39        // Demo.c:I
   #3 = Fieldref           #11.#40        // Demo.b:I
   #4 = Fieldref           #11.#41        // Demo.e:I
   #5 = Fieldref           #11.#42        // Demo.d:I
   #6 = String             #30            // method2
   #7 = Class              #43            // Super
   #8 = Methodref          #7.#38         // Super."<init>":()V
   #9 = Fieldref           #11.#44        // Demo.s:LSuper;
  #10 = Fieldref           #11.#45        // Demo.f:I
  #11 = Class              #46            // Demo
  #12 = Class              #47            // java/lang/Object
  #13 = Utf8               s
  #14 = Utf8               LSuper;
  #15 = Utf8               a
  #16 = Utf8               I
  #17 = Utf8               ConstantValue
  #18 = Integer            1
  #19 = Utf8               b
  #20 = Utf8               c
  #21 = Integer            2
  #22 = Utf8               d
  #23 = Utf8               e
  #24 = Utf8               f
  #25 = Utf8               <init>
  #26 = Utf8               ()V
  #27 = Utf8               Code
  #28 = Utf8               LineNumberTable
  #29 = Utf8               method
  #30 = Utf8               method2
  #31 = Utf8               method3
  #32 = Utf8               ()I
  #33 = Utf8               main
  #34 = Utf8               ([Ljava/lang/String;)V
  #35 = Utf8               <clinit>
  #36 = Utf8               SourceFile
  #37 = Utf8               Demo.java
  #38 = NameAndType        #25:#26        // "<init>":()V
  #39 = NameAndType        #20:#16        // c:I
  #40 = NameAndType        #19:#16        // b:I
  #41 = NameAndType        #23:#16        // e:I
  #42 = NameAndType        #22:#16        // d:I
  #43 = Utf8               Super
  #44 = NameAndType        #13:#14        // s:LSuper;
  #45 = NameAndType        #24:#16        // f:I
  #46 = Utf8               Demo
  #47 = Utf8               java/lang/Object
{
  public static final Super s;
    descriptor: LSuper;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL

  public static final int a;
    descriptor: I
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    ConstantValue: int 1

  public static int b;
    descriptor: I
    flags: ACC_PUBLIC, ACC_STATIC

  public final int c;
    descriptor: I
    flags: ACC_PUBLIC, ACC_FINAL
    ConstantValue: int 2

  public final int d;
    descriptor: I
    flags: ACC_PUBLIC, ACC_FINAL

  public int e;
    descriptor: I
    flags: ACC_PUBLIC

  public static int f;
    descriptor: I
    flags: ACC_PUBLIC, ACC_STATIC

  public Demo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: iconst_2
         6: putfield      #2                  // Field c:I
         9: iconst_3
        10: putstatic     #3                  // Field b:I
        13: aload_0
        14: iconst_5
        15: putfield      #4                  // Field e:I
        18: aload_0
        19: iconst_4
        20: putfield      #5                  // Field d:I
        23: aload_0
        24: bipush        6
        26: putfield      #4                  // Field e:I
        29: return
      LineNumberTable:
        line 11: 0
        line 7: 4
        line 17: 9
        line 19: 13
        line 12: 18
        line 13: 23
        line 14: 29

  public static void method();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=1, args_size=0
         0: iconst_1
         1: istore_0
         2: return
      LineNumberTable:
        line 24: 0
        line 25: 2

  public void method2();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=1
         0: ldc           #6                  // String method2
         2: astore_1
         3: return
      LineNumberTable:
        line 28: 0
        line 29: 3

  public final int method3();
    descriptor: ()I
    flags: ACC_PUBLIC, ACC_FINAL
    Code:
      stack=1, locals=1, args_size=1
         0: iconst_5
         1: ireturn
      LineNumberTable:
        line 32: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=0, locals=1, args_size=1
         0: return
      LineNumberTable:
        line 43: 0

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=2, locals=0, args_size=0
         0: new           #7                  // class Super
         3: dup
         4: invokespecial #8                  // Method Super."<init>":()V
         7: putstatic     #9                  // Field s:LSuper;
        10: iconst_2
        11: putstatic     #3                  // Field b:I
        14: iconst_5
        15: putstatic     #3                  // Field b:I
        18: bipush        7
        20: putstatic     #10                 // Field f:I
        23: return
      LineNumberTable:
        line 3: 0
        line 5: 10
        line 36: 14
        line 39: 18
}
SourceFile: "Demo.java"

对比着简单了解一下字节码指令

二、解析阶段

类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。

对于红字部分如何理解,什么情况下,解析阶段在初始化阶段之后开始?又如何关系到动态绑定?
在这里插入图片描述再参考一篇关于动态绑定的文章:https://www.cnblogs.com/ShaneZhang/p/4972550.html

Java是一门面向对象的编程语言,优势就在于支持多态(Polymorphism)。多态使得父类型的引用变量可以引用子类型的对象。如果调用子类型对象的一个虚方法(非private,final or static),编译器将无法找到真正需要调用的方法,因为它可能是定义在父类型中的方法,也可能是在子类型中被重写(override)的方法,这种情形,只能在运行时进行解析,因为只有在运行时期,才能明确具体的对象到底是什么。这也是我们俗称的运行时或动态绑定(runtime or dynamic binding)。

结合代码demo,理解一下。

public class Demo2 {
    public static void main(String[] args) {
        Super s = new Son();
        s.toString();
        s.method();
        s.method2();
        Super.method3();
    }
}

public class Super {

    void method() {
        // 被子类重写
    }

    void method2() {
    }

    static void method3() {
    }
}

public class Son extends Super {

    @Override
    void method() {
        super.method();
    }
}

对Demo2反编译后的字节码内容,主要看main方法

Classfile /C:/Users/Administrator/Desktop/Demo2.class
  Last modified 2022-2-10; size 427 bytes
  MD5 checksum ddabcb21a153230b2b2cef3df7ece4f2
  Compiled from "Demo2.java"
public class Demo2
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #9.#18         // java/lang/Object."<init>":()V
   #2 = Class              #19            // Son
   #3 = Methodref          #2.#18         // Son."<init>":()V
   #4 = Methodref          #9.#20         // java/lang/Object.toString:()Ljava/lang/String;
   #5 = Methodref          #21.#22        // Super.method:()V
   #6 = Methodref          #21.#23        // Super.method2:()V
   #7 = Methodref          #21.#24        // Super.method3:()V
   #8 = Class              #25            // Demo2
   #9 = Class              #26            // java/lang/Object
  #10 = Utf8               <init>
  #11 = Utf8               ()V
  #12 = Utf8               Code
  #13 = Utf8               LineNumberTable
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               SourceFile
  #17 = Utf8               Demo2.java
  #18 = NameAndType        #10:#11        // "<init>":()V
  #19 = Utf8               Son
  #20 = NameAndType        #27:#28        // toString:()Ljava/lang/String;
  #21 = Class              #29            // Super
  #22 = NameAndType        #30:#11        // method:()V
  #23 = NameAndType        #31:#11        // method2:()V
  #24 = NameAndType        #32:#11        // method3:()V
  #25 = Utf8               Demo2
  #26 = Utf8               java/lang/Object
  #27 = Utf8               toString
  #28 = Utf8               ()Ljava/lang/String;
  #29 = Utf8               Super
  #30 = Utf8               method
  #31 = Utf8               method2
  #32 = Utf8               method3
{
  public Demo2();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 7: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: new           #2                  // class Son
         3: dup
         4: invokespecial #3                  // Method Son."<init>":()V
         7: astore_1
         8: aload_1
         9: invokevirtual #4                  // Method java/lang/Object.toString:()Ljava/lang/String;
        12: pop
        13: aload_1
        14: invokevirtual #5                  // Method Super.method:()V
        17: aload_1
        18: invokevirtual #6                  // Method Super.method2:()V
        21: invokestatic  #7                  // Method Super.method3:()V
        24: return
      LineNumberTable:
        line 10: 0
        line 11: 8
        line 12: 13
        line 13: 17
        line 14: 21
        line 15: 24
}
SourceFile: "Demo2.java"

注意到,9、14、18、21这几个指令都属于上面提到的必须在使用前对字符引用进行解析,这里的字符引用即#4、#5、#6、#7,分别对应几个方法,联系动态绑定的那篇文章,应该就比较清晰了。
在这里插入图片描述

MNI152 坐标空间和 fsaverage 坐标空间相互转换, 如已知fsaverage空间的坐标如何求MNI152 坐标?aparc.a2009s.annot转化到MNI152空间? 大多数神经影像学研究的结果是在体积(例如,MNI152)或表面(例如,fsaverage)坐标系中报告的。体积坐标系和表面坐标系之间的准确映射可以促进许多应用,例如将 fMRI 组分析从 MNI152 投影到 fsaverage 以进行可视化或从 fsaverage 投影静息状态 fMRI 分区对 MNI152进行新数据的体积分析。Wu et al., 2018 评估了三种在 MNI152通过模拟上述应用的 Colin27 和 fsaverage 坐标系:将组平均数据从 MNI152/Colin27 投影到 阅读详情

相关推荐

H3C-V7防火墙配置SSL VPN IP资源典型案例(华三)

H3C-V7防火墙配置SSL VPN IP资源典型案例(华三)

m0_68265458的博客 5170

【刨根问底】之JVMpart4(类加载机制深入详解、动态绑定与静态绑定、class对象、klass-oop模型、类加载器、Launcher类、双亲委派机制与命名空间、ClassLoader类)

1.类加载机制详解 1.1类加载的定义 当程序运行至主动需求使用某个类的数据,而JVM中并不存在该类时,JVM将会通过加载、连接、初始化三个步骤来对该类进行加载,这一系列的三步操作被合称为类的加载或者类的初始化 1.2类加载的时机 在java的实现方案中,类型的加载是时机是运行期间加载的 显然,动态加载将会带来更大的灵活性,但是对于性能来说似乎并不是优秀的方案,jvm将要设法避免发生程序运行至某处后需要暂停等待类加载完毕才能继续向下运行的窘境 因此,jvm进行的是预测可能会使用的类进行预加载,也因此,在加载

qq_43575457的博客 120

网络工程系统CAD图:从设计到落地的关键技能与实战指南

网络工程并不只是配置路由器和交换机,真正的核心在于将设计方案转化为可施工的物理图纸。网络工程系统CAD图正是连接逻辑设计与物理世界的桥梁,它涵盖综合布线、信息点布置、桥架路由、弱电间规划等关键内容。理解并掌握这套图纸体系,是网络工程师从基础设备调试走向项目主导者、弱电总工乃至网络架构师的重要分水岭。在园区网、数据中心、智能楼宇等真实场景中,一套规范的系统CAD图直接决定了施工质量、验收效率与后期运维的可靠性。本文从基础概念出发,拆解图纸的组成层次、绘制流程和软件工作流,并结合学习路线与就业方向,帮助初学者建

weixin_33860553的博客 391

初次走上技术管理岗位的思考总结,太完整了!

写在前面 最近,很多小伙伴出去面试都被问到了Spring问题,关于Spring,细节点很多,面试官也非常喜欢问一些很细节的技术点。所以,在 Spring 专题中,我们尽量把Spring的每个技术细节说清楚,将透彻。 概述 自定义组件要想使用Spring容器底层的一些组件(比如:ApplicationContext、BeanFactory等),此时,只需要让自定义组件实现XxxAware接口即可。此时,Spring在创建对象的时候,会调用XxxAware接口定义的方法,注入相关的组件。 类的生命周期 类从被加

m0_56662547的博客 1584

ElasticSearch 集群安全加固实战:从零配置TLS证书与密码认证

本文提供了一份详尽的ElasticSearch集群安全加固实战指南,重点介绍了如何从零开始配置TLS证书与用户安全认证。通过分步讲解证书生成、节点配置、集群重启及密码设置,帮助管理员为ES集群构建通信加密与访问控制的双重防线,有效提升数据安全性与合规性。

weixin_29323493的博客 444

Google AdSense收款前必做:W-8BEN税务认证的3个关键选择与1个提交时机小技巧

本文深入解析Google AdSense收款前必须完成的W-8BEN税务认证,重点介绍账号类型选择、特殊税率勾选、美国活动界定等3个关键决策,并分享提交时机的小技巧,帮助站长高效通过审核,确保广告收入顺利到账。

weixin_30443731的博客 678

虚拟机类加载机制(五)——类加载的过程(准备)

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。需要强调的是,这个时候进行内存分配的仅包括类变量,即被static修饰的变量,不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在java堆中。其次,这里所说的初始值通常情况下是数据类型的零值,假设一个类变量的定义为: public static int value = 123;...

Dream_Ryoma的博客 310

PCL点云库入门(第6讲)——PCL库中Eigen数学工具库的基本使用(持续更新)

Eigen库是一个高性能的C++模板库,专注于线性代数、矩阵和向量运算,以及相关的数值分析和算法。在Eigen库中,所有的矩阵和向量均被视为矩阵模板类的实例。向量可以被看作是特殊形式的矩阵,具体表现为只包含1行或1列。

qq_36812406的博客 1755

JVM概览

JVM概览

李达 1374

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

GPU硬件架构与微架构深度解析28-稀疏计算:稀疏矩阵计算的硬件支持

本文介绍了GPU加速稀疏计算的关键技术。主要内容包括:1)稀疏数据的存储格式(COO、CSR、CSC)及其特点;2)现代GPU的稀疏计算硬件优化,如NVIDIA的稀疏张量核心和内存访问优化;3)稀疏计算在推荐系统、NLP和科学计算等领域的应用案例;4)性能优化技巧,包括存储格式选择、硬件特性利用和混合精度计算等。文章指出,专用稀疏计算技术可显著提升AI和大规模科学计算的效率,相比传统方法可获得5-10倍的性能提升。

2301_79143213的博客 114

【JVM学习一】Java类加载机制

类加载机制

qq_41662694的博客 969

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM-类加载机制

Java虚拟机会把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。与那些在编译时需要进行链接的语言不通,在Java语言里面,类型的加载、连接和初始化都是在程序运行期间完成的,这种策略会让Java语言进行提前编译时面临额外的困难,也会让类加载时稍微增加一些性能开销,但是却为Java应用提高了极高的扩展性和灵活性,Java天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特性实现的。

qq_63003916的博客 1573

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java类加载机制_浅谈JVM之java类加载机制

前言在我们正常的工作中,因为我们的某个也无需求,我们去调用某一个类时,如果此时该类还未加载到内存中去,那么JVM就会通过加载、连接、初始化3个步骤对该类进行初始。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。知识补充:我们学习jvm类加载机制的时候,说到过一个加载顺序的问题,如下:局部代码块 构造代码块 静态代码块 成员变量 静态变量执行顺序是什么?局部...

weixin_40003046的博客 74

JVM--详解类加载机制

JVM--详解类加载机制转载:https://blog.youkuaiyun.com/championhengyi/article/details/78680700Java虚拟机的体系结构前面我们探讨了Class文件的结构,如果你还没有学习,将不利于这部分知识的吸收与掌握,所以请移步:JVM–Class类文件结构(一)学习一个东西之前,我们务必要知道,这东西大概是干什么的,有什么作用。为了更清楚的阐释类加载机...

stay hungry ! stay foolish! 1万+

JVM类加载机制与类加载器

类加载机制 类加载流程的目的:把一份被javac编译过的class文本文件,通过加载生成某种形式的Class数据结构进入内存,程序可以调用这个数据结构来构造出Object。 这个过程是在运行时进行的,所以这也是Java动态拓展性的根基。 来看《深入理解JVM》中的一张图: 这张图其实展示了一个类的生命周期,在最开始加上javac编译阶段显得更完整。而**“类加载”只包括加载、连接、初始化这3个过程**。 区分“类加载”与“加载”:“加载”只是“类加载”的第一个环节 “解析”部分是灵活的,它可

小和尚的修行庙 368

学习笔记分享-jvm-类加载器(双亲委派机制、线程上下文类加载器)

学习笔记分享-jvm-类加载器(双亲委派机制、线程上下文类加载器)

2301_81243975的博客 993

JVM学习笔记(四):JVM类加载机制

引子 在上一篇文章《JVM学习笔记(三):Java内存模型》中,我总结了Java内存模型相关的一些知识。接下来,我将继续,参考着周志明老师的《深入理解Java虚拟机》,以及一些自己查阅的书籍、资料,总结一下JVM类加载机制相关的知识。 参考文档 1、《深入理解Java虚拟机》第三版,周志明 著,第七章。 ...

蛋壳城堡 354

类加载机制

这块内容尚没有学习,有待补充!!!!

JavaAlliance 501

详解类加载机制

JVM--详解类加载机制Java虚拟机的体系结构前面我们探讨了Class文件的结构,如果你还没有学习,将不利于这部分知识的吸收与掌握,所以请移步:JVM–Class类文件结构(一)学习一个东西之前,我们务必要知道,这东西大概是干什么的,有什么作用。为了更清楚的阐释类加载机制到...

xianrenqiu1234的博客 525

【JVM学习】类加载子系统

文章目录一、类加载器子系统1.1 JVM体系结构1.2 类加载器子系统作用1.3 类的加载过程(1)加载阶段(2)链接阶段(3)初始化阶段二、类加载器2.1 类加载器的分类2.2 虚拟机自带的加载器2.3 用户自定义类加载器2.4 ClassLoader类三、双亲委派机制3.1 工作原理3.2 双亲委派机制举例3.3 双亲委派机制的优势3.4 沙箱安全机制四、补充5.1 比较class对象5.2 类的主动使用和被动使用参考 一、类加载器子系统 1.1 JVM体系结构 JVM被分为三个主要的子系统: (1)

Stay Hungry, Stay Foolish! 912

JVM学习笔记(三)---类加载器补充

类加载器自上而下的分为 bootstrap classloader -> ext classloader -> system classloader ->user defined classloader     除了bootstrap classloader在代码层面无法获得其引用外,其余都可以通过ClassLoader.getSystemClassLoader()获得系统class load

hzllblzjily的专栏 408

深入学习Java虚拟机:类加载机制与类加载器

Java虚拟机-类加载机制与类加载器 Java中类加载、连接和初始化的过程都是在程序运行期间完成的,这些策略虽然会令类加载时增加些性能开销,但是会提高java的灵活性。Java动态扩展的特性就是依赖运行期动态加载和动态连接的特点实现的。   JVM类加载机制 Java源代码被编译为字节码文件后,需要加载进内存才能在程序中被使用。程序启动时并不会一次性加载程序要用的所有class文件,而是根...

晋文子上的博客 1877

JVM学习(一)类加载子系统

类加载器子系统 idea安装插件jclasslib Bytecode viewer,能方便查看字节码 什么是类的加载? 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验转换解析和初始化最终形成可以被虚拟机直接使用的java类这就是虚拟机的类加载机制,这个过程通过类加载器子系统完成。 与那些在编译时需要进行连接工作的语言不同在java语言中类型的加载连接和初始化过程都是在程序运行期间完成的这种策略虽然会令类加载时稍微增加一些性能开销,但是为java感用程序提供高度的灵活性java里天生可以动态

ZeroLinDD的博客 372

JVM——类加载器基础讲解

JVM——类加载器基础讲解

AIAIAIXIAO_的博客 1080

jvm学习笔记6:类加载器

目录1. 类与类加载器2. 双亲委派机制二级目录三级目录 1. 类与类加载器 对于任意一个类,都需要有加载它的类加载器和这个类本身一同确认其在java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。 子类可以访问到父类加载器加载的类,父类 2. 双亲委派机制 二级目录 三级目录 ...

赐我梦境的博客 364
上一篇: Spring Boot配置文件位置选择
下一篇: Integer.class与int.class与Inte.TYPE
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值