`
zhang1685701
  • 浏览: 2944 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java虚拟机之初始化

阅读更多
   类从加载到内存虚拟机内存开始,到卸载出内存为止,整个生命周期是:加载,验证,准备,解析,初始化,使用,卸载。
    加载,验证,准备,初始化,卸载。这五个阶段的顺序是固定的。类的加载过程必须按照这种过程进行,但解析就不一定了。在某些情况下可以在初始化后再开始。这是为了支持java的动态绑定。注意的是这几个阶段不是一个阶段结束了才会执行下一阶段。有可能是这一阶段执行过程中,下一阶段也开始执行了。
    java虚拟机中对加载没有进行强制约束。但对于初始化阶段有且只有一下四种情况必须立即对类进行初始化(之前的几个阶段在此之前开始)
    1,遇到new,getstatic,putstatic,和invokestatic这四条字节码指令时,如果类没有初始化,则必须进行初始化。
    2,使用java.lang.reflet包的方法对类进行调用的时候。
    3,当初始化一个类的时候,如果发现其父类没有进行初始化,则其父类要初始化。
    4,当虚拟机启动时,用户需要指定一个要执行的主类(包括main())虚拟机会先进行初始化这个类
例1:
public class SuperClass{
     static{
        System.out.println("SuperClass init");
     }
     public static int vlaue = 123;
}
public class SubClass extends SuperClass{
    static {
       System.out.println("SubClass init");
    }
}

public class NotInit{
    public static void main(String args[]){
       System.out.println(SubClass.value)
    }
}


上面只会输出“SuperClass init”
原因:对于静态字段,只有直接定义这个类才会被初始化,通过子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。
例2:
public class NotInit{
    public static void main(String args[]){
       SuperClass sc = new SuperClass[10];
    }
}

没有输出“SuperClass init”。
例3:
public class ConstClass{
        static {
           System.out.println("ConstClass init")
       }
       public static final String HELLOWORLD = "hello world";
}
 public class NotInit{
      public static void main(String args[]){
       System.out.println(ConstClass.HELLOWORLD);
}
上面也不会输出“ConstClass init”
原因:虽然java源码中引用了ConstClass类中的常量HELLOWORLD但是在编译阶段将次常量的值“helloworld”存储到了NotInit类的常量池中,之后只对自己类中的常量池进行了引用。两个类在编译成class文件后就不存在任何联系了。
 
分享到:
评论

相关推荐

    深入java虚拟机加载初始化

    ### 深入Java虚拟机加载初始化 #### Classloader的作用及意义 在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`...希望本文能够帮助您更好地掌握Java虚拟机的核心机制之一:类加载初始化。

    Java虚拟机规范.Java SE 8版.zip

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...

    Java虚拟机规范 Java SE 8版-带目录-pdf

    Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...

    java虚拟机规范高清中文版本(java SE 8版本)

    第1章 :简单地介绍了Java虚拟机的历史并... 第5章:定义了Java虚拟机启动以及类和接口的加载、链接和初始化的过程; 第6章:定义了Java虚拟机指令集; 第7章:提供了一张以操作码值为索引的Java虚拟机操作码助记表。

    Java虚拟机规范中文版(JavaSE7).pdf

    加载过程包括加载、验证、准备、解析和初始化五个阶段,确保加载的类符合规范且安全。 **虚拟机指令集** Java虚拟机指令集是虚拟机执行的基本操作单元,每条指令对应一个特定的操作,如加载和存储变量、算术运算、...

    java虚拟机规范(java SE7)

    java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈);... 第五章:加载、链接与初始化

    Java虚拟机规范.Java SE 8版

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)...第5章定义Java虚拟机启动以及类与接口的加载、链接和初始化过程;第6章阐释并列举Java虚拟机指令集;第7章提供一张以操作码值为索引的Java虚拟机操作码助记符表。

    java虚拟机各种版本

    Java虚拟机的运行过程包括加载、验证、准备、解析、初始化等阶段,其中最重要的是解释器和JIT(Just-In-Time)编译器。解释器将字节码逐行解释执行,而JIT编译器会在运行时将热点代码编译成机器码,以提高运行效率。...

    java虚拟机

    Java虚拟机(JVM,Java Virtual Machine)是Java平台的核心组成部分,它负责执行Java程序,为Java代码提供了跨平台的运行环境。Java虚拟机的概念始于Sun Microsystems,现在由Oracle公司继续发展和维护。JVM的设计...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...

    Java虚拟机规范 (Java SE 7 中文版)

    《Java虚拟机规范(Java SE7版)》由林德霍尔姆著,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕.Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...

    Java虚拟机规范(第8版).pdf

    本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。...

    Java虚拟机规范(Java SE 7)中文版

    《Java虚拟机规范(Java SE 7版)》是Java领域最...第5章定义了Java虚拟机启动以及类和接口的加载、链接和初始化过程。第6章阐释并列举了Java虚拟机指令集。第7章提供了一张以操作码值为索引的Java虚拟机操作码助记符表。

    java虚拟机规范

    《Java虚拟机规范(Java SE 8版)英文版》全面而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,...

    java虚拟机规范 jdk8.

     《Java核心技术系列:Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...

    深入java虚拟机 高清pdf 高清高清高清

    《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...

    java虚拟机的详细原理

    1. **类加载子系统**(Class Loader Subsystem):负责将Java类加载到内存中,并对它们进行验证、解析和初始化。每个Java应用程序都有一个类加载器子系统,该子系统包括: - **引导类加载器**(Bootstrap Class ...

    自己动手写Java虚拟机(GO语言)

    2. **类加载机制**:JVM如何找到并加载类文件,包括类加载器、双亲委派模型和类加载过程(加载、验证、准备、解析和初始化)。 3. **内存管理**:JVM内存结构包括堆、栈、方法区等,书中会讲解如何模拟这些区域,...

Global site tag (gtag.js) - Google Analytics