如下图所示,Java的类加载机制主要分为三个部分,分别为加载、链接、初始化。其中链接又分为三个小部分——验证、准备、解析


  • 加载——在经过对Java代码进行编译后,JVM将Java类编译后的二进制文件即字节码文件以二进制的形式加载到内存放中,以便后面的步骤进行,如果没有找到指定的类,就会抛出错误,进程到这里也就结束了。
  • 验证——验证即验证Java加载进内存的二进制文件是否符合JVM以及Java规范,并且不会危害虚拟机的自身安全。比如说符号引用中的类、字段、方法的访问性(private、protected、public、default)是否可被当前类访问、类中的字段、方法是否与父类产生矛盾……
  • 准备——准备阶段是指准备要执行的制定的类,这包含了给这个类的静态变量和其他数据分配内存空间(仅仅是分配内存空间,具体初始化在最后一步)。
  • 解析——解析阶段是指检查指定的类是否引用了其他的类、接口,然后对于这些内容递归的进行以上加载、验证、准备三个步骤
  • 初始化——在这最后一步中,JVM用赋值或者缺省值将静态变量进行初始化,并执行静态初始化程序(static块中的代码),初始化发生在执行main方法之前,但在指定的类初始化之前他的父类必须先初始化,若其父类仍然存在父类,那也需递归的初始化。
    例如,如果一个类中包含声明public static int a=5;那么变量a被赋值为5的过程将在初始化阶段进行,另外倘若静态变量并没有指定初值,那么JVM会自动给静态变量赋予一个初值,下表给出Java基本类型和引用变量的缺省值。
类型 默认值 类型 默认值 类型 默认值
boolean false int 0 float 0.0f
byte 0 long 0L double 0.0d
short 0 char \u0000 object reference null

参考资料:
Java编程指南
http://www.importnew.com/25295.html


Java类加载机制(加载、验证、准备、解析、初始化)的更多相关文章

  1. Java中类的加载、连接和初始化

    Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...

  2. JAVA类的加载、连接与初始化

    JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...

  3. java 类的加载,链接,初始化

    本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...

  4. java类加载器加载文件

    例子:采用配置文件加反射的方式创建ArrayList和HashSet的实例对象. //第一种方式:类加载器加载文件 InputStream ips = ReflectTest2.class.getCl ...

  5. java类的加载、链接、初始化

    JVM和类的关系 当我们调用JAVA命令运行某个java程序时,该命令将会启动一条java虚拟机进程,不管该java程序有多么复杂,该程序启动了多少个线程,它们都处于该java虚拟机进程里.正如前面介 ...

  6. Java类的加载、链接和初始化

    一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...

  7. java类从加载、连接到初始化过程

    类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...

  8. java 类的加载、连接和初始化

    JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区. ...

  9. java虚拟机规范-加载、链接与初始化

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调.java代码本身并不能为jvm识别,实际上在jvm中的表现形式为Class对象,一个java类从字节 ...

随机推荐

  1. java实现中缀表达式转后缀表达式

    package postfix; import java.util.Stack; /** * * @author DELL 将中缀表达式转化为后缀表达式 */ public class Express ...

  2. app锁定屏幕方向,某一个界面支持屏幕旋转~

    AppDelegate.h 加 @property (nonatomic, assign) BOOL allowRotation; Appdelegate.m加 -(NSUInteger)applic ...

  3. 【红色警报】XXE 高危漏洞将大面积影响微信支付安全,可能导致系统沦陷,请升级你的系统!

    今天,微信支付发布了一则紧急通知: 尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知.退款成功通知.委托代扣签约/解约/扣款通知.车主解约通知)时,如未正确地进行安全 ...

  4. 「HNOI2016」数据结构大毒瘤

    真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直 ...

  5. 一线互联网常见的14个Java面试题,你颤抖了吗程序员

    跳槽不算频繁,但参加过不少面试(电话面试.face to face面试),面过大/小公司.互联网/传统软件公司,面糊过(眼高手低,缺乏实战经验,挂掉),也面过人,所幸未因失败而气馁,在此过程中不断查缺 ...

  6. 抓包工具 Fiddler 使用介绍

    简介 Fiddler是一个抓包工具,可以将网络传输发送与接收的数据包进行截获.重发.编辑等操作.也可以用来检测流量.原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口 ...

  7. Android精通之AsyncTask与ListView讲解

    版权声明:未经博主允许不得转载 AsyncTask 了解AsyncTask异步,需要了解一下异步任务(多线程),什么是线程,可以这么说线程好比边吃饭边看电视,AsyncTask是为了方便后台线程中操作 ...

  8. Ubuntu 18.04基础软件安装

    1.fcitx 这个应该是最基础的了,虽然系统自带的也有,不过说实话可能是我还不会配置,我觉得是不好用,坚持用了一周后还是换回了小企鹅,最初是装小企鹅时失败了被迫坚持用了一周,当时失败情况是这样的,使 ...

  9. 简单聊一聊那些svg的沿路径运动

    之前遇见动画就很想用css实现,显然有些效果是我们力所不能及,实现起来麻烦,效果不好,让人捉急.其实归结起来,不同的动画有自己的优势,根据实际情况进行取舍.本文就告诉大家如何用SVG写出个简单动画.就 ...

  10. PostgreSQL踩坑现场

    1.PostgreSQL表名.字段名.别名等大小敏感,默认都会转化成小写形式.如果名字中有大写字母,必须分别添加双引号.在写后台时,注意添加\ 如表名:TestTable中有个字段名userName ...