在类加载机制的五个阶段中,我们已经讲完了第一个阶段。剩下的四个阶段由于涉及到比较多的类文件相关的知识,现在讲了会看得很吃力,所以我们暂时不会一一的去细讲,只说一下大概的用处,让大家有个概念性的认识。 
  装载之后的阶段就是校验阶段了,该阶段的目的就是确保上一阶段读进来的二进制字节流中包含的信息符合虚拟机的规范,并且不会危害虚拟机自身。校验主要分为四个方向:文件格式校验、元数据校验、字节码校验和符号引用校验。 
  校验过后就是准备阶段了。该阶段就是为类变量分配内存以及设置初始值。注意:这里的分配内存和设置初始值针对仅仅只是类变量,如: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. Linux架构之Nginx 负载均衡会话保持

    案例No.50:Nginx负载均衡会话保持 前期准备环境 web01.web02 (web01.web02.db01.nfs01都要优化基本源)[root@web01 ~]# vim /etc/yum ...

  2. python基础--内置函数map

    num_1=[1,2,10,5,3,7] # num_2=[] # for i in num_1: # num_2.append(i**2) # print(num_2) # def map_test ...

  3. tailf 跟踪日志文件

    1.命令功能 tailf 跟踪日志文件增长,作用跟tail –f相同.tailf将输出文件的最后10行,然后等待文件增长. 2.语法格式 tailf  option  file 参数说明 参数 参数说 ...

  4. NtQuerySystemInformation

    #include "stdafx.h" #include <Windows.h> #include <winternl.h> using namespace ...

  5. css3-css3属性选择器

    在HTML中,通过各种各样的属性可以给元素增加很多附加的信息.例如,通过id属性可以将不同div元素进行区分. 在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进行了扩展,新 ...

  6. 【leetcode】1053. Previous Permutation With One Swap

    题目如下: Given an array A of positive integers (not necessarily distinct), return the lexicographically ...

  7. Python3解leetcode Reach a Number

    问题描述: You are standing at position 0 on an infinite number line. There is a goal at position target. ...

  8. 怎么实现web端上传超大文件

    1.介绍enctype enctype 属性规定发送到服务器之前应该如何对表单数据进行编码. enctype作用是告知服务器请求正文的MIME类型(请求消息头content-type的作用一样) 1. ...

  9. BZOJ 3675: [Apio2014]序列分割 动态规划 + 斜率优化 + 卡精度

    Code: #include<bits/stdc++.h> #define N 100006 #define M 205 #define ll long long #define setI ...

  10. 科匠中国深圳java面试笔试题