美文网首页
类初始化过程深入理解

类初始化过程深入理解

作者: 大鹏_xzlp | 来源:发表于2019-04-12 07:04 被阅读0次

整体概览

类生命周期

类的加载

  • 类的加载的最终产品是位于内存中的Class对象
  • Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
  • 类加载器不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时预先加载它,如果与先加载过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误
  • 如果这个类一直没被程序主动使用,那类加载器就不会报告错误

连接

  • 将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去

验证

  • 类文件的结构检查
  • 语义检查
  • 字节码验证
  • 二进制兼容性的验证

准备

  • 准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值。例如以下示例,在准备阶段将为int类型的静态变量a分配4个字节的内存空间,并且赋予默认值0,为long类型的静态变量b分配8个字节的内存空间,并且赋予默认值0.
public class Sample{
    private static int a = 1;
    public static long  b;
    static {
        b = 2;
    }
}

类的初始化

  • 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。在程序中,静态变量的初始化有两种途径:
    1. 在静态变量的声明处进行初始化
    2. 在静态代码块中进行初始化
  • Java虚拟机按照初始化语句的类文件的先后顺序依次执行它们

例如以下代码,静态变量a和b都被显式初始化,而静态变量c没有被显式初始化,它将保持默认值0,按照先后顺序a最终将取值为4

public class Sample{
    private static int a = 1;
    public static long  b;
    public static long  c;
    static {
        b = 2;
    }
    static {
        a = 4;
    }
}

相关文章

  • 类初始化过程深入理解

    整体概览 类的加载 类的加载的最终产品是位于内存中的Class对象 Class对象封装了类在方法区内的数据结构,并...

  • 深入理解Java类加载机制(二)

    1 前言 在深入理解Java类加载机制(一)一文中,我们了解了类的加载和连接过程,这篇文章重点讲述类的初始化过程,...

  • 类加载机制的初始化

    类初始化阶段是类加载过程的最后一步,这一步操作是由虚拟机主导和控制的。 你看《深入理解java虚拟机》书的时候,会...

  • 类初始化处理过程

    前言 在《Java并发变成的艺术》一书中笔者把类的初始化的处理过程分了5个阶段,为了更深入的理解,我便记录下来。 ...

  • 我所理解的iOS runtime

    从一下方面来深入研究: 理解面向对象的类到面向过程的结构体 深入理解OC消息转发机制 理解OC的属性propert...

  • 【类的加载】

    深入理解类加载机制 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最...

  • JVM(一)类加载阶段分解

    类加载器深入解析与阶段分解 类加载阶段 在Java代码中,类型的加载,连接与初始化过程都是在程序运行期间完成 提供...

  • JVM四.类加载机制

    博主最近复习深入理解JVM一书,整理归纳,以形成系统认识和方便日后复习。本文主要介绍 类的生命周期 类初始化时机 ...

  • 深入理解JVM 1 - 类加载过程

    关键字:加载、连接、初始化 在java代码中,类型(class/interface/enum)的加载、连接与初始化...

  • 第五课、类的加载连接与初始化过程详解

    类的加载、连接与初始化过程详解 类的加载、连接与初始化 1、过程:加载-->连接(验证-->准备-->解析) --...

网友评论

      本文标题:类初始化过程深入理解

      本文链接:https://www.haomeiwen.com/subject/pstqwqtx.html