JVM(17)之 准备-解析-初始化
在类加载机制的五个阶段中,我们已经讲完了第一个阶段。剩下的四个阶段由于涉及到比较多的类文件相关的知识,现在讲了会看得很吃力,所以我们暂时不会一一的去细讲,只说一下大概的用处,让大家有个概念性的认识。
装载之后的阶段就是校验阶段了,该阶段的目的就是确保上一阶段读进来的二进制字节流中包含的信息符合虚拟机的规范,并且不会危害虚拟机自身。校验主要分为四个方向:文件格式校验、元数据校验、字节码校验和符号引用校验。
校验过后就是准备阶段了。该阶段就是为类变量分配内存以及设置初始值。注意:这里的分配内存和设置初始值针对仅仅只是类变量,如: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)之 准备-解析-初始化的更多相关文章
- Java虚拟机JVM学习04 类的初始化
Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...
- Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]
Java JVM 内存泄露——全解析和处理办法 [转载] @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a JA ...
- JVM垃圾回收算法解析
JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...
- Java JVM 类的连接与初始化 [ 转载 ]
Java类的连接与初始化 (及2013阿里初始化笔试题解析) 转自http://www.cnblogs.com/iceAeterNa/p/4876747.html Java虚拟机通过 ...
- 面试必问:JVM类加载机制详细解析
前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...
- JVM 类加载器深入解析以及重要特性剖析
1.类加载流程图 从磁盘加载到销毁的完整过程. 2.类加载流程图2 1.加载: 就是把二进制形式的java类型读入java虚拟机中 2.连接: 验证.准备.解析. 连接就是将已经读入到内存的类的二进制 ...
- junit源码解析--初始化阶段
OK,我们接着上篇整理.上篇博客中已经列出的junit的几个核心的类,这里我们开始整理junit完整的生命周期. JUnit 的完整生命周期分为 3 个阶段:初始化阶段.运行阶段和结果捕捉阶段. 这篇 ...
- 从jvm角度看懂类初始化、方法重写、重载。
类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...
- springmvc源码解析-初始化
1. 概述 对于Web开发者,MVC模型是大家再熟悉不过的了,SpringMVC中,满足条件的请求进入到负责请求分发的DispatcherServlet,DispatcherServlet根 ...
随机推荐
- python基础--2 字符串
整型 int python3里,不管数字多大都是int类型 python2里面有长整型long 将整型字符串转换为数字 # a='123' # print(type(a),a) # b=int(a) ...
- Linux–Nginx攻略
什么是Nginx Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的Ra ...
- C++11的新特性:右值引用
先看代码 #include "pch.h" #include <iostream> #include <string> using namespace st ...
- Python获取exe文件版本
import time, datetime, re, subprocess, sys, os, win32net, win32api, win32con, win32netcon, win32secu ...
- python 在不同CPU上同时运行多个程序
出处/From https://www.quora.com/If-you-run-Python-under-a-dual-core-CPU-then-can-you-run-two-Python-pr ...
- 对vueloader的研究
vue-loader是webpack的加载器,允许您以称为单文件组件(SFC)的格式创作Vue组件: <template> <div class="example" ...
- 使用Windows service创建一个简单的定时器
一.需求 我们有时候可能会想要做一些定时任务,例如每隔一段时间去访问某个网站,或者下载一些东西到我们服务器上等等之类的事情,这时候windows service 是一个不错的选择. 二.实现 1.打开 ...
- java中super的用法总结
package com.ssm.java; /** * Super * usage1:super. 直接去调用父类的方法和属性. * usage2:放在构造器中的第一位,代表引用父类的构造器. */ ...
- php array_sum()函数 语法
php array_sum()函数 语法 作用:返回数组中所有值的和.大理石构件价格 语法:array_sum(arra) 参数: 参数 描述 array 必需.规定数组. 说明:如果所有值都是整数 ...
- .net core跨平台
https://www.cnblogs.com/artech/p/7812811.html .net简介:https://baike.baidu.com/item/.NET/156737?fr=ala ...