【JVM基础】 JVM 如何加载一个类以及类加载机制

文章目录

1、什么时候一个类会被加载?

1、包含 main 方法的主类

java 复制代码
public class Kafka{

    public static void main(String[] args){
        
    }
}

答案:包含 main 方法的主类, 会在JVM 进程启动之后,将 main 方法所在的主类加载到内存里。然后从 main 方法的入口代码开始。

2、非 包含 main 方法的主类,什么时候去加载?

java 复制代码
public class KafkaManager{
    
}
java 复制代码
public class Kafka{

    public static void main(String[] args){
         KafkaManager kafkaManager = new KafkaManager();       
    }
}

答案:当你需要使用到某个类(KafkaManager.class)去实例化一个对象的时候,类加载器会把 "KafkaManager.class" 字节码文件中的这个类加载到内存中。

3、类加载器如何加载一个类?

1、验证阶段:

答案:根据java虚拟机规范,校验你加载进来的 ".class"文件中的内容,是否符合规范。

2、准备阶段:

答案:加载一个类到内存里,首先需要给这个 "ReplicaManager"类分配一定的内存空间,然后给他里面的类变量(也就是 static 修饰的变量)分配内存空间,来一个默认的初始值。

3、解析阶段:

答案:将符号引用 替换为 直接引用

4、初始化:

答案:执行真正的初始化代码逻辑,static静态代码块中的内容也是在这里执行。

通过 "new ReplicaManager()"实例化类的对象的时候,会触发类的加载到初始化的全过程,然后实例化一个对象出来。

另外,初始化一个类的时候,如果发现他的父类还没有初始化,那么必须先初始化他的父类。

4、父类什么时候加载和初始化?

答案:初始化一个类的时候,发现他的父类还没初始化,那么必须先初始化他的父类

java 复制代码
public class KafkaManager extends AbstractDataManager{
    public static int flushInterval = Configuration.getInt("replicate.flush.interval");

    public static Map<Integer, Replica> replies;

    static{
        loadReplicaFromDisk();
    }

    public static void loadReplicaFromDisk(){
        this.replies = new HashMap<>();
    }
} 

如果你要 "new ReplicaManager()" 初始化这个类的实例,那么就会加载这个类,然后初始化这个类,但是初始化这个类之前,发现 AbstractDataManager 还没有加载和初始化,就需要先加载这个父类,并且初始化这个父类。

4、双亲委派机制

1、类加载器类型

1、启动类加载器:Bootstrap ClassLoader, 负责加载机器上安装java目录下的核心类(java安装目录下有一个lib目录,里面就是java最核心的一些类库)

2、扩展类加载器:Extension ClassLoader, 负责加载java安装目录下的 "lib\ext"目录下的一些类

3、应用类加载器:Application ClassLoader, 负责加载"classPath"环境变量锁指定路径中的类,大概就是加载你写好的java代码。

4、自定义类加载器:根据你自己的需求加载你的类

2、双亲委派机制原理

假设你的应用程序需要去加载一个类,他首先会委派给自己的父类加载器去加载,经过层层床底,最终传递到顶层的类加载器去加载。

但是如果父类加载器在自己负责范围加载的范围内没有找到这个类,就会将加载的权利给自己的子类加载器去进行加载。

简单一点:先去找父类去加载,父类加载不到,就交给儿子来加载,这样可以避免多层级的加载器结构重复加载某些类。

相关推荐
“抚琴”的人6 小时前
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
c#·工业相机·visionpro·机械视觉
FAREWELL000758 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法
CodeCraft Studio8 小时前
Excel处理控件Spire.XLS系列教程:C# 合并、或取消合并 Excel 单元格
前端·c#·excel
我不想当小卡拉米9 小时前
C++:继承+菱形虚拟继承的一箭双雕
开发语言·jvm·c++
勘察加熊人10 小时前
forms实现连连看
c#
hvinsion10 小时前
PPT助手:一款集计时、远程控制与多屏切换于一身的PPT辅助工具
c#·powerpoint·ppt·ppt助手·ppt翻页
时光呢10 小时前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
weixin_3077791311 小时前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
时光追逐者12 小时前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
与火星的孩子对话13 小时前
Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发
人工智能·unity·c#·游戏引擎·语音识别·宠物