- 浏览: 164752 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
GreatExpectations:
666可以可以哦
js并行加载,顺序执行 -
yiway:
如果是跨域的话,window.parent是拒绝访问的(由于w ...
利用HTML5的window.postMessage实现跨域通信 -
yiway:
如果是跨域的话,window.parent是决绝访问的(由于w ...
利用HTML5的window.postMessage实现跨域通信
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo5
JVM:加载、链接和初始化
JVM要解释Java字节码,就必须对所需的类和接口执行如下3步操作:
(1) 加载:JVM在加载类时,会查找该类或该接口的二进制表示,并根据找到的二进制表示(通常是由Java编译器创建的类文件)创建一个Class对象。该Class对象中封装了类或接口的运行时状态。
由类加载器执行,该步骤将查找字节码,并从这些字节码中创建一个class对象。
(2) 链接:链接这一过程是指取得已加载的类或接口、结合JVM运行时环境、准备执行该类或该接口。
在链接阶段将验证类中的字节码,为静态域分配内存空间,并且如果必须的话,将解析这个类创建的对其他类的引用。
(3) 初始化:初始化是指JVM调用该类或该接口的初始化方法。
如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。
初始化延迟到了对静态方法(构造器默认也是静态的)或者非常数静态域进行首次引用时才执行
1. 第一步
启动一个单机Java程序时,JVM首先做的是另外创建一个Class对象,用于表示包含public static void main(String [ ] args)方法的Java类。然后JVM会链接并初始化该Java类,调用main()方法,并用main()方法驱动所引用的其他类和接口的加载、链接和初始化过程。
2. 加载
加载过程是由类加载器完成的,该加载器是ClassLoader的子类,并且该类加载器会对所加载的类或接口进行一些校验检查。当表示已编译类或接口的二进制数据有错,则类或接口使用的类文件格式版本不被支持,类加载器找不到类或接口的定义,或者如果出现类循环,都会抛出异常。类循环是指类或接口的父类是其自身的情况。
类加载器一般有两种类型:由JVM提供的引导类加载器(bootstrap class loader)和用户定义的类加载器。用户定义的类加载器也是Java的ClassLoader类的子类,用于从非标准的、用户定义的源创建Class对象,以便提高安全性。例如,从加密文件中提取Class对象。一个加载器可以将部分甚至整个加载过程委托给另一个加载器。最终生成Class对象的加载器称为定义加载器(defining loader),而开始该加载过程的加载器称为启动加载器(initiating loader)。
使用默认引导类加载器的加载过程如下:根据所要加载的类文件,引导类加载器会判断自身是否已经成为该类的启动加载器。如果是,则Class对象存在,加载器停止(注意,加载一个类并不等于创建该类的一个实例,这一步骤仅仅是在JVM中加入该类)。如果类还没有加载,则加载器会搜索对应的类文件,并在找到后根据该类文件创建Class对象。如果找不到类文件,那么就会产生NoClassDefFoundError异常。
使用用户定义类加载器时,整个加载过程稍有不同。与引导加载器一样,用户定义的加载器首先判断自身是否已经成为目标类文件的启动加载器。如果是,则Class对象已经存在,加载器停止,而如果不是,用户定义的加载器会调用loadClass()方法。loadClass()方法返回所需的类文件并将表示类的二进制字节装配成ClassFile结构,然后调用defineClass()方法,由该方法从ClassFile结构创建Class对象。另外,loadClass()方法也可以将加载过程委托给另一个类加载器。
3. 链接
链接过程的第一步是校验需要链接的类文件。
Java类文件校验
由于JVM与Java编译器是完全分离的,因此,用来解释类文件的JVM无法保证类文件的形式正确,甚至无法保证该文件确实由Java编译器所生成。另一个问题在于继承与类兼容性。如果给定类文件所表示的类继承自另一个类文件表示的父类,那么JVM必须确保该子类的类文件与父类的类文件兼容。
JVM会校验每个类文件是否满足Java语言规范对类文件的约束,不过Java类校验器与Java语言无关。用某些其他语言编写的程序同样也能编译成类文件格式,编译之后,该类文件也能通过校验过程。
校验过程分为4个步骤:
(1) 第一步由JVM加载类文件并检查文件是否符合类文件的基本格式。类文件的长度必须准确。类文件必须确实表示类(检查其中一个特殊数字)。常量池中不能包含任何不可识别的信息,并且每个属性的长度正确。
(2) 校验过程的第二步在文件链接时进行。这一步执行的操作包括确保final关键字约束的保留。这表示final类不能派生子类,final方法也不能被重写。然后确保常量池中的元素符合Java语言的规定。验证常量池中的所有字段和方法引用,并检查每一个类(Object类除外)是否具有直接父类。
(3) 第三个校验步骤也在链接阶段进行。这一步检查类文件中引用的每一个方法,确保符合Java语言对方法的规定。方法调用中参数的数量和类型必须正确。操作数栈必须总保持相同大小,并包含相同类型的值。局部变量在访问前应当包含合适的值。必须为字段指定正确类型的值。
(4) 校验的最后一步是处理第一次调用方法时出现的事件,并保证一切按规范进行。这些检查包括:确保给定类中存在某个引用的字段或引用的方法,确认引用的字段或引用的方法具有正确的描述符,并确保一个方法在运行时能够访问该引用字段或引用方法。
准备
在校验类文件之后,JVM准备初始化类,包括为类变量分配内存空间并设置为默认初始值。这些值是标准的默认值,例如int类型为0,Boolean类型为false等。在初始化阶段,这些值会设为程序相关的默认值。
解析
在这一可选的步骤中,JVM把运行时常量池中引用的符号解析成具体值。
4. 初始化
链接过程完成后,会调用静态字段和静态初始化器。静态字段的值即使在类没有实例化时也能够访问得到,而静态初始化器用于单个表达式无法表示的静态初始化。JVM把所有这类初始化器收集到一个特殊的方法中。例如,类所有初始化器的集合就是初始化方法<clinit>。
不过,JVM在初始化一个类时不仅需要调用该类的初始化方法(只有JVM能够调用),而且需要初始化所有的父类(即需要调用这些父类的<clinit>)。结果就是,总是需要最先初始化Object类。另外,包含应用程序main()方法的类总是要初始化。
JVM:加载、链接和初始化
JVM要解释Java字节码,就必须对所需的类和接口执行如下3步操作:
(1) 加载:JVM在加载类时,会查找该类或该接口的二进制表示,并根据找到的二进制表示(通常是由Java编译器创建的类文件)创建一个Class对象。该Class对象中封装了类或接口的运行时状态。
由类加载器执行,该步骤将查找字节码,并从这些字节码中创建一个class对象。
(2) 链接:链接这一过程是指取得已加载的类或接口、结合JVM运行时环境、准备执行该类或该接口。
在链接阶段将验证类中的字节码,为静态域分配内存空间,并且如果必须的话,将解析这个类创建的对其他类的引用。
(3) 初始化:初始化是指JVM调用该类或该接口的初始化方法。
如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。
初始化延迟到了对静态方法(构造器默认也是静态的)或者非常数静态域进行首次引用时才执行
1. 第一步
启动一个单机Java程序时,JVM首先做的是另外创建一个Class对象,用于表示包含public static void main(String [ ] args)方法的Java类。然后JVM会链接并初始化该Java类,调用main()方法,并用main()方法驱动所引用的其他类和接口的加载、链接和初始化过程。
2. 加载
加载过程是由类加载器完成的,该加载器是ClassLoader的子类,并且该类加载器会对所加载的类或接口进行一些校验检查。当表示已编译类或接口的二进制数据有错,则类或接口使用的类文件格式版本不被支持,类加载器找不到类或接口的定义,或者如果出现类循环,都会抛出异常。类循环是指类或接口的父类是其自身的情况。
类加载器一般有两种类型:由JVM提供的引导类加载器(bootstrap class loader)和用户定义的类加载器。用户定义的类加载器也是Java的ClassLoader类的子类,用于从非标准的、用户定义的源创建Class对象,以便提高安全性。例如,从加密文件中提取Class对象。一个加载器可以将部分甚至整个加载过程委托给另一个加载器。最终生成Class对象的加载器称为定义加载器(defining loader),而开始该加载过程的加载器称为启动加载器(initiating loader)。
使用默认引导类加载器的加载过程如下:根据所要加载的类文件,引导类加载器会判断自身是否已经成为该类的启动加载器。如果是,则Class对象存在,加载器停止(注意,加载一个类并不等于创建该类的一个实例,这一步骤仅仅是在JVM中加入该类)。如果类还没有加载,则加载器会搜索对应的类文件,并在找到后根据该类文件创建Class对象。如果找不到类文件,那么就会产生NoClassDefFoundError异常。
使用用户定义类加载器时,整个加载过程稍有不同。与引导加载器一样,用户定义的加载器首先判断自身是否已经成为目标类文件的启动加载器。如果是,则Class对象已经存在,加载器停止,而如果不是,用户定义的加载器会调用loadClass()方法。loadClass()方法返回所需的类文件并将表示类的二进制字节装配成ClassFile结构,然后调用defineClass()方法,由该方法从ClassFile结构创建Class对象。另外,loadClass()方法也可以将加载过程委托给另一个类加载器。
3. 链接
链接过程的第一步是校验需要链接的类文件。
Java类文件校验
由于JVM与Java编译器是完全分离的,因此,用来解释类文件的JVM无法保证类文件的形式正确,甚至无法保证该文件确实由Java编译器所生成。另一个问题在于继承与类兼容性。如果给定类文件所表示的类继承自另一个类文件表示的父类,那么JVM必须确保该子类的类文件与父类的类文件兼容。
JVM会校验每个类文件是否满足Java语言规范对类文件的约束,不过Java类校验器与Java语言无关。用某些其他语言编写的程序同样也能编译成类文件格式,编译之后,该类文件也能通过校验过程。
校验过程分为4个步骤:
(1) 第一步由JVM加载类文件并检查文件是否符合类文件的基本格式。类文件的长度必须准确。类文件必须确实表示类(检查其中一个特殊数字)。常量池中不能包含任何不可识别的信息,并且每个属性的长度正确。
(2) 校验过程的第二步在文件链接时进行。这一步执行的操作包括确保final关键字约束的保留。这表示final类不能派生子类,final方法也不能被重写。然后确保常量池中的元素符合Java语言的规定。验证常量池中的所有字段和方法引用,并检查每一个类(Object类除外)是否具有直接父类。
(3) 第三个校验步骤也在链接阶段进行。这一步检查类文件中引用的每一个方法,确保符合Java语言对方法的规定。方法调用中参数的数量和类型必须正确。操作数栈必须总保持相同大小,并包含相同类型的值。局部变量在访问前应当包含合适的值。必须为字段指定正确类型的值。
(4) 校验的最后一步是处理第一次调用方法时出现的事件,并保证一切按规范进行。这些检查包括:确保给定类中存在某个引用的字段或引用的方法,确认引用的字段或引用的方法具有正确的描述符,并确保一个方法在运行时能够访问该引用字段或引用方法。
准备
在校验类文件之后,JVM准备初始化类,包括为类变量分配内存空间并设置为默认初始值。这些值是标准的默认值,例如int类型为0,Boolean类型为false等。在初始化阶段,这些值会设为程序相关的默认值。
解析
在这一可选的步骤中,JVM把运行时常量池中引用的符号解析成具体值。
4. 初始化
链接过程完成后,会调用静态字段和静态初始化器。静态字段的值即使在类没有实例化时也能够访问得到,而静态初始化器用于单个表达式无法表示的静态初始化。JVM把所有这类初始化器收集到一个特殊的方法中。例如,类所有初始化器的集合就是初始化方法<clinit>。
不过,JVM在初始化一个类时不仅需要调用该类的初始化方法(只有JVM能够调用),而且需要初始化所有的父类(即需要调用这些父类的<clinit>)。结果就是,总是需要最先初始化Object类。另外,包含应用程序main()方法的类总是要初始化。
发表评论
-
博客已转移至 http://blog.yemou.net/
2015-07-27 17:57 818我所有的博客都已经转移至 http://blog.yemo ... -
java对象 深度克隆(不实现Cloneable接口)和浅度克隆
2015-06-08 15:45 937详见: http://blog.yemou.net/art ... -
java 多线程Callable和Runable执行顺序问题详解
2015-02-28 16:25 1035详见: http://blog.yemou.net/art ... -
java 读写锁详解
2015-02-26 17:46 934详见: http://blog.yemou.net/art ... -
jvm 常用内存分析命令
2015-02-06 15:32 663详见: http://blog.yemou.net/art ... -
Spring AOP 详解
2015-01-15 15:03 720详见: http://blog.yemou.net/art ... -
正确理解ThreadLocal
2014-06-17 16:54 634详见: http://blog.yemou.n ... -
探秘Java虚拟机——内存管理与垃圾回收
2014-06-16 23:29 1114详见: http://blog.yemou. ... -
Java GC 日志详解
2014-06-16 23:11 739详见: http://blog.yemou.net/art ... -
垃圾回收调优及JVM参数详解
2014-06-13 09:09 570http://hi.baidu.com/jiangyangw3 ... -
深入理解Java HashMap实现原理
2014-04-10 18:05 698详见: http://blog.yemou.net/art ... -
【转】Java HashMap的死循环问题
2014-04-10 17:12 862详见: http://blog.yemou.net/art ... -
HashMap和ConcurrentHashMap对null的不同处理
2014-04-10 15:45 791详见: http://blog.yemou.net/art ... -
探索 ConcurrentHashMap 高并发性的实现机制
2014-03-31 17:54 754很不错的一篇文章,值得一看 http://www.ibm ... -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
2014-03-25 22:28 683并发队列ConcurrentLinkedQueue和阻塞队列 ... -
[转]Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
2014-03-25 22:08 1323详见: http://blog.yemou ... -
[转]Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用
2014-03-19 15:47 532详见: http://blog.yemou.net/art ... -
[转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
2014-03-19 15:46 686详见: http://blog.yemou.net/art ... -
[转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理
2014-03-19 15:44 718详见: http://blog.yemou.n ... -
[转] Java se 7新特性研究(二)
2014-03-19 11:38 1337详见: http://blog.yemou.net/art ...
相关推荐
JVM类加载过程
有关类加载的全过程,可以先参考我的另外一篇文章类的奇幻漂流——类加载机制探秘 类加载器的类型 类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类...
主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。,需要的朋友可以参考下
1.编写个向接的应程序,可能等到运时再指定其实现的类 2.户可以定义个类加载器,让程序在运时从络或其他地加载 1.加载:(重点) 1.通过“类全名”来获取定义此
该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...
02 类加载子系统 PPT 介绍 JVM 的类加载子系统, 包括类加载阶段和流程、加载器分类和类加载机制等。
详细介绍了JVM执行子系统的工作原理,包括类文件结构与字节码指令(Class类文件结构、JVM字节码指令简介)、JVM类加载机制(类加载器、类加载时机、类加载过程)、字节码执行引擎(运行时候的栈结构、方法调用、方法...
总结了类加载器子系统相关的内容,主要包括类加载器子系统的作用、ClassLoader角色、加载的过程、双亲委派机制以及沙箱安全机制等内容
而**当我们需要用到某个类时,jvm将会加载它,并在内存中创建对应的class对象,这个过程称之为类的加载。**过程如下: 类的加载、连接、初始化 1. 加载 通过类的包名和雷鸣查找到此类的字节码文件,将xx.class文件...
引言JavaGuide :一份涵盖大部分Java程序员所需要掌握的核心知识。star:45159,替他宣传一下子这位大佬,总结的真好!我引用这位大佬的文章,因为
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动...
类加载过程(类加载从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来) 类加载特性 ; 类加载的时机: 三种类加载器: 双亲委派机制概念; 怎么解决双亲委派机制; 垃圾回收gc gc的标记方法; java...
JVM-字节码文件加载过程.md
类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 健壮 3.面向对象 面向过程: 程序:函数+变量 (算法+数据结构) 面向对象: 如:SmallTalk 程序:对象和对象相互之间的“通讯” ...
1 类加载过程图解 系统加载Class类型的文件主要是:加载->连接->初始化,其中连接分为:验证->准备->解析;其实,整个生命周期是7步,类从被加载到虚拟机内存中开始,到卸载出内存为止,分为:加载->验证->准备...
* 系统地学习 JVM 内存结构,垃圾回收、字节码与类加载技术。 * 在内存结构章节,能够学习掌握 JVM内存溢出现象,堆栈内存结构,利用内存诊断工具排查问题。彻底分析 StringTable的相关知识与性能优化,掌握直接内存...
• 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与机制 • 了解JVM性能监控以及调优,会使用jps、jstack、jmap、jstat、jhat,了解内存泄露排查具体方法 • Java基础 • 熟练的使用Java语言进行面向对象程序...
JVM整体结构内存模型(对象的创建,指针压缩,对象大小,对象内存),垃圾收集器,垃圾收集器算法、内存调优(调优工具),垃圾收集,内存回收(算法),类加载机制(类加载过程,双亲委派),一图学完JVM所有的知识...
本文主要介绍了JVM加载一个类的过程。具有很好的参考价值,下面跟着小编一起来看下吧
主要介绍了深入理解JVM之类加载机制,结合实例形式详细分析了类加载机制原理、过程及相关操作注意事项,需要的朋友可以参考下