赞
踩
准确来说,类加载就是.class文件,从文件(硬盘)被加载到内存中(元数据区)的过程。
JVM内存分布
把.class文件找到的,打开文件,读文件,把文件内容读到内存中
找.class文件的基本过程
JVM中内置了三个类加载器
BootstrapClassLoader:加载标准库中的类
ExtensionClassLoader:加载扩展类(非标准库,但是是Sun/Oracle扩展)
ApplicationClassLoader:负责加载项目中自己写的类,或者第三库的类
具体加载类的过程
1.JVM在这块的代码实现是递归
2.保证Bootstrap先加载
如果用户自己写了一个Java.lang.String类,如果从上往下就会将java程序中所有的就会替换掉所有使用到String的地方
检查.class文件格式对不对
.class文件是一个二进制文件,格式许符合JVM虚拟机规范,官方文档上有详细描述。https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
给类对象分配内存空间(先在元数据区占个位置,内存初始化为全0),也会使静态成员变量被设置为0值
初始化字符串常量。
把符号引用转为直接引用:
字符串常量,得有一块内存空间,存这个字符的实际内容,还有引用,来保存这个内存空间的其实地址
在类加载之前,字符串常量处在.class文件中。此时的引用记录的不是字符串真正的地址,而是它在文件中的偏移量(或者说是个占位符,来描述这个字符串)
类加载之后,才把这个字符串放到内存中。此时才有内存地址,符号引用才能被赋值为内存地址
调用构造方法,进行成员初始化,执行代码块,静态代码块,加载父类…
不是Java程序一运行,就把所有的类都加载了,而是真正用到了才加载(懒汉模式)
1.构造类的实例
2.调用类的静态变量/静态属性
3.加载子类,就会先加载父类
加载过后就不用重复加载了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。