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.加载子类,就会先加载父类
加载过后就不用重复加载了

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 18:34:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 18:34:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 18:34:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 18:34:01       18 阅读

热门阅读

  1. 常见面试题--动态规划介绍(附C++源码实现)

    2024-04-06 18:34:01       21 阅读
  2. c++ 动态分配内存

    2024-04-06 18:34:01       19 阅读
  3. 深入理解springboot

    2024-04-06 18:34:01       50 阅读
  4. 【Datax分库分表导数解决方法】MySQL_to_Hive

    2024-04-06 18:34:01       48 阅读
  5. 蓝桥杯嵌入式总结

    2024-04-06 18:34:01       13 阅读