JVM 类加载全过程
类加载机制
- JVM把class文件加载到内存中 并对数据进行 校验,解析,初始化,最终形成JVM可以直接使用的java类型的过程
详细过程 加载→ 验证→ 准备→ 解析 → 初始化→ 使用 → 卸载 这是一个完整的类加载过程
(验证,准备,解析)三步可以统称为链接 统称后就变为步骤变为 加载→链接→初始化→ 使用 → 卸载
-加载
将class文件字节码内容加载到内存中 ,并将静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.class对象(我们使用反射得到的那个class对象就是这个,它相当于一面镜子,映射出方法区中该类的信息)作为方法区类数据的访问入口,这个过程需要类加载器的参与 (方法区中存放静态变量,静态方法,类代码信息,和常量,方法区是特殊的堆,)。
-验证
确保加载的类信息符合JVM规范,确保没有安全方面的问题
-准备
正是为类变量(static变量)分配内存并设置类变量初始值得阶段,这些内存都在方法区中进行分配(设置的初始值是默认值 比如 变量为int 那么初始值为0)
-解析
虚拟机常量池内的符号引用替换为直接引用的过程
解释:符号引用是抽象的,比如孙悟空现在要找如来佛祖算账 ,但是并不知道如来在哪,但是换位直接引用后
就相当于 孙悟空在 东海 100米处, 如来在灵山右20公里处,给出了具体的位置,这样就给出了具体的位置
-初始化
如果累被主动引用,比如new了一个对象,会发生初始化,如果是被动引用,比如只是引用了一个变量,则不会发生初始化
初始化阶段是执行类构造器<clinit>()方法的过程,类构造器<clinit>()方法是由编译器自动收集类中的所有变量的赋值动作和静态语句块(static块)中的语句合并产生的
初始化一个类的时候,如果发现其父类还没有被初始化,则需要先发出其父类的初始化
虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确的同步 ,线程安全的
当访问java的一个静态域时,只有真正声明这个域的类才会被初始化
使用 和 卸载 不在赘述
下面是一个完整的类加载过程 加载后 ,的demo01被加载到 方法去,里面存放了类的信息,并在堆中生成 他的class对象 通过验证后 在准备这一步为 main方法中的变量a
赋值 ,经过解析后进行初始化,然后使用并卸载,注意的是 在初始化时 静态变量和静态语句块是合并执行的。
-
JVM 类加载全过程的更多相关文章
- JVM类加载全过程--图解
JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,下图为实例方法被调用时的JVM内存模型,1~7完整的描述了从类加载开始到方法执行前的预备过程,后面将对每一个步骤进行解释 在我们加载类的过程 ...
- JVM核心之JVM运行和类加载全过程
为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终 ...
- JVM核心——JVM运行和类加载全过程
1.类加载全过程 (1)类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 加载 将class文件字节码内容加载到内存中,并 ...
- JVM总结(四):JVM类加载机制
这一节我们来总结一下JVM类加载机制.具体目录如下: 类加载的过程 类加载过程概括 说说引用 详解类加载全过程: 加载 验证 准备 解析 初始化 虚拟机把描述类的数据从Class文件加载到内存,并对数 ...
- JVM 学习笔记一 :JVM类加载机制
前言: 最近在看JVM相关资料,这里记录下学习笔记,希望自己能坚持学完,打牢基础. 一.类加载过程 1,类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用 ...
- 一夜搞懂 | JVM 类加载机制
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑Java的类加载机制,这是Java的一个很重要的创 ...
- JVM类加载过程学习总结
JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...
- JVM类加载续
上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证.准备.解析.初始化.需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉. 验证:就是要对加载的二 ...
- JVM类加载以及执行的实战
前几篇文章主要是去理解JVM类加载的原理和应用,这一回讲一个可以自己动手的例子,希望能从头到尾的理解类加载以及执行的整个过程. 这个例子是从周志明的著作<深入理解Java虚拟机>第9章里抄 ...
随机推荐
- 微软和Google的盈利模式对比分析
一: 微软和Google是世界上最成功科技巨头之一,但他们之间却有着不同的产品和业务,二者的盈利方式也各有不同,本文将分析和探讨的二者盈利模式的异同. 微软的盈利模式 在1975年由大学肄业的Bill ...
- 小程序上传多图片多附件多视频 c#后端
前言: 最近在研究微信小程序,本人自己是C#写后端的;感觉小程序挺好玩的,就自己研究了一下:刚好今天又给我需求,通过小程序上传多图 然后C#后端保存到服务器: 用NET明白 前端上传需要用到流,然后就 ...
- sed 增删改查详解以及 sed -i原理
我为什么要详细记录sed命令: sed 擅长取行.工作中三剑客使用频率最高,本篇文章将对sed命令常用的 增,删,改,查 进行详细讲解,以备以后工作中遗忘了查询,sed命令是作为运维人员来说, ...
- 【spring cloud】源码分析(一)
概述 从服务发现注解 @EnableDiscoveryClient入手,剖析整个服务发现与注册过程 一,spring-cloud-common包 针对服务发现,本jar包定义了 DiscoveryCl ...
- JavaScript学习笔记——2.数据类型与类型转换
数据类型 JS中一共分成六种数据类型 1- String 字符串 2- Number 数值 3- Boolean 布尔值 4- Null 空值 5- Undefined 未定义 6- Object 对 ...
- jq学习笔记(一)
1 .attr() 与 .removeAttr()方法 - atr()方法用来获取和设置元素属性 attr()有4个表达式: attr(传入属性名):获取属性的值 attr(属性名, 属性值):设置属 ...
- c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)
这篇文章主要介绍了c#几种数据库的大数据批量插入(SqlServer.Oracle.SQLite和MySql),需要的朋友可以了解一下. 在之前只知道SqlServer支持数据批量插入,殊不知道Ora ...
- Qt 学习之路 2(28):坐标系统
Qt 学习之路 2(28):坐标系统 豆子 2012年11月25日 Qt 学习之路 2 59条评论 在经历过实际操作,以及前面一节中我们见到的那个translate()函数之后,我们可以详细了解下 Q ...
- nodejs npm包管理常用命令介绍
1.输入 npm config ls -l 可以查看当前的设置 2.针对某一项设置,可以通过下面方式: npm config set 属性名 属性值 eg:npm config set prefix ...
- svn学习笔记(二)
一.TortoiseSVN日常使用 1.1 浏览仓库 Repo-browser : 浏览仓库中资源信息 1.2 导入导出 Export :导出项目 ,和checkout区别 (checkout检出后文 ...