jvm加载类的过程

前言:

说下这篇文章的来龙去脉:昨天接到了阿里小哥哥的面试电话,小哥哥问我jvm加载类的过程。然后我巴拉巴拉说了一堆classLoader装载类的过程。然后小哥哥说我不是要问这些。。。好吧装载加载傻傻分不清楚。

jvm加载类过程(本人不会,以下内容由小哥哥解释给我听的):

  • classLoader装载类
  • 连接(包括验证,准备,解析:小哥哥详述了这三个步骤。。因为我比较疑问哈哈哈)
  • 初始化 (小哥哥开始问我这个具体初始化过程)

( 本人其实脑子一片浆糊,很多概念傻傻分不清除)比如:类的初始化和对象的实例化

类的初始化:主要是类静态变量的赋值,静态代码块的执行过程。即执行<clinit>:类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块static{}中的语句合并产生的,其中编译器收集的顺序是由语句在源文件中出现的顺序所决定。<clinit>只会执行一次。

对象的实例化:主要是实例变量(非静态变量),非静态代码块,构造函数的实例过程。即执行<init>:实例构造器<init>()是指收集类中的所有实例变量的赋值动作、实例代码块和构造函数合并产生的。<init>执行多次,毕竟有时候实例化多个对象嘛

(因为本人傻傻讲不清除,小哥哥就具体问:父类的静态变量,非静态变量,子类的静态变量,非静态变量的赋值(实例化)顺序,本人开始胡诌,回答的完全错误)

父类的静态变量,非静态变量,子类的静态变量,非静态变量的赋值(实例化)顺序:(刚刚搜出来的答案)

父类静态变量/静态块(顺序执行)->子类静态变量/静态块(顺序执行)->父类实例变量/构造块(顺序执行)->父类构造器->子类实例变量/构造块(顺序执行)->子类构造器

so,先初始化父类,再初始化子类,接着实例化父类,生成父类对象,然后实例化子类,生成子类对象。

( 这个问题结束后,小哥哥说这个我还是需要了解的,以后写代码不知道过程出错了咋办呢)

补充(以前的笔记,摘自某篇博客具体来源忘了):

1、验证:验证被加载后的类是否有正确的结构,类数据是否会符合虚拟机的要求,确保不会危害虚拟机安全。

2、准备:为类的静态变量(static filed)在方法区分配内存,并赋默认初值(0值或null值)。如static int a = 100;

静态变量a就会在准备阶段被赋默认值0。

对于一般的成员变量是在类实例化时候,随对象一起分配在堆内存中。

另外,静态常量(static final filed)会在准备阶段赋程序设定的初值,如static final int a = 666; ?静态常量a就会在准备阶段被直接赋值为666,对于静态变量,这个操作是在初始化阶段进行的。

3、解析:将类的二进制数据中的符号引用换为直接引用。

解析
将常量池中所有的符号引用转为直接引用(得到类或者字段、方法在内存中的指针或者偏移量,以便直接调用该方法)。这个阶段可以在初始化之后再执行。

PS:小哥哥在面试过程中基本上把每个答案都给我解释一遍,超温柔,声音超好听。。。。。。。最后还给我解答了我最近很迷茫的问题,跪谢~~~

原文地址:https://www.cnblogs.com/cai-cai777/p/10921770.html

时间: 2024-10-08 00:57:42

jvm加载类的过程的相关文章

JVM加载类的过程,双亲委派机制中的方法

JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载  1.1.加载 类的加载阶段,主要是获取定义此类的二进制字节流,并将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,最后在Java堆中生成一个代表这个类的java.lang.Class对象作为方法区这些数据的访问入口.相对于类加载过程的其他阶段,加载阶段是开发期可控性最强的阶段.我们可以通过定制不通的类加载器,也就是ClassLoader来控制二进制

jvm加载类

作为jvm的用户,从使用者角度来看,我们给jvm输入一个class文件,得到了一个Class对象.我们可以猜想下jvm加载类的过程:class文件有规定的格式,jvm去解析class文件流,读magic, major version, minor version等值(最简单的举例),然后生成Klass对象,并放到一个map中. 首先有个全局的认识,jvm把已加载的类放在一个hashtable中.class SystemDictionary : AllStatic {    // Hashtabl

java中JVM加载类的时机

一.描述 java中的类在什么时候被JVM虚拟机加载呢?因为静态成员初始化的时候会在类首次加载的时候执行, 我们通过测试一个静态代码块的执行时间来判断JVM加载该类的时间. 总结:JVM只在需要某个类或者使用Class.forName(className)强制加载类的时候才会被调用,如果只是声明某个类的引用,而没有创建对象则不会加载该类. 二.源代码 1.只是声明某个类的引用,而没有创建对象则JVM不会加载该类 package tong.yue.day4_25; /** * java中的类在什么

jvm 加载class文件过程

jvm 加载class文件分为装载-链接-初始化三个过程. load -------->link verify prepare resolve     ---------->initialize (类加载过程) bootstrap class Loader | | extenstion class loader | | system class Loader | | ----------- user-define      user-define class loader      class

JVM加载类的原理机制

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.链接和初始化,其中链接又可以分成校验.准备.解析装载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性: 准备:给类的静态变量分配并初始化存储空间: 解析:将符号引用转成直接引用:初始化:激活类的静态变量,初始化Java代码和静态Java代码块

JVM加载class文件的原理

当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件.那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做[加载 ].加载完成之后,我们就可以进行一系列的运行前准备工作了,比如: 为类静态变量开辟空间,将常量池存放在方法区内存中并实现常量池地址解析,初始化类静态变量等等.这篇文章我们要好好谈谈JVM是如何加载class文件的? 1.JVM加载类的过程       当我们使用命令来执行某一个Java程序(比如Test.class)的时候:java T

jvm加载class原理

当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件.那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做[加载 ].加载完成之后,我们就可以进行一系列的运行前准备工作了,比如: 为类静态变量开辟空间,将常量池存放在方法区内存中并实现常量池地址解析,初始化类静态变量等等.这篇文章我们要好好谈谈JVM是如何加载class文件的? 1.JVM加载类的过程 当我们使用命令来执行某一个Java程序(比如Test.class)的时候:java Test (1

虚拟机(JVM)如何加载类

首先JVM加载类的一般流程分三步: 加载 链接 初始化 那么是否全部Java类都是这样三步走的方式加载呢?我们可以从Java的数据类型去出发.Java分基本类型和引用类型.其中按照面向对象的特性,一切皆对象,那么对于基本类型也应该是对象.但是为了在执行效率和内存占用上进行调优,Java将基本类型特殊处理.所以Java基本类型加载都是Java虚拟机预先定义好了,所以没有加载这个步骤了.引用类型就是类,接口,数组.其中数组是直接由虚拟机直接生成的.类和接口是字节流,都是需要加载. 正文 Java基本

JVM加载.class文件的原理机制

当java编译器将.java文件编译成.class文件后,需要JVM执行.class文件,将class文件加载到内存中,从而对数据进行校验.解析和初始化. 1.类加载的一般过程 (1)寻找jre目录,寻找jvm.dll,并初始化JVM: (2)产生一个Bootstrap Loader(启动类加载器): (3)Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader. (4)Bootstrap Loader