类加载简介
来源:互联网 发布:韩国历史课本 知乎 编辑:程序博客网 时间:2024/04/30 09:03
一. 加载
“加载”是“类加载“过程的一个阶段。在这个阶段,JVM以字节流的形式获取.class文件,转化为方法区运行时数据结构,并在方法区生成Class对象(由此可知,Java中并不是所有对象都在堆中分配)。
二. 连接(一个比较重要的阶段,可以细分为三个小阶段)
连接阶段,目的是将已经加载到内存的类的字节流放到JVM的运行时环境,为初始化做好准备。
当然,把一个类带入自己的内部环境之前,JVM肯定会验证其合法性、可靠性,尽可能的保证这个类进入环境之后能正常运作,并防止其对JVM造成破坏,就像公司招人之前也会对应聘者进行各种考核一样,这个过程就是验证阶段。
如果验证通过,那么JVM就会让这个类做好准备,做准备的过程就是将类变量(static类型的变量)分配内存(在方法区中分配),并设置初始值的过程,注意是设置初始值(各类型的零值),并不是赋值,赋值要等到初始化阶段才进行。
如 public static int value=1;
这个阶段过后value值为0,这就是准备阶段
准备好了以后,JVM就会将常量池中的符号引用替换为直接引用。在这个阶段之前,该类所拥有的字段、方法的信息并不是直接记录的,而是存储在字段表和方法表中,经过这个阶段的解析之后字段和方法的引用将直接指向目标。这就像周杰伦的半岛铁盒,服务员告诉他:“楼上右转第二排的架子上就有了“,这时半岛铁盒对周杰伦来说就是符号引用。等杰伦走到楼上第二排的架子前,半岛铁盒已经触手可及,这时就变成了直接引用了。而半岛铁盒放在什么地方,不同的店会有所不同。同理,不同的JVM解析出来的引用也会不同。这个例子在细节上不是很恰当,但是从“半岛铁盒相对于杰伦的状态变化”上看,我认为可以帮助理解这个转换。这就是解析阶段。
三. 初始化
类加载的最后一个阶段就是初始化,这个“初始化“!=“实例化”。初始化阶段,开始真正的执行程序代码,初始化类变量等。这个阶段会执行类中定义的静态代码块。类变量与静态块按其在类中定义的先后顺序执行。
需要注意:
① 静态块不能访问定义在她之后的变量。
② 初始化子类之前会先初始化其父类
③ 接口初始化时,不会初始化其父接口
文章内容整理自《深入理解Java虚拟机》
- Java类加载简介
- 类加载简介
- 类加载器简介
- 类加载器---类加载器简介
- JVM类加载机制简介
- Java类加载器简介
- seaJs 加载器简介
- 图片加载库简介
- jvm(一)类的加载,连接,初始化简介
- Tomcat类加载器(附JVM类加载器简介)
- java类加载器及常用java应用服务器类加载机制简介
- FPGA在线加载模式简介
- spring bean加载对象简介
- Launcher源码浅析-----涉及Workspace界面资源加载重要类和资源文件简介
- Hibernate 的延迟加载(懒加载)简介1
- Hibernate 的延迟加载(懒加载)简介2
- Zend Framework 自动加载之一:简介
- WebView简介(加速加载篇)
- Java学习笔记之Swing(三)
- mac如何反编译apk
- 欢迎使用CSDN-markdown编辑器
- TimeFormat 工具类 时间格式话
- SequoiaDB巨杉数据库2.6版本正式发布啦
- 类加载简介
- Java_HashMap的工作原理(Jdk1.8)
- UIKit框架
- 野指针
- 基础总结篇之五:BroadcastReceiver应用详解
- 虚拟机的安装
- CentOS6.5 安装VNC并开机自启
- ITMS-90530 "Invalid MinimumOSVersion. Apps that only support 64-bit devices must specify a deplyment
- Dns.GetHostName(); Process.GetCurrentProcess().ProcessName;