ftpwebrequest 无法加载或初始化请求的服务提供程序_jvm之类加载机制

什么是类加载

每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class"的文件,".class"文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的".class"文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载。

类加载的生命周期

98227b8dad657666451d8e6114affbfa.png

如图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化

加载

加载阶段是类加载过程的第一个阶段。在这个阶段,JVM 的主要目的是将字节码从各个位置(网络、磁盘等)转化为二进制字节流加载到内存中,接着会为这个类在 JVM 的方法区创建一个对应的 Class 对象,这个 Class 对象就是这个类各种数据的访问入口。

验证

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段大致会完成4个阶段的检验动作:

  • 文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。
  • 元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。
  • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。
  • 符号引用验证:确保解析动作能正确执行。

验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

准备(重点)

当完成字节码文件的校验之后,JVM 便会开始为类变量分配内存并初始化。这里需要注意两个关键点,即内存分配的对象以及初始化的类型。

  • 内存分配的对象。Java 中的变量有「类变量」和「类成员变量」两种类型,「类变量」指的是被 static 修饰的变量,而其他所有类型的变量都属于「类成员变量」。在准备阶段,JVM 只会为「类变量」分配内存,而不会为「类成员变量」分配内存。「类成员变量」的内存分配需要等到初始化阶段才开始。

例如下面的代码在准备阶段,只会为 factor 属性分配内存,而不会为 website 属性分配内存。

public static int factor = 3;
public String website = "www.baidu.com";
  • 初始化的类型。在准备阶段,JVM 会为类变量分配内存,并为其初始化。但是这里的初始化指的是为变量赋予 Java 语言中该数据类型的零值,而不是用户代码里初始化的值。

例如下面的代码在准备阶段之后,sector 的值将是 0,而不是 3。

public static int sector = 3;

但如果一个变量是常量(被 static final 修饰)的话,那么在准备阶段,属性便会被赋予用户希望的值。例如下面的代码在准备阶段之后,number 的值将是 3,而不是 0。

public static final int number = 3;

两个语句的区别是一个有 final 关键字修饰,另外一个没有。而 final 关键字在 Java 中代表不可改变的意思,number 的值一旦赋值就不会在改变了。既然一旦赋值就不会再改变,那么就必须一开始就给其赋予用户想要的值,因此被 final 修饰的类变量在准备阶段就会被赋予想要的值。而没有被 final 修饰的类变量,其可能在初始化阶段或者运行阶段发生变化,所以就没有必要在准备阶段对它赋予用户想要的值。

解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

  1. 符号引用:简单的理解就是字符串,比如引用一个类,java.util.ArrayList 这就是一个符号引用,字符串引用的对象不一定被加载。
  2. 直接引用:指针或者地址偏移量。引用对象一定在内存(已经加载)。

初始化

初始化,这个阶段就是执行类构造器< clinit >()方法的过程,为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。在Java中对类变量进行初始值设定有两种方式

  • ①声明类变量是指定初始值
  • ②使用静态代码块为类变量指定初始值

JVM初始化步骤

  • 1、假如这个类还没有被加载和连接,则程序先加载并连接该类
  • 2、假如该类的直接父类还没有被初始化,则先初始化其直接父类
  • 3、假如类中有初始化语句,则系统依次执行这些初始化语句

类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种

  • 创建类的实例,也就是new的方式
  • 访问某个类或接口的静态变量,或者对该静态变量赋值
  • 调用类的静态方法
  • 反射(如Class.forName(“com.shengsiyuan.Test”)
  • 初始化某个类的子类,则其父类也会被初始化
  • Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类

使用

当 JVM 完成初始化阶段之后,JVM 便开始从入口方法开始执行用户的程序代码。

卸载

当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存。

类加载器

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。JVM提供了3种类加载器:

b6abc9c42f00b9b7707e5306ca00c10b.png

启动类加载器Bootstrap ClassLoader,负责加载存放在JDKjrelib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.开头的类均被Bootstrap ClassLoader加载)。启动类加载器是无法被Java程序直接引用的。扩展类加载器Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载JDKjrelibext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.开头的类),开发者可以直接使用扩展类加载器。应用程序类加载器Application ClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。

双亲委派模型

下图中展示了类加载器直接的关系和双亲委派模型

37d4e75eedf9451cb4cbf0a78dcdca8c.png

从图中我们发现除启动类加载器外,每个加载器都有父的类加载器。
双亲委派机制:如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

f186c02d5317b8559d6df473a6197308.png

从类的继承关系来看,ExtClassLoader和AppClassLoader都是继承URLClassLoader,都是ClassLoader的子类。而BootStrapClassLoader是有C写的,不再java的ClassLoader子类中。
从图中可以看到类加载器间的父子关系不是以继承的方式实现的,而是以组合关系的方式来复用父加载器的代码。如果一个类加载器收到了类加载的请求,它首先会把这个请求委派给父加载器去完成,每一个层次的类加载器都是如此。 双亲委派模型的好处
Java类随着加载它的类加载器一起具备了一种带有优先级的层次关系。比如,Java中的Object类,它存放在rt.jar之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object在各种类加载环境中都是同一个类。如果不采用双亲委派模型,那么由各个类加载器自己取加载的话,那么系统中会存在多种不同的Object类。

jvm类加载相关链接:

https://blog.csdn.net/javazejian/article/details/73413292

https://www.jianshu.com/p/3cab74a189de

https://www.fangzhipeng.com/javainterview/2019/04/15/class-loader.html

http://www.ityouknow.com/jvm/2017/08/19/class-loading-principle.html

https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html

https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html

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

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

相关文章

【284天】我爱刷题系列(43)

叨叨两句 身体是灵魂的载体&#xff0c;灵魂是身体的指引&#xff0c;用心维护、驯化你的身体&#xff0c;构建通道&#xff0c;指引它将力量与情绪宣泄在你想做出成绩的领域&#xff0c;神奇的事情就会发生&#xff0c;哈哈。牛客网——java专项练习023 1 SuppressWarnings(“…

基于python渗透测试_Python中基于属性的测试简介

基于python渗透测试by Shashi Kumar Raja由Shashi Kumar Raja Python中基于属性的测试简介 (Intro to property-based testing in Python) In this article we will learn a unique and effective approach to testing called property-based testing. We will use Python , p…

leetcode144. 二叉树的前序遍历(迭代)

给定一个二叉树&#xff0c;返回它的 前序 遍历。示例:输入: [1,null,2,3] 1\2/3 输出: [1,2,3]代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val…

矩阵的理解经典博客

矩阵理解一&#xff1a;https://blog.csdn.net/myan/article/details/647511 矩阵理解二&#xff1a;https://blog.csdn.net/myan/article/details/649018 矩阵理解三&#xff1a;https://blog.csdn.net/myan/article/details/1865397 关键结论&#xff1a; 1. 首先有空间&…

推断图片格式

Linux/Unix下系统推断文件类型并不根据文件名称&#xff0c;也即不会根据文件后缀来推断文件的类型。从网上下载了一个图片&#xff0c;没有后缀&#xff0c;希望可以正确推断出格式。以便于共享到其它平台&#xff0c;该怎么办呢&#xff1f; 不同文件类型的文件头部信息不同&…

云服务器怎么设置域名,云服务器域名设置在哪里

可能不同的云服务厂商域名设置的方式略有不同&#xff0c;不过&#xff0c;大体来讲&#xff0c;方法应该都差不多的。下面我们以1.打开浏览器&#xff0c;搜索西部数码官网并登陆账号密码&#xff0c;到会员中心。2.进入管理中心后&#xff0c;在左侧的业务管理中找到3.点击服…

RHCE 学习笔记(9) 网络管理

n这一节本来按照教学大纲应该是学习SSH&#xff0c;不过SSH有很多网络相关的知识&#xff0c;因此老师把网络内容提前了一些。网络的基本知识例如IP&#xff0c;DNS&#xff0c;DHCP&#xff0c;路由协议等常识就不在此解释了。 RHEL查看网卡的相关信息很容易&#xff0c;ifcon…

leetcode 1207. 独一无二的出现次数(map+set)

给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;arr [1,2,2,1,1,3] 输出&#xff1a;true 解释&#xff1a;在该数组…

地图上绘制任意角度的椭圆_地图上的总椭圆

地图上绘制任意角度的椭圆或者&#xff0c;如何选择下班后去海滩的最佳方式 (Or, how to choose the best way to walk to the beach after work) It was a cool autumn evening when Hila Kloper and I were thinking of going to the beach after work. The beach is about 2…

【NOI2014】起床困难综合症 贪心

从高到低按位贪心&#xff0c;讨论一下初始0或1&#xff0c;分别暴力算出结果是什么 如果一开始0就能得1当然直接ans垒起来 如果1能得1而且当前m够用&#xff0c;那也垒起来&#xff0c;同时m减掉 否则gg 2min的代码 1 #include <bits/stdc.h>2 #define miaom(x,y) ((x &…

用原生js封装get方法

get方法的封装 首先我们看一下用原生js来发送请求的步骤: 1.创建请求对象 .var xhrnew XMLHttpRequest(); 2.创建open方法确认请求方式和地址 xhr.open(get,url) ps(记住get方法有参数的话在url后面用?符号连接再加上参数如:url?num3,多个参数用&符号连接); 3.监听事件…

10一个应用阻止关机贴吧_手机该不该每天关机一次?看完才知道这么多年白用了...

晚上习惯关机睡觉的朋友们在哪里&#xff1f;举起你们的手让小编看看&#xff01;那么问题来了&#xff0c;你为啥要关机睡觉&#xff1f;是担心手机“睡眠不足”&#xff0c;还是担心屏亮会让你忍不住的熬夜&#xff1f;然而&#xff0c;有朋友认为手机应该每天关机一次&#…

老王学linux-ftp

FTP&#xff1a;File TransferProtocol 21/tcp: 文件共享服务&#xff1a;应用层&#xff0c;ftp NFS:Network File System (RPC: Remote Procedure Call, 远程过程调用) Samba:CIFS/SMB FTP: tcp, 两个连接 命令连接&#xff0c;控制连接&#xff1a;21/tcp 数据连接: 主动模式…

leetcode 129. 求根到叶子节点数字之和(先序遍历)

给定一个二叉树&#xff0c;它的每个结点都存放一个 0-9 的数字&#xff0c;每条从根到叶子节点的路径都代表一个数字。例如&#xff0c;从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输…

fritz 使用手册_Fritz对象检测指南:使用机器学习在Android中构建宠物监控应用

fritz 使用手册by Eric Hsiao萧敬轩 Fritz对象检测指南&#xff1a;使用机器学习在Android中构建宠物监控应用 (A guide to Object Detection with Fritz: Build a pet monitoring app in Android with machine learning) Whether it is detecting plant damage for farmers, …

ajax无刷新评论的思路,ajax学习——ajax版无刷新评论(数据库)

//Comment.htm无刷新评论type"text/javascript">//加载评论$(function() {$.post("GetComment.ashx",function(data, status) {if (status ! "success") {$("#ulComment").append($("加载数据失败"));return;}var lines …

Numpy 新手教程(2)

翻译自官方文档Tentative NumPy Tutorial&#xff0c;有删节。 基本操作 主要的算术运算符都能够应用于数组类型&#xff0c;结果为相应元素之间的运&#xff0c;返回值为一个新的数组。 >>> a array( [20,30,40,50] ) >>> b arange( 4 ) >>> b a…

bl小说里面有个机器人管家_机器人也有攀登者,登顶珠峰的机器人来了!独造机器人管家...

机器人也有攀登者&#xff0c;登顶珠峰的机器人来了!2019年&#xff0c;是一个具有特殊纪念意义的年份!为庆祝祖国70华诞&#xff0c;各行各业纷纷献礼。9月30日&#xff0c;由吴京、章子怡、张译、井柏然、胡歌等知名演员主演的年度冒险电影——《攀登者》&#xff0c;将隆重上…

python 找出监听的端口号对号显示

刚好做运维平台&#xff0c;领导也有个要求是实时的查看&#xff0c;任意一台主机的端口开启状态&#xff0c;实际上我已经做了脚本发邮件每天diff的功能&#xff0c;但是为了方便展示还是写了这个脚本&#xff1a; 脚本内容&#xff1a; 123456789101112131415161718192021222…

2018年最新税收分类编码_2018年新编码器调查:31,000人告诉我们他们如何学习编码和获得开发人员工作

2018年最新税收分类编码More than 31,000 people responded to our 2018 New Coder Survey, granting researchers an unprecedented glimpse into how adults are learning to code.超过31,000人对我们的2018年《新编码器调查》做出了回应&#xff0c;使研究人员对成年人如何学…