文档章节

Java类加载过程

m
 modprobe
发布于 2016/11/08 09:56
字数 887
阅读 2
收藏 0

  一个.class文件定义了JVM中一个类型,包括域、方法、继承信息、注解和其他元数据。规范中对类文件的格式有详细描述,任何想在JVM上运行的语言都必须遵守。

  

  JVM的目的是使用类文件并执行其中的字节码。要实现这个目的,JVM必须以字节流的方式取出类文件中的内容,并将其转换成可用的格式加入运行状态中。这个分两步走的过程被称为加载和连接,但连接又被分解为几个子阶段。

 

加载

  这个过程首先要读取构成类文件的字节数据流并给类的表现形式解冻。该过程一开始是创建一个字节数组,其内容通常是从文件系统中读取的,然后产生所加载的类对应的Class对象。在这个过程中会对类做一些基本检查,但在加载过程结束时,Class对象还不成熟,所以类也不可用。

 

连接

  加载完成之后,类必须被连接起来,这一步骤分为三个子阶段  验证、准备、解析。验证阶段证实类文件符合预期,不会引起系统的运行时错误或其他问题。之后是类的准备阶段,在类文件中引用的其他类型全部都要定位到,以确保该类已准备就绪。连接步骤中各子阶段的相互关系 如下图

 

验证

  验证是一个非常复杂的过程,它分为几个步骤,首先是完整性检查,这实际上是加载过程中的一部分,会确保类文件格式良好,可以连接接着是检查常量池中的符号信息是自相一致的,并要遵守常量的基本行为准则。其他不涉及代码的静态检查也要在这一阶段完成,比如检查final方法有没有被重写。之后是验证中最复杂的部分,方法的字节码检查,要检查字节码行为良好,并且不会试图摆脱VM的环境控制,下面是一些主要的检查

  • 是否所有的方法都遵守访问控制关键字的限定
  • 方法调用的参数个数和静态类型是否正确
  • 确保字节码不会试图滥用堆栈
  • 确保变量使用之前被正确初始化了
  • 检查变量是否仅被赋予恰当类型的值

 

准备

  类的准备包括分配类存和准备好初始化类中的静态变量,但不会现在初始化变量,也不会执行任何VN字节码

 

解析

  解析会初始VM检查类文件中所引用的类型是不是都是已知的类型。如果有运行时位置的类型,那他们也需要被加载进来。这行可见的未知类型会再次引发类加载过程。一旦需要加载的其他类型全被定位并解析完成,VM就可以初始化那个最初要加载的类。这时候所有的静态变量都可以被初始化,所有的静态初始化代码块都会运行。现在你运行的字节码就是来自新加载进来的类里的。这一步完成之后,所有的类就已全部完成,类也可以使用了。

 

本文转载自:http://www.cnblogs.com/modprobe/p/4951714.html

共有 人打赏支持
m
粉丝 1
博文 35
码字总数 0
作品 0
私信 提问
03-《深度拆解JVM》之Java虚拟机是如何加载Java类的?

一、JVM的类加载 Java 虚拟机中的类加载,从 class 字节码文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三大步骤。其中,链接过程中同样需要验证;而内存中的类没有经过初始化,...

飞鱼说编程
09/13
0
0
JVM-ClassLoader

<谭锋>整理 为了支持跨平台的特性,java语言采用源代码编译成中间字节码,然后又各平台的jvm解释执行的方式。字节码采用了完全与平台无关的方式进行描述,java只给出了字节码格式的规范,并没...

项籍20130121
2013/07/11
0
0
java.lang.ClassNotFoundException后续

问题:在用Eclipse开发JAVA Web程序过程,用JSP实现数据库连接,在加载数据库驱动时,出现了java.lang.ClassNotFoundExcetpion异常 ? 解决方案1:编写测试类,引入mysql-connector-java-5....

zjut_l
2013/06/23
0
0
Java虚拟机必学之四大知识要点你掌握了吗?

作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常...

Java干货分享
10/17
0
0
Java 面试知识点解析(三)——JVM篇

前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部...

我没有三颗心脏
05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nuc970 uboot nand-boot,kernel, filesystem 烧录位置

一 烧写到Nand Flash **1.1 **相关文件说明 l BSP版本:nuc970bsp-release-20150519.zip l NuWriter版本:2015/04/28-V01,nuvoTon Nu-Writer V1.0 l 烧写文件: u-boot-spl.bin:负责将u-b......

CookieDemo
35分钟前
1
0
python中sort和sorted函数小结

L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 这样看,sorted函数只比sort函数多一个iterable参数,其余没什么不同,iterable是一个迭代......

上官夏洛特
今天
3
0
thinkphp 常用SQL执行语句总结

第一条:Db::tablera('vr_panomas')->where(['delete_time'=>0,'id'=>['in',$pids]])->field(['id'=>'id','post_thumb'=>'thumb','post_title'=>'title','post_tags'=>'tags','post_price'=>......

koothon
今天
3
0
支付宝返回状态resultStatus意思

上一篇集成支付宝的时候,会有一些支付宝返回的resultStatus,具体意思是: 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 还有memo,意思就是...

RainOrz
今天
3
0
electron webview 页面加载事件顺序

1.did-start-loading 页面开始加载 2.load-commit 主页面文档加载 3.page-title-updated title 4.dom-ready 主页面 dom 加载完成 5.load-commit frame文档加载 6.did-frame-finish-load fram......

dubox
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部