java类验证和装载顺序_Java类加载机制实现流程及原理详解

前言

我们知道,Java项目编译后会生成许许多多的class文件,class文件保存着类的描述信息。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

类的生命周期

类从被加载到虚拟机内存中开始,到卸载出内存位置,他的整个生命周期包括:

加载验证准备解析初始化使用卸载

这七个阶段。画个图就是下面这样:

其中,类加载的过程包括了加载、验证、准备、解析、初始化这五个阶段。其中加载、验证、准备、初始化顺序是固定的,解析可能在初始化之前也可能在初始化之后,为什么呢?因为Java支持运行时绑定,也就是我们说的多态,所以解析发生的时机不一定。

注意:按顺序开始不一定是按顺序结束,因为有些阶段执行时间较长。

类加载过程

让我们看一下类加载过程中,每一阶段大概都做了什么事情!

让我们看一下类加载过程中,每一阶段大概都做了什么事情!

加载:查找并加载类的二进制数据。

连接:

验证:确保被加载的类的正确性。

文件格式验证

元数据验证

字节码验证

符号引用验证

准备 为类的静态变量分配内存,并将其初始化为默认值。

解析:把类中的符号引用转换为直接引用。

初始化:为类的静态变量赋予正确得到初始值,JVM负责对类进行初始化,主要对类变量进行初始化。

类加载器四种类加载器

JVM自带了三种类加载器,依次为下面前三个,如果有必要,我们还可以加入自定义的类加载器,实现更灵活的加载方式,比如从特定的场所取得java class,例如数据库中和网络中、动态创建类、自动验证数字签名等等。

BootStrapClassLoader:启动类加载器

加载(/JDK/JRE/LIB/ java.)

ExtClassLoader:扩展类加载器

加载(/JDK/JRE/LIB/EXT javax.)

AppClassLoader:应用类加载器

加载(ClassPath,自己写的类)

*ClassLoader:用户自定义类加载器

他们存在层级关系,但是并不是通过继承实现的,而是通过组合!如下图:

双亲委派模型

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中more命令的使用,Linux中more命令使用详解教程

1、使用权限:所有者 什么是所有者权限?2、使用方式more [参数选项] [文件]参数:num 从第num行开始显示;-num 定义屏幕大小,为num行;/pattern 从pattern 前两行开始显示;-c 从顶部清屏然后显示;-…

k8s 查看ip地址属于哪个pod_一个简单的例子理解Kubernetes的三种IP地址类型

很多Kubernetes的初学者对Kubernetes里面三种不同的IP地址和工作机制理解得不是很清楚。本文我们通过一个最简单的例子来学习。用如下命令行创建一个基于nginx的deployment:kubectl run nginx --imagenginx:maxline用kubectl get deploy查看成功生成的名为nginx的de…

linux resin 查看日志命令,【转】linux:访问日志分析

作为一个程序员或项目负责人,甚至运营人员,很多人都想知道:* 我们的项目访问量怎么样* 用户访问高峰在什么时候* 系统变慢的时候用户做了哪些操作* 用户对哪些功能比较感兴趣* 真实用户在服务器上的操作轨迹是什么样的* 系统的瓶颈在哪* 哪些…

linux系统初级管理书,Linux系统管理基础--超级适合Linux新手的书

liuyongqing 于 2012-11-15 11:53:18发表:谢谢分享liuyongqing 于 2012-11-15 11:53:11发表:谢谢分享liuyongqing 于 2012-11-15 11:52:52发表:谢谢分享liuyongqing 于 2012-11-15 11:52:46发表:谢谢分享liuyongqing 于 2012-11-15 11:52:43发表:谢谢分享wankuixing 于 2012-11…

是vans_Vans 的旧海报上原来有这么多学问…

事情是这样的,某天,当我们编辑部翻开一张 Vans 70 年代的海报,发现开头上面写着:GO “JAMIN” IN VANS。这段话引起了在场的所有人的好奇。(图片来源:Vans)到底什么是 “JAMIN” 呢? 在我们刨根究底的搜寻下…

linux单机到单机adg环境,Oracle 11.2.0.4 DataGuard 环境打PSU,OJVM PSU补丁快速参考

环境:RHEL6.5 Oracle 11.2.0.4 DataGuard physical standby主库和备库都是单节点。需求:主备库同时应用160719的PSU和OJVM PSU补丁。先参考MOS文档 ID 278641.1 的解决方案如下:SOLUTIONProcess Overview:In the primary disable log shippi…

python增量更新数据_Python标准库——加密

增量更新散列计算器的update()方法可以反复调用。每次调用时,都会根据提供的附加文本更新摘要。增量更新比将整个文件读入内存更高效,而且能生成相同的效果。新建hashlib_update.py文件。import hashlibfrom hashlib_data import loremh hashlib.md5()h…

linux 帮助文档管理,Linux系统帮助文件使用——man命令

如何获取命令帮助:(1)如果是内键命令:help COMMAND 例如:help history外部命令: COMMAND –help 例如:ifconfig –help(2)也可以查看manual手册,手册存放在/usr/share/man,全是.gz压缩…

activiti前端画图转化_记Activiti入门使用-2 流程绘制、导入及开始一个流程

一、流程绘制与导入百度啥的找了好多bpmn绘制工具,都不尽如人意,大多数都不能编辑网关出口的跳转条件,最后还是选择了activiti官方的那个绘图的app。。。啥都好,就是线不能弯,很难受。(后来开发的时候惊讶地发现了方法…

int是不是python保留字_下面不属于Python保留字的是:

【填空题】作解剖定位时,家畜前、后肢的后面分别称为( )和( )。【单选题】世界上第一条高速铁路是【单选题】ZZ* ?【单选题】下面不属于Python保留字的是:【单选题】The accounting concept which requires assets to be valued at their net book val…

计算机系统结构实验报告Linux,计算机操作系统体系结构实验报告.doc

操作系统实验报告实验目的:随着操作系统应用领域的扩大,以及操作系统硬件平台的多样化,操作系统的体系结构和开发方式都在不断更新,目前通用机上常见操作系统的体系结构有如下几种:模块组合结构、层次结构、虚拟机结构和微内核结构…

python列表的表示形式_python 列表推导式

1、列表推导式书写形式:[表达式 for 变量 in 列表] 或者 [表示式 for 变量 in 列表 if 条件]1 #!/usr/bin/python2 #-*- coding: utf-8 -*-34 li [1,2,3,4,5,6,7,8,9]5 print [x**2 for x inli]67 print [x**2 for x in li if x>5]89 print dict([(x,…

linux sh 编程,Linux shell 编程入门

shell 编程概念(1) shell是一种命令行解释器,外壳有很多种类(2) shell 看成是Linux内核和用户沟通的桥梁,用户默认不能直接操作内核(3)可以通过shell外壳去操作,用户指令传递给shell,传递给Linux内核,内核接受去处理(4…

云科技网络验证源码_面向虚拟化架构和容器云的开源安全工具

随着云和虚拟技术发展,docker容器的使用越来越流行和方便。有很多企业已经把基础架构由传统实体机转移到了虚拟机化架构,基于公有云、私有云以及容器云构建在线服务。与容器相关的安全性对变得越来越重要。与传统的安全性方法相比,虚拟化架构…

linux ubuntu 安装yum,ubuntu使用yum安装软件问题

其实ubuntu是不应该用yum来管理软件安装的,只是后来才发现的,这里记录一下尝试的过程。一开始是想把windows桌面上的文件拖到xshell登录的ubuntu的目录中,但是没成功,参考https://blog.csdn.net/liuao107329/article/details/4999…

kali linux 桌面消失_kalilinux系统设置不见了的解决方案

kalilinux的系统设置不见了是由于删除软件或者错误配置导致的,解决方法是重新安装桌面环境。下面我给出几个不同桌面环境。KDE桌面1.KDE Plasma Desktop (最小化的等离子桌面)安装:apt-get install kali-defaults kali-root-login desktop-base kde-plas…

linux异步实现原理,Android异步处理四:AsyncTask的实现原理

分析:在分析实现流程之前,我们先了解一下AsyncTask有哪些成员变量。privatestaticfinalintCORE_POOL_SIZE 5;//5个核心工作线程privatestaticfinalintMAXIMUM_POOL_SIZE 128;//最多128个工作线程privatestaticfinalintKEEP_ALIVE 1;//空闲线程的超时时间…

ue4集合类型_UE4项目问题集合

debugeditor模式下,在LoadPackage过程中crash,vs报出Stack overflow的错误这是由于Package层数过多,vs栈不够用导致的。而ue4用UBT导致不能直接修改项目的栈大小。之前项目后期就因为这个崩溃导致大家没法再用debug模式进行开发。直接的解决办…

mysql5.7 for linux7,大道浮屠诀---mysql5.7.28 for linux安装

环境:redhat6.5安装RMP包的具体操作如下:1、如有mariadb,先卸载rpm -qa |grep mariadbrpm -qa |grep mysql*rpm -e --nodeps xxxxxx (卸载查询到的rpm包)2、安装新的mysql5.7.28,解压安装包tar -xvf mysql-5.7.28-1.el6.x86_64.rpm-bundle.t…

python中提供怎样的内置库、可以用来创建用户界面_使用外部GUI库在Autodesk中创建用户界面可能会...

我不确定这是否有关联,但一些谷歌搜索发现PyQt在玛雅内部非常流行。您可以尝试使用here或here(用源代码解释了here)通过Maya创建一个新的线程循环并在其中执行。似乎Maya包含了一个模块,用于设置新的线程对象,其中包含一个QApplication&#…