深入了解java虚拟机(JVM) 第十一章 类的加载
一、类加载机制概述
虚拟机把描述类的数据从class文件加载到内存并对数据进行效验,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
二、类加载的机制
类加载的过程一共是5个步骤:加载、连接、初始、使用、卸载,其中连接过程中又会进行验证、准备、解析的工作,具体如下:
需要注意的是:
1.类的加载策略采用的是懒加载。
2.在类加载开始后,才会进行连接。
3.只有以下情况才会初始化类:
a.new实例化的类会对该类进行初始化。
b.读取或设置类静态字段的时候(但被final修饰的字段,在编译器时就被放入常量池的静态字段除外static final)。
c.调用类静态方法的时候。
e.使用反射对类进行反射调用的时候。
f.当一个类初始化时,要先对其父类进行初始化。
g.主类或启动类(main)。
h.当使用JDK1.7的动态语言支持时,如果一个java.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。
三、加载
1.加载的过程
1)通过一个类的全限定名类获取定义此类的二进制类。
2)将这个字节流所代码的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的class对象,作为这个类的各种数据的访问入口。
2.加载源
由于类的加载本质就是加载二进制流,这个二进制流的来源没有一个固定的规则,所以它可以来自多个地方:
1)文件,如:class文件,jar包
2)网络
3)计算机生成一个二进制流,如:网络代理($proxy),反射包
4)由其他文件生成,如:JSP
5)数据库
四、连接
1.验证
验证是连接的第一步,这一阶段的目的是为了确保class文件的字节流中包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。
验证的方式主要有:
1)文件格式验证;
2)元数据验证;
3)字节码验证;
4)符合引用验证。
2.准备
准备阶段正式为类变量分配内存并设置变量的初始值。这些变量使用的内存都将在方法区中进行分配。
需要注意的是:这里的初始值并非我们指定的值,而是数据类型的默认值,如:int类型的默认值为0;float类型的默认值为0.0
但是如果被final修饰,那么这个过程中,常量值会被一同指定。
3.解析
解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程,主要分为以下几类:
1)类或者接口解析
2)字段解析
3)类方法解析
4)接口方法解析
五、初始化
初始化是类加载的最后一步,简单的说,类的初始化就是执行<clinit>方法的过程,类的初始化主要以下几种情况:
1.子类的<clinit>在执行之前,虚拟机保证父类的<clinit>方法先执行完毕。
2.接口中有变量要赋值,也会生成<clinit>,但不需要先执行父接口的<clinit>方法,只有父接口中定义的变量使用时才会初始化
3.如果多个线程同时初始化一个类,那么只有一个线程会执行这个类的<clinit>方法,其他线程等待执行完毕。如果方法执行时间过长,那么就会造成多个线程阻塞。由此我们就可以知道线程阻塞可能会出现的原因:线程执行类初始化时死掉了。
4.<clinit>方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是有语句在源文件中出现的顺序决定的。静态语句块中只能访问定义在静态语句块之前的变量,定义在它之后的变量,在前面的语句中赋值,但是不能访问。
深入了解java虚拟机(JVM) 第十一章 类的加载的更多相关文章
- JVM虚拟机系列(一)类的加载
JAVA虚拟机系列(一) 类的加载 目录 1 类的初始化过程 2 详解初始化时的各个阶段 一.类初始化的过程 先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class ---> ...
- JVM详解之:类的加载链接和初始化
目录 简介 加载 运行时常量池 类加载器 链接 验证 准备 解析 初始化 总结 简介 有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化 ...
- 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制
转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...
- 《深入理解Java虚拟机》-----第6章 类文件结构——Java高级开发必须懂的
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 6.1 概述 记得在第一节计算机程序课上我的老师就讲过:“计算机只认识0和1,所以我们写的程序需要经编译器翻 ...
- 《深入理解java虚拟机》第六章 类文件结构
第六章 类文件结构 6.2 无关性的基石 各种不同平台的虚拟机与所有的平台都统一使用的程序存储格式--字节码(ByteCode)是构成平台无关性的基石.java虚拟机不和包括java在内的任何语言 ...
- (六)《Java编程思想》——初始化及类的加载顺序
package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- Java虚拟机JVM学习05 类加载器的父委托机制
Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
随机推荐
- vs配置D3D开发环境
其实很简单直接上图吧: 主要include和lib目录指定: $(DXSDK_DIR)Include $(DXSDK_DIR)Lib\x86 下面是连接器-输入项: 主要包含: dxgi.libdxg ...
- sql日期查询
select getdate() ,getdate()) ,getdate()) ) ,getdate())) ,getdate())) Select datename(weekday, getdat ...
- UGUI 事件穿透规则
UGUI事件分为两大类:点击和拖拽. 点击包括 pointerdown, pointerup. 拖拽包括 begindrag, drag, enddrag. 点击事件无穿透:只会被最上层UI响应,不会 ...
- 迷你MVVM框架 avalonjs 1.2.6发布
avalon.mobile 针对GCC压缩器进行优化 avalon.mobile对浏览器是否支持触屏使用更好的判定 监控数组的splice,remove,removeAt进行了重构,修改直接删掉列表的 ...
- FP变更物料编码(增加尾缀)
FP物料编码增加尾缀的程序,标准物料编码是18位,目前程序中增加尾缀的有三种1.DUMMY 2.SP开头 3.P开头 4.C开头 5.BP对应处理程序如下:1.DUMMY SAP_MATE ...
- selenium IDE测试中的坑
selenium IDE工具是firefox自带的一个网页自动化测试工具,因为它是IDE所以它很方便使用,但也因为它是IDE所以它有那么些坑. 问题:selenium回放中timeout问题 网页的打 ...
- 11. Container With Most Water 装水最多的容器
[抄题]: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...
- gsm
libosmocore Osmocom-BB wireshark 拦截一个短信内容
- 斜杠反斜杠,去空格\xa0,连接函数join()
1斜杠反斜杠 斜杠:/.反斜杠:\. 反斜杠\,在windows系统中用来表示目录. 而在unix系统中,/表示目录.由于web遵循unix命名,所以在网址(URL)中,/表示目录. 在unix系统中 ...
- kaggle-泰坦尼克号Titanic-3
根据以上两篇的分析,下面我们还要对数据进行处理,观察Age和Fare两个属性,乘客的数值变化幅度较大!根据逻辑回归和梯度下降的了解,如果属性值之间scale差距较大,将对收敛速度造成较大影响,甚至不收 ...