java类加载过程:加载-->验证-->准备-->解析-->初始化,之后类就可以被使用了。绝大部分情况下是按这

样的顺序来完成类的加载全过程的。但是是有例外的地方,解析也是可以在初始化之后进行的,这是为了支持

java的运行时绑定,并且在一个阶段进行过程中也可能会激活后一个阶段,而不是等待一个阶段结束再进行后一个阶段。

1.加载

加载时jvm做了这三件事:

1)通过一个类的全限定名来获取该类的二进制字节流

2)将这个字节流的静态存储结构转化为方法区运行时数据结构

3)在内存堆中生成一个代表该类的java.lang.Class对象,作为该类数据的访问入口

2.验证

验证、准备、解析这三步可以看做是一个连接的过程,将类的字节码连接到JVM的运行状态之中

验证是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会威胁到jvm的安全

验证主要包括以下几个方面的验证:

  1)文件格式的验证,验证字节流是否符合Class文件的规范,是否能被当前版本的虚拟机处理

2)元数据验证,对字节码描述的信息进行语义分析,确保符合java语言规范

  3)字节码验证 通过数据流和控制流分析,确定语义是合法的,符合逻辑的

  4)符号引用验证 这个校验在解析阶段发生

3.准备  为类的静态变量分配内存,初始化为系统的初始值。对于final static修饰的变量,

直接赋值为用户的定义值。如下面的例子:这里在准备阶段过后的初始值为0,而不是7

public static int a=7

4.解析

解析是将常量池内的符号引用转为直接引用(如物理内存地址指针)

5.初始化    

到了初始化阶段,jvm才真正开始执行类中定义的java代码

1)初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集

类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。

2)当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先触发其父类的初始化。

3)虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

最新文章

  1. Python: 函数参数小结
  2. 打开U盘里是U盘的快捷方式?(2013.12.05)
  3. 微信小程序开发之 下拉刷新,上拉加载更多
  4. 利用powershell进行远程服务器管理(命令行模式)
  5. 安装apache重启的时候,报错端口被占用,错误1
  6. 用C++设计一个不能被继承的类(用私有构造函数+友元函数)
  7. BootStrap布局案例
  8. PL/SQL 9 许可证
  9. Comparer&lt;T&gt; IComparer&lt;T&gt; IComparable&lt;T&gt;
  10. B - ACboy needs your help(动态规划,分组背包)
  11. 使用express.js框架一步步实现基本应用以及构建可扩展的web应用
  12. 用js来实现那些数据结构11(字典)
  13. JAVA同步锁机制 wait() notify() notifyAll()
  14. MVCHtmlHelper使用
  15. 说一下acad的bug及问题
  16. 4、url控制系统
  17. 一次完整的https过程
  18. 乐观锁的一种实现方式——CAS
  19. Python Twisted系列教程11:改进诗歌下载服务器
  20. c#线程-线程同步

热门文章

  1. 流程控制之while循环for循环
  2. Linux学习-RPM 软件管理程序: rpm
  3. 回调深入理解 同步回调 以android中View.OnClickListener为列
  4. MongoDB学习--&gt;命令行增删改查&amp;JAVA驱动操作Mongodb
  5. ie9/8的iframe中jQuery报错
  6. nuc 第二届山西省大学生程序设计大赛 魔力手环
  7. ASP.Net 更新页面输出缓存的几种方法
  8. zuul sample
  9. 2016湖南省赛----G - Parenthesis (括号匹配)
  10. 简单使用EL进行标签的替换