如下图所示,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. CCNA学前基础一

    网络设备: 集线器:集线器就是一种采用共享式工作状态的设备.Hub将信号放大后传输给其他端口,即传输线路是共享的. 交换机:用于连接终端设备,和基本的安全功能还有广播域的隔离.优点实现多用户同时访问, ...

  2. Codeforces Round #418 (Div. 2)

    A: 不细心WA了好多次 题意:给你一个a序列,再给你个b序列,你需要用b序列中的数字去替换a序列中的0,如果能够替换,则需要判断a是否能构成一个非递增的序列,a,b中所有的数字不会重复 思路:就是一 ...

  3. unigui ShowModal、MessageDlg

    procedure Calback(Sender: TComponent; AResult: Integer);procedure TForm.Calback(Sender: TComponent; ...

  4. 腾讯开源 MMKV — 基于mmap的高性能通用key-value组件

    一.介绍 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中至今,在 iOS 微信上使用已有近 3 ...

  5. [Swift-2019力扣杯春季初赛]2. 校园自行车分配

    在由 2D 网格表示的校园里有 n 位工人(worker)和 m 辆自行车(bike),n <= m.所有工人和自行车的位置都用网格上的 2D 坐标表示. 我们需要为每位工人分配一辆自行车.在所 ...

  6. 一个applicationContext 加载错误导致的阻塞解决小结

    问题为对接一个sso的验证模块,正确的对接姿势为,接入一个 filter, 然后接入一个 SsoListener . 然而在接入之后,却导致了应用无法正常启动,或者说看起来很奇怪,来看下都遇到什么样的 ...

  7. PHP中的自动加载

      自动加载? 或许你已经对自动加载有所了解.简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来.这是 ...

  8. java开发面试问题

    Java面试题:java的垮平台原理 为什么要跨平台使用????? 其实说白了就是个操作系统支持的指令集是不一样的.我们的程序需要再不同的操作系统上运行这些代码. 但是不要说jvm是跨平台的,而真正跨 ...

  9. .NET Core 获取 HttpContext.Current 以及 AsyncLocal 与 ThreadLocal

    在 DotNetCore 当中不再像 MVC5 那样可以通过 HttpContext.Current 来获取到当前请求的上下文. 不过微软提供了一个 IHttpContextAccessor 来让我们 ...

  10. CentOS7 安装中文输入法

    CentOS7输入中文,打开终端,使用管理员权限 su 输入管理员密码,回车 输入 yum install  ibus-libpinyin 回车,耐心等待安装完,然后重启系统 重启完后再进行前面的步骤 ...