目录
解析" >解析
初始化" >初始化
首页 Java Java面试题 面试官:说一下类加载的过程(10张图解)

面试官:说一下类加载的过程(10张图解)

Aug 23, 2023 pm 03:05 PM
java面试题

加载

当我们要使用一个类的时候,要通过ClassLoader将类加载到内存中

「类加载阶段主要完成如下三件事情」

  1. 通过全类名,获取类的二进制流
  2. 解析类的二进制流为方法区内的数据结构
  3. 创建一个java.lang.Class类的实例,表示该类型,作为方法区这个类的访问入口
面试官:说一下类加载的过程(10张图解)

「通过全类名,获取类的二进制流的方式有很多种」

  1. 从zip压缩包中获取
  2. 从网络中获取
  3. 运行时计算生成,如动态代理技术
  4. ...

「对于非数组类型的加载阶段,即可以使用Java虚拟机内置的类加载器去完成,也可以使用用户自定义的类加载器去完成」

链接

「链接这个阶段主要分为3个部分,验证,准备,解析」

验证

「验证阶段主要是确保Class文件的格式正确,运行时不会危害虚拟机的安全」

验证阶段的规则很多,但大致分为如下4个阶段面试官:说一下类加载的过程(10张图解)「具体详细的内容,我就不详细解释了,可以看《深入理解Java虚拟机》,本篇文章偏向于做一个总结,把握类加载的一个整体流程,而不对细节进行阐述」

准备

「准备阶段主要是为类的静态变量分配内存,并将其初始化为默认值」

常见的数据类型的默认值如下

数据类型 默认值
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
boolean false
char 'u0000'
参考 null

「如果类静态变量的字段属性表中存在ConstantValue属性,则直接执行赋值语句」

那么什么情况下类静态变量的字段属性表中存在ConstantValue属性呢?

  1. 类静态变量为基本数据类型,并且被final修饰
  2. 类静态变量为String类型,被final修饰,并且以字面量的形式赋值

为了方便查看Class文件的字节码,我在IDEA中下载了一个插件jclasslib Bytecode viewer,非常方便。用如下代码通过字节码的形式验证一下

public class Person {

    private static int age = 10;
    private static final int length = 160;
    private static final String name = "name";
    private static final String loc = new String("loc");
}
登录后复制

面试官:说一下类加载的过程(10张图解)「所以length和name属性在准备阶段就会赋值为ConstantValue指定的值」

「那么age和loc属性会在哪个阶段赋值呢?是在初始化阶段,后面会详细介绍哈」面试官:说一下类加载的过程(10张图解)

解析

「将类,接口,字段和方法的符号引用(在常量池中)转为直接引用」符号引用:用一组符号来描述所引用的目标 直接引用;直接指向指向目标的指针

加入我写了一个如下的类

public class Student {

    private String name;
    private int age;

    public String getName() {
        return this.name;
    }
}
登录后复制

面试官:说一下类加载的过程(10张图解)以字段为例,name和age对应的对象并不是直接指向内存地址,而是用字符串来进行描述(即符号引用)。解析阶段就是将这些描述转为直接指向目标的指针(即直接引用)

初始化

「执行类静态成员变量赋值语句和静态代码块中的语句」

面试官:说一下类加载的过程(10张图解)

我们把上面的Student代码改成如下形式

public class Student {

    private String name;
    private int age = 10;
    private static int gender = 1;

    {
        System.out.println("构造代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    public Student() {
        System.out.println("构造函数");
    }

    public String getName() {
        return this.name;
    }
}
登录后复制

可以看到字节码中包含了3个方法,getName方法我们知道,方法里面执行了哪些逻辑?面试官:说一下类加载的过程(10张图解)从字节码的角度分析一波

方法」

面试官:说一下类加载的过程(10张图解)

从字节码可以看到方法的主要逻辑为

  1. 调用父类的方法
  2. 非静态成员变量赋值
  3. 执行构造代码块
  4. 执行构造函数

面试官:说一下类加载的过程(10张图解)方法」面试官:说一下类加载的过程(10张图解)从字节码可以看到方法的主要逻辑为

  1. 执行静态变量的赋值语句
  2. 执行静态代码块中的语句
  3. 需要注意的一点是,「Java虚拟机会保证子类的方法执行前,父类的方法已经执行完毕」

「理解方法的作用还是很有必要的,因为经常有些面试题问静态代码块,构造代码块,构造函数的执行顺序。」

我这里就直接总结一下结论,大家可以写demo验证一下

「没有继承情况的执行顺序」

  1. 静态代码块和静态成员变量,执行顺序由编写顺序决定(只会执行一次哈)
  2. 构造代码块和非静态成员变量,执行顺序由编写顺序决定
  3. 构造函数

「有继承情况的执行顺序」

  1. 父类的静态(静态代码块,静态成员变量),子类的静态(静态代码块,静态成员变量)(只会执行一次哈)
  2. 父类的非静态(构造代码块,非静态成员变量),父类的构造函数
  3. 子类的非静态(构造代码块,非静态成员变量),子类的构造函数

卸载

垃圾收集不仅发生在堆中,方法区上也会发生。但是对方法区的类型数据回收的条件比较苛刻面试官:说一下类加载的过程(10张图解)面试官:说一下类加载的过程(10张图解)以下图为例,想回收方法区中的Simple类

  1. 需要保证堆中的Sample类及其子类都已经被回收
  2. 加载Sample类的MyClassLoader已经被回收
  3. Sample类对应的Class对象已经被回收面试官:说一下类加载的过程(10张图解)

可以看到对方法区的类型数据回收的条件比较苛刻,但是收效甚微,所以有些垃圾收集器不会对方法区的类型数据进行回收

总结

类加载过程面试官:说一下类加载的过程(10张图解)

变量的赋值过程面试官:说一下类加载的过程(10张图解)

以上是面试官:说一下类加载的过程(10张图解)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

面试官:Spring Aop 常见注解和执行顺序 面试官:Spring Aop 常见注解和执行顺序 Aug 15, 2023 pm 04:32 PM

你肯定知道 Spring , 那说说 Aop 的去全部通知顺序, Spring Boot 或者 Spring Boot 2 对 aop 的执行顺序影响?说说你在 AOP 中遇到的那些坑?

某团面试:如果线上遇到了OOM,你该如何排查?如何解决?哪些方案? 某团面试:如果线上遇到了OOM,你该如何排查?如何解决?哪些方案? Aug 23, 2023 pm 02:34 PM

OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查。

小白也能与BAT面试官对线:CAS 小白也能与BAT面试官对线:CAS Aug 24, 2023 pm 03:09 PM

Java并发编程系列番外篇C A S(Compare and swap),文章风格依然是图文并茂,通俗易懂,让读者们也能与面试官疯狂对线。

饿了么笔试题,看似简单,难倒一批人 饿了么笔试题,看似简单,难倒一批人 Aug 24, 2023 pm 03:29 PM

在很多公司的笔试题中,千万别小看,都是有坑的,一不小心自己就掉进去了。遇到这种关于循环的笔试题,建议,自己冷静思考,一步一步来。

上周,XX保险面试,凉了!!! 上周,XX保险面试,凉了!!! Aug 25, 2023 pm 03:44 PM

上周,一位群里的朋友去平安保险面试了,结果有些遗憾,蛮可惜的,但希望你不要气馁,正如你所说的,面试中遇到的问题,基本上都是可以通过背面试题解决的,所以请加油!

5道String面试题,能全答对的人不到10%!(附答案) 5道String面试题,能全答对的人不到10%!(附答案) Aug 23, 2023 pm 02:49 PM

​这篇来看看关于 Java String类的 5 道面试题,这五道题,我自己在面试过程中亲身经历过几道题目,本篇就带你了解这些题的答案为什么是这样。

美团一面,看看你能否回答上来? 美团一面,看看你能否回答上来? Aug 24, 2023 pm 03:51 PM

美团一面,看看你能否回答上来?

建议收藏 100 道 Linux 面试题 附答案 建议收藏 100 道 Linux 面试题 附答案 Aug 23, 2023 pm 02:37 PM

​本文一共 3万多字,分别从 Linux概述、磁盘、目录、文件、安全、语法级、实战、文件管理命令、文档编辑命令、磁盘管理命令、网络通讯命令、系统管理命令、备份压缩命令等方面拆解 Linux 知识点。

See all articles