在类加载机制的五个阶段中,我们已经讲完了第一个阶段。剩下的四个阶段由于涉及到比较多的类文件相关的知识,现在讲了会看得很吃力,所以我们暂时不会一一的去细讲,只说一下大概的用处,让大家有个概念性的认识。 
  装载之后的阶段就是校验阶段了,该阶段的目的就是确保上一阶段读进来的二进制字节流中包含的信息符合虚拟机的规范,并且不会危害虚拟机自身。校验主要分为四个方向:文件格式校验、元数据校验、字节码校验和符号引用校验。 
  校验过后就是准备阶段了。该阶段就是为类变量分配内存以及设置初始值。注意:这里的分配内存和设置初始值针对仅仅只是类变量,如:public static int val = 123;这种被static修饰的变量,但是这个设置初始值并不是将例子中的123设置给val变量,而是将0设置给该变量。因为这里指的是初始值,也就是默认的值。如boolean型默认的就是false;float型默认的就是0.0f;引用类型就默认为null。 
  然后就是解析阶段,该阶段就是将符号引用替换为直接引用的过程。这两个名词我们会在后面讲类文件格式的时候仔细讲,大家先记着有这么一个阶段就好了。 
  最后就是初始化的阶段了,到了这个阶段才会开始执行我们自己写在类中的代码。他执行的是类变量和静态块。如下面代码: 
 
  还记得刚刚讲的准备阶段吗?在准备阶段是为类变量设置初始值和分配内存(方法区分配),而在该阶段则是为该变量赋上我们自己设置的值。到此,小伙伴知道为什么类方法(静态方法)不能调用普通方法或者普通变量了吗?因为类变量以及静态块各相关方法都在准备阶段分配了内存,在初始化阶段就赋予了值,而此时其他普通的变量并没有做到这几步,他们都是在生成实例变量的时候才会进行内存的分配(堆中分配),因此如果静态方法调用了一个普通变量,而此时还没有创建该普通变量的对象,这就会导致系统错误。所以为了避免这种情况,就不允许那样调用了。 
  这也是为什么main方法是静态方法的原因之一,因为不用创建对象就可调用了。创建对象是要消耗内存的!! 
  在类加载的前面四个阶段中,虚拟机都没有硬性的规定在什么情况下才能进行,而初始化阶段则有且只有5种情况下才能进行,基于易理解的角度来考虑,我们暂时只说3种:

  • 1:当虚拟机启动的时候,虚拟机会初始化包含main方法的那个类。
  • 2:当初始化一个子类的时候,发现其父类还没有初始化,就会先初始化其父类。
  • 3:当我们使用反射对类进行调用的时候,如果该类没有进行初始化,就会先初始化。在我们用JDBC的时候,我们经常会看到这样一行代码: Class.forName("com.mysql.jdbc.Driver"); 这就是反射调用,加载该类并且初始化。

JVM(17)之 准备-解析-初始化的更多相关文章

  1. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

  2. Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]

    Java JVM 内存泄露——全解析和处理办法 [转载]   @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a         JA ...

  3. JVM垃圾回收算法解析

    JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...

  4. Java JVM 类的连接与初始化 [ 转载 ]

    Java类的连接与初始化 (及2013阿里初始化笔试题解析)  转自http://www.cnblogs.com/iceAeterNa/p/4876747.html         Java虚拟机通过 ...

  5. 面试必问:JVM类加载机制详细解析

    前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...

  6. JVM 类加载器深入解析以及重要特性剖析

    1.类加载流程图 从磁盘加载到销毁的完整过程. 2.类加载流程图2 1.加载: 就是把二进制形式的java类型读入java虚拟机中 2.连接: 验证.准备.解析. 连接就是将已经读入到内存的类的二进制 ...

  7. junit源码解析--初始化阶段

    OK,我们接着上篇整理.上篇博客中已经列出的junit的几个核心的类,这里我们开始整理junit完整的生命周期. JUnit 的完整生命周期分为 3 个阶段:初始化阶段.运行阶段和结果捕捉阶段. 这篇 ...

  8. 从jvm角度看懂类初始化、方法重写、重载。

    类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...

  9. springmvc源码解析-初始化

    1.      概述 对于Web开发者,MVC模型是大家再熟悉不过的了,SpringMVC中,满足条件的请求进入到负责请求分发的DispatcherServlet,DispatcherServlet根 ...

随机推荐

  1. tenorflow 模型调优

    # Create the Timeline object, and write it to a json from tensorflow.python.client import timeline t ...

  2. Codeforces917E

    //#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #i ...

  3. SICP 习题解 第二章

    计算机程序的构造和解释习题解答 Structure and Interpretation os Computer Programs Exercises Answer 第二章 构造数据抽象 练习2.17 ...

  4. java并发学习--第二章 spring boot实现线程的创建

    除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...

  5. js关于小数点失精算法修正0.07*100竟然=7.000000000000001

    转发 https://blog.csdn.net/iteye_13003/article/details/82645716

  6. mysql服务设置远程连接

    一.前期准备 1.虚拟机/物理机    mysql环境(非本机)2.本机 navicat软件(验证远程连接) 二 .mysql配置 1.在远程主机的本机   使用root用户连接mysql mysql ...

  7. javaSE之运行时异常和编译时异常

    运行时异常继承自RuntimeException; package foundationEnhance; public class Person { private int age; public P ...

  8. php-redis 使用命令

    PHP 使用redis 一些命令参考:https://www.jianshu.com/p/68b7114a1d70

  9. php stripos()函数 语法

    php stripos()函数 语法 作用:寻找字符串中某字符最先出现的位置,不区分大小写.直线电参数 语法:stripos(string,find,start) 参数: 参数 描述 string  ...

  10. Linux内核设计与实现 总结笔记(第二章)

    一.Linux内核中的一些基本概念 内核空间:内核可独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,称为内核空间. 进程上下文:当 ...