当前位置:   article > 正文

JVM类加载

JVM类加载

前言

准确来说,类加载就是.class文件,从文件(硬盘)被加载到内存中(元数据区)的过程。
JVM内存分布
在这里插入图片描述

一、加载

把.class文件找到的,打开文件,读文件,把文件内容读到内存中

双亲委派机制

找.class文件的基本过程
JVM中内置了三个类加载器
BootstrapClassLoader:加载标准库中的类
ExtensionClassLoader:加载扩展类(非标准库,但是是Sun/Oracle扩展)
ApplicationClassLoader:负责加载项目中自己写的类,或者第三库的类
具体加载类的过程在这里插入图片描述

为什么不一开始就从Bootstrap开始?

1.JVM在这块的代码实现是递归
2.保证Bootstrap先加载
如果用户自己写了一个Java.lang.String类,如果从上往下就会将java程序中所有的就会替换掉所有使用到String的地方

二、连接

1.验证

检查.class文件格式对不对
.class文件是一个二进制文件,格式许符合JVM虚拟机规范,官方文档上有详细描述。https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

2.准备

给类对象分配内存空间(先在元数据区占个位置,内存初始化为全0),也会使静态成员变量被设置为0值

3.解析

初始化字符串常量。
把符号引用转为直接引用:
字符串常量,得有一块内存空间,存这个字符的实际内容,还有引用,来保存这个内存空间的其实地址
在类加载之前,字符串常量处在.class文件中。此时的引用记录的不是字符串真正的地址,而是它在文件中的偏移量(或者说是个占位符,来描述这个字符串)
类加载之后,才把这个字符串放到内存中。此时才有内存地址,符号引用才能被赋值为内存地址

三、初始化

调用构造方法,进行成员初始化,执行代码块,静态代码块,加载父类…

类加载的时机

不是Java程序一运行,就把所有的类都加载了,而是真正用到了才加载(懒汉模式)
1.构造类的实例
2.调用类的静态变量/静态属性
3.加载子类,就会先加载父类
加载过后就不用重复加载了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/397713
推荐阅读
相关标签
  

闽ICP备14008679号