一篇文章总结幸运快三平台出租了JVM类加载机制

1.加载幸运快三平台出租haozbbs.comQ1446595067
把二进制表示的Class文件读进JVM中
2.连接

验证(验证字节码的有效性)
准备(初始化静态变量的值)
解析(把符号引用转直接引用)

3.初始化
为静态变量赋值
二、什么时候需要开始加载类?

1.主动引用时需要加载类

使用new 关键字实例化对象
读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)
调用一个类的静态方法

2.被动引用时不需要加载类

在子类中引用父类的静态属性,不会触发子类的加载
通过数组定义来引用类,不会触发此类的初始化(会由虚拟机自动生成的、直接继承于Object的子类,创建动作由字节码指令newarray触发,含有数组中应有的属性和方法,都实现在这个类里)
常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,不会触发定义常量的类的初始化(加final)

3.关于接口的特殊说明
当一个类在初始化时,要求其父类全部都已经初始化过,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候才会初始化
三、详细过程解析
1.加载

普通类的加载过程:

通过一个类的全限定名来获取定义此类的二进制字节流
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

数组类的加载过程:

如果数组的组件类型是引用类型,那就递归采用本节中定义的加载过程去加载这个组件类型,数组C将在加载该组件类型的类加载器的类名称空间上被标识
如果数据的组件类型不是引用类型,虚拟机会把数组C标识为与引导类加载器关联
数组类的可见性与它的组件类型的可见性一致,如果组件类型不是引用类型,那数组类的可见性将默认为publish

2.验证

目的:为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机自身的安全。

检验动作

文件格式验证(魔数、主次版本、常量)
元数据验证(是否有父类、父类继承是否正确)
字节码验证(主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的)
符号引用验证(描述的全限定名是否能找到对应的类;类中是否存在符合方法的字段的描述以及简单名称所描述的方法和字段;访问性是否可被当前类访问)

关闭检验动作:-Xverify:none
3.准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配
这时候进行内存分配的仅包括类变量(被static修饰的变量),不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在java堆中
这里初始值是数据类型的零值,实际的值会在初始化阶段才会执行赋值,如果有加上final 那么在准备阶段该变量会直接初始化为属性所指定的值

4.解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

引用的分类:

符号引用(以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可;与虚拟机实现的内存布局无关,引用的目标不一定已经加载到内存中;实现的内存布局可以各不相同,但它们能能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在Class文件格式中)
直接引用(直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄;直接引用和虚拟机实现的内存布局是相关的,同一符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同;有了直接引用,引用的目标必定已经在内存中存在)

发生解析的具体时间:

可在类被被加载器加载时就对常量池中的符号引用进行解析,也可等到一个符号引用将要被使用前才去解析
虚拟机实现可以对第一次解析的结果进行缓存,从而避免解析动作重复进行

解析的动作:

类或接口的解析(把一个从未解析过的符号引用N解析为一个类或接口C的直接引用)
字段解析(会先解析引用字段的类或接口的符号引用,解析后假设用C表示,再判断C类与C类父类中是否包含目标字段)
类与接口方法解析(先解析引用方法的类或接口的符号引用,解析成功用C表示这个类,再判断C类中是否包含目标方法)

5.初始化

在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。

初始化阶段是执行类构造器<clinit>()方法的过程:

<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的
<clinit>()方法与类的构造函数不同,不需要显示调用父类构造器,因为在调用子类的<clinit>()前,父类方法已经执行完毕
父类<clinit>()方法先执行,意味着父类中定义的静态语句块要优先于子类的变量操作
<clinit>()方法不是必须的,如果没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为该类生成<clinit>()方法
接口有变量初始化赋值的操作,所以接口与类一样都会生成<clinit>()方法,接口的实现类在初始化时不会执行接口的<clinit>()方法
虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确的加锁,同步,有多个线程去初始化一个类,那么只有一个线程去执行这个类的<clinit>()方法。

原文地址:http://blog.51cto.com/13864167/2140244

时间: 2024-07-30 06:11:36

一篇文章总结幸运快三平台出租了JVM类加载机制的相关文章

你是程序员,帮我修个电脑吧?吉林快三平台出租

试问有哪个程序员没被要求过帮忙修修电脑.帮忙看看网络怎么了?吉林快三平台出租Q 1152880099  vx: wowotou552  罔 www.1152880099.com/ 如果不是非常亲密的人,那能提出这种要求的人怕是情商智商都有点毛病. 情商上来说,修电脑这种需要高专业度且花个钱就能解决的事情,不适合随便拜托别人;智商上来说--朋友,你见过程序员找工作面试的时候,HR考他怎么修电脑的吗? 生活里这类例子多了去了. 遇到健身教练就想让人帮你3天瘦10斤,还得不打针.不吃药.不节食.不运动

直播答题助手江苏快三平台出租

"世界杯要搞答题直播江苏快三平台出租Q 1152880099  vx: wowotou552  罔 www.1152880099.com/,搜狐准备了百万奖金." 这是近日搜狐董事局主席兼CEO张朝阳在接受媒体采访时,对外界透露的信息. 从今年年初开始,直播答题一路火爆不减. 然而,在众多平台蜂拥进入直播答题领域时,一些问题也逐渐暴露出来,其中,最受关注的莫过于各种辅助类作弊软件的出现. 就在答题者对"答题助手"还处于爱恨交加之际,一则新闻引爆舆论--"百

01MBR分区幸运快三平台搭建结构、DPT分区表、EBR扩展引导

主引导幸运快三平台搭建论坛:haozbbs.com Q1446595067 记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(0柱面,0磁头,1扇区).在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为"主引导记录"(MBR),其后是4个16字节的"磁盘分区表"(DPT),以及2字节的结束标志(55AA).因此,在使用"主引导记录&qu

Yolo系列学习1-Yolov3训练福彩快三平台出租自己的数据

目的:福彩快三平台出租haozbbs.comQ1446595067 实现利用yolov3训练自己的数据集(voc格式) 方法: 1)构建VOC数据集 将你手中的数据集的标注txt修改成voc格式的txt,voc格式如下: 000002.jpg car 44 28 132 121 000003.jpg car 54 19 243 178 000004.jpg car 168 6 298 164 其中第一列为图片名,第二列为目标类别,最后是目标的包围框坐标(左上角和右下角坐标). 批量修改文件名py

何快速的提高快三平台出租嵌入式的水平呢?

随着计算快三平台出租haozbbs.comQ1446595067机行业的发展.智能产品的增多.嵌入式技术也日渐变得流行.但是目前国内从事嵌入式这方面的人才比较稀缺.俗话说物以稀为贵,职位也一样.嵌入式人才稀缺,身价自然就变高了,越有经验价格就越高,看到有这样的机会很多人也就按耐不住了.对于一些非专业的人士来说,怎么样学习嵌入式就成了他们头疼的问题.下面就有小编为大家介绍一下如何快速有效的学习嵌入式. 如何快速的提高嵌入式的水平呢? 1.多动手练习 我国的大学很少让学生有实践能力,尤其是在大量扩招

STM32把SD卡内极速快三平台出租搬运到内部FLASH

STM32操极速快三平台出租haozbbs.comQ1446595067 作访问flash,包括写入数据到flash和从flash读取数据 :https://blog.csdn.net/Ace_Shiyuan/article/details/78196648 这篇文章写得比较明白,但是它写的函数不饱满,没有把Flash充分写满.请看写数组的函数:FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);//写入数据

分布式之抉择分布式锁快三平台出租

为什么写这篇文章?目前网上大部分的基于zookeeper快三平台出租请QQ2952777280[话仙源码论坛]http://hxforum.com [木瓜源码论坛]http://papayabbs.com ,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说,这种老题材,很难写出新创意,博主内心战战兢兢,如履薄冰,文中有什么不严谨之处,欢迎批评.博主的这篇文章,不上代码,只讲分析.(1)在redis方面,有开源redisson的ja

ArrayList.add() 方法吉林快-三平台出租源码解析

吉林快-三平台出租Q1446595067解析源码的方法>>> list.add("hello"); 该方法涉及到的方法被我复制到了一个类中,至于解释,全在注释上.初次解析,别喷我!!! 如有不足望评论,随时补充. package com.nc.sourceCode; import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Arrays;import java.util.Lis

深入快三平台北京赛车平台出租/搭建浅出学Vue开发

Vue对移动端和浏览器版本的支持 因为Vue本身使用快三平台北京赛车平台出租/搭建Q1619668668浅了ECMAScript 5 特性,所以Vue支持所有兼容ECMAScript 5 的浏览器.我们根据下面的图示来解释一下, 红色表示为几乎不支持 黄色表示为大部分支持 (有很小的可能会影响使用) 绿色表示为几乎全部支持(不影响使用) 由上面的图示可以看出来对IE来说,在IE8及其以下的时候,是不支持ECMAScript 5 的,也就是说,是无法使用Vue的.我们看一下对IE8的描述. IE8