类加载过程

这里的加载过程是严格按照加载开始顺序进行的,注意是加载开始而不是加载完成。也就是有可能会有两个或几个阶段是同时进行的。

比如下面提到的验证过程中的符号引用验证是在解析阶段开始之后进行。

加载(loading):

    (1)、通过一个类的全限定名来获取定义此类的二进制字节流。

    (2)、将这个字节流所代表的静态存储结构转化为方法去运行时数据结构。

    (3)、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类各种数据的访问入口

连接(linking):

  1、验证(verification):

    (1)、文件格式验证。是否以魔术0xCAFEBABE开头、检查常量池tag标志等。

    (2)、元数据验证。对字节码描述的信息进行语义分析。例如验证这个类是否有父类、在这个类的父类是否继承了不允许被继承的类(被final修饰的类)。

    (3)、字节码验证:主要确定程序语义是否合法,符合逻辑的。再元数据验证后就要对类的方法体进行验证。比如保证方法体中的类型转化总是有效的。

    (4)、符号引用验证:这个发生连接的第三阶段解析阶段将符号引用转化为直接引用的时候。验证该类是否缺少或者被禁止访问它依赖的某些外部类、方法、字段等资源。

  2、准备(preparation):

    准备阶段是正式为类中定义的变量(即静态变量)分配内存并设置类变量初始值的阶段。jdk8之后,类变量会随着Class对象一起存放在Java堆中。这里进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时一起分配在Java堆中。并且这里所说的初始值一般都是这个数据类型的零值。但是如果是static final定义变量就会设置为它所指定的值。

  3、解析(resolution):

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

初始化(initializing)

    在准备阶段变量已经赋过一次初始零值,而在初始化阶段则会根据程序员程序编码制定的主观计划去初始化类变量和其他资源

Java中类加载的过程的更多相关文章

  1. java 中类加载器

    jar 运行过程和类加载机制有关,而类加载机制又和我们自定义的类加载器有关,现在我们先来了解一下双亲委派模式. java 中类加载器分为三个: BootstrapClassLoader 负责加载 ${ ...

  2. ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗

    1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而 ...

  3. java中类加载顺序(深入Java)

    未涉及虚拟机 0.<init>与<clinit>的区别 1.类的加载过程 2.类的使用方式 3.类的加载来源 4.重载之泛型参数不同可以吗 5.参考 引子 记得上次中秋一哥们写 ...

  4. Java中类加载过程和对象创建过程

    类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...

  5. Java中对象创建过程

    本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...

  6. java中类加载时机

    java虚拟机规范虽然没有强制性约束在什么时候开始类加载过程,但是对于类的初始化,虚拟机规范则严格规定了有且只有四种情况必须立即对类进行初始化,遇到new.getStatic.putStatic或in ...

  7. java中类加载的全过程及内存图分析

    类加载机制: jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程. (1)加载 将class文件字节码内容加载到内存中,并将这些静态数据转 ...

  8. Java中类加载和反射技术实例

    我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这 ...

  9. Java中对象初始化过程

    Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静 ...

随机推荐

  1. Django( 学习第三部 Django的url路由层)

    目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...

  2. vue项目中mockjs的使用

    mock.js是一个库,源码托管:https://github.com/nuysoft/Mock github上的原话:Mock.js是一个模拟数据生成器,可帮助前端开发和原型与后端进度分开,并减少某 ...

  3. Libevent库基础(2)

    带缓冲区的事件 bufferevent #include <event2/bufferevent.h> read/write 两个缓冲. 借助 队列. 创建.销毁bufferevent: ...

  4. 使用 Filebeat 对多行日志进行处理(multiline)

    Filebeat 收集日志的过程中,默认是按行收取的,也就是每一行都会默认是一个单独的事件并添加时间戳.但是在收集一些特殊日志的时候,往往一个事件包含有多行,例如 Java 的堆栈跟踪日志: 20-0 ...

  5. 1,web项目工作流程

    1.1 了解web程序工作流程 .1.2django生命周期

  6. 了解JWT认证

    JWT介绍 JWT的全称为Json web token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的 ...

  7. python求平均数及打印出低于平均数的值列表

    刚学Python的时候还是要多动手进行一些小程序的编写,要持续不断的进行,知识才能掌握的牢.今天就讲一下Python怎么求平均数,及打印出低于平均数的数值列表 方法一: scores1 =  [91, ...

  8. 微服务网关Zuul和Gateway的区别

    spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已.因为zuul ...

  9. 正式班D26

    2020.11.11星期三 正式班D26 目录 14.2.2 ifconfig命令 14.2.2 ifconfig命令 ifconfig命令结果解释 [root@ccc ~]# ifconfig et ...

  10. XML fragments parsed from previous mappers already contains value for

    1. ssm项目报错: WARN  [main]  DefaultListableBeanFactory:1479-- Bean creation exception on FactoryBean t ...