本系列为大厂面试题系列的相关笔记,如有误,欢迎大家指正。

JVM类加载机制

类加载器

虚拟机设计团队把加载动作放到JVM外部实现,以便于引用程序决定如何获取所需的类,JVM提供了三种类加载器

启动类加载器

Bootstrap ClassLoader,负责加载JAVA_HOME\lib目录中的,或通过-Xbootclasspath 参数指定路径下的,且被虚拟机认可(按文件名识别,如tr.jar)的类

扩展类加载器

Extension ClassLoader,负责加载JAVA_HOME\lib\ext目录中的,或通过java.ext.dirs系统变量指定路径中的类库。

应用程序类加载器

Application ClassLoader,负责加载用户路径(classpath)上的类库。JVM通过双亲委派进行类的加载,当然我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器。

类加载过程

JVM类加载机制主要分为以下五个部分:加载、验证、准备、解析、初始化

加载

加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(例如从jar包或者war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)

验证

这一阶段的主要目的就是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

准备

准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。

注意这里所说的初始值概念,比如一个类变量定义为: v = 8080,实际上变量v在准备阶段过后的初始值为0,而不是8080,将v赋值为808的put static指令是在程序被编译后,存放在类构造器方法之中。

但是注意如果使用的是以下申明

public static final int v = 8080;

在编译阶段会给v生成ConstantValue属性,在准备阶段虚拟机会根据ConstantValue属性将v赋值为8080

解析

解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是class文件中的类型常量

CONSTANT_CLASS_info
CONSTANT_Field_info
CONSTANT_Method_info

符号引用

符号引用与虚拟机实现的布局无关,引用的目标并不一定要已经加载到内存中。各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class的文件格式中。编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中

直接引用

直接引用可以是指向目标的指针,相对于偏移量或是一个能直接定位到目标的句柄,如果有了直接引用,那引用的目标必定已经在内存中存在了。

初始化

初始化阶段是类加载的最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都是由JVM主导,到了初始化阶段,才开始真正指定类中定义的Java程序代码。

微信搜一搜【梓莘】或扫描下方二维码交个朋友共同进步。文章持续更新中。

【面试】JVM类加载机制相关推荐

  1. jvm类加载机制_面试:对于JVM类加载机制深度解析

    目录: 前文回顾 JVM在什么情况下会加载一个类? 从实用角度出发,来看看验证.准备和初始化的过程 核心阶段:初始化 类加载器和双亲委派机制 1.前文回顾 咱们今天先来回顾一下昨天讲到的JVM整体的一 ...

  2. jvm类加载机制_JVM 类加载机制

    学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑 Java 的类加载机制,这是 Java 的一个很重要的创新点,曾经也是 Java 流行的重要原因之一. Oracle 当初引入这个机制是为 ...

  3. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  4. 【Java虚拟机规范】JVM类加载机制

    [Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...

  5. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  6. JVM(2)——JVM类加载机制

    一.JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言里面 ...

  7. jvm类加载机制和类加载器_在JVM之下–类加载器

    jvm类加载机制和类加载器 在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关 ...

  8. JVM类加载机制详解

    本文来详细说下JVM类加载机制 文章目录 概述 类加载器是什么 类加载的过程 加载 连接 初始化 类的主动引用和被动引用 主动引用 被动引用 三种类加载器 双亲委托机制 核心思想 源码分析 类的动态加 ...

  9. 详解JVM类加载机制

    详解JVM类加载机制 笔者的笔记都记录在有道云里面,因为公司原因办公电脑无法使用有道云,正好借此机会整理下以前的笔记顺便当做巩固复习了,也因为记笔记的时候不会记录这些知识来源何地,所以如果发现原创后可 ...

最新文章

  1. mysql 常见存储过程,MYSQL存储过程
  2. java基础学习整理(一)
  3. 本地Python连接服务器中的Mysql数据库
  4. webpack ,gulp
  5. caffe随记(八)---使用caffe训练FCN的pascalcontext-fcn32s模型(pascal-context数据集)
  6. 变,从南到北,从北到南...
  7. 铃铛计数问题 解题报告
  8. elementui Cascader 省市区联动选择器,应用与回显
  9. mybatis自动生成mapping和实体
  10. sql server 缓存_了解SQL Server查询计划缓存
  11. 目标检测——评价指标的学习笔记
  12. IDEA如何进行debug调试
  13. 机器视觉硬件选型相关知识
  14. php+条形码在线怎么生成,php实现在线生成条形码示例分享(条形码生成器)
  15. 公有云 私有云及架构
  16. 最优布线问题(三种方法)
  17. win10调节桌面显示计算机,Win10系统电脑屏幕的饱和度如何调整?
  18. SAP 从零起步之 1.2 编辑科目表清单
  19. 给激光打印机的粉盒装粉
  20. 经济原理 —— 经济机器如何运行

热门文章

  1. 三剑客之grep命令
  2. jdbc executeBatch返回值含义
  3. 备战Noip2018模拟赛11(B组)T4 Path 好路线
  4. Codeforces 742B Arpa’s obvious problem and Mehrdad’s terrible solution
  5. DDD中Diff的应用(JAVERS)的封装
  6. 用于认证呼叫者企业身份的分布式账本用例
  7. jQuery在IE8上使用时提示“对象不支持此属性或方法”
  8. ruby:TypeError: 对象不支持此属性或方法(%= stylesheet_link_tag 'application', media: 'all', 'data-turbolink)
  9. MySQL慢查询的12个原因
  10. 【甘道夫】基于scikit-learn实现逻辑回归LogisticRegression