文档章节

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
私信 提问
JVM规范系列第5章:加载、链接与初始化

加载是根据特定名称查找类或接口类型的二进制表示(Binary Representation),并由此二进制表示创建类或接口的过程。 加载,就是指去寻找类或接口的过程。 链接是为了让类或接口可以被 Java...

陈树义
2018/12/19
0
0
03-《深度拆解JVM》之Java虚拟机是如何加载Java类的?

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

飞鱼说编程
2018/09/13
0
0
Java核心机制:反射机制的原理及应用方法

一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): 1、Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在...

Java架构资源分享
2018/11/25
0
0
java.lang.ClassNotFoundException后续

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

zjut_l
2013/06/23
0
0
阿里P8技术心得:java反射机制的核心原理

一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): 1、Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在...

Java架构
2018/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MaxCompute安全管理指南-基础篇

背景及目的 方便和辅助MaxCompute的project owner或安全管理员进行project的日常安全运维,保障数据安全。 MaxCompute有安全模型,DataWorks也有安全模型,当通过DataWorks使用MaxCompute,而...

阿里云官方博客
12分钟前
0
0
MaxCompute安全管理指南-案例篇

通过《MaxCompute安全管理-基础篇》了解到MaxCompute和DataWorks的相关安全模型、两个产品安全方面的关联,以及各种安全操作后,本篇主要给出一些安全管理案例,给安全管理的成员作为参考。 ...

阿里云云栖社区
15分钟前
0
0
show-busy-java-threads.sh

#!/bin/bash# @Function# Find out the highest cpu consumed threads of java, and print the stack of these threads.## @Usage# $ ./show-busy-java-threads## @online-d......

月下狼
19分钟前
0
0
基于Spring Boot和Spring Cloud实现微服务架构

前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道。因为网上流传的多数资料是官网翻译而来,很多描述的重点也都偏向于作者自身碰到的问题,这样就很容易...

架构师springboot
19分钟前
0
0
远程图片上传到七牛云的demo

from qiniu import Auth, BucketManager# 抓取文件到七牛def fetch(url): filename = str(time.time()).replace('.', '') # 获取鉴权对象 auth = Auth(access_key, secre......

Liens
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部