当前位置: 首页 > news >正文 同学录网站建设卡片式网站 news 2025/10/25 15:14:15 同学录网站建设,卡片式网站,免费python教程,网站域名空间代理JVM细节版架构图 本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程 类加载子系统作用 1.类加载子系统负责从文件系统或者网络中加载class文件#xff0c;class文件在文件开头有特定的文件标识即16进制CA FE BA BE#xff1b; 2.加载后的Class类信息…JVM细节版架构图 本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程 类加载子系统作用 1.类加载子系统负责从文件系统或者网络中加载class文件class文件在文件开头有特定的文件标识即16进制CA FE BA BE 2.加载后的Class类信息存放于一块成为方法区的内存空间。除了类信息之外方法区还会存放运行时常量池信息可能还包括字符串字面量和数字常量这部分常量信息是Class文件中常量池部分的内存映射 来一张经典的JVM内存结构图其中类加载器的工作范围只限于下图的左半部分不包含调用构造器实例化对象 3.ClassLoader只负责class文件的加载至于它是否可以运行则由Execution Engine决定 4.如果调用构造器实例化对象则其实例存放在堆区 类加载子系统功能细分 加载模块 1.通过一个类的全限定名获取定义此类的二进制字节流 2.将这个字节流所代表的的静态存储结构转化为方法区的运行时数据 3.在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类的各种数据的访问入口 链接模块分为三块即验证、准备、解析 验证 1.目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求保证被加载类的正确性不会危害虚拟机自身安全。 2.主要包括四种验证文件格式验证源数据验证字节码验证符号引用验证。 准备 1.为类变量分配内存并且设置该类变量的默认初始值即零值 2.这里不包含用final修饰的sttic因为final在编译的时候就会分配了准备阶段会显式初始化 3.之类不会为实例变量分配初始化类变量会分配在方法去中而实例变量是会随着对象一起分配到java堆中。 解析 1.将常量池内的符号引用转换为直接引用的过程。 2.事实上解析操作网晚会伴随着jvm在执行完初始化之后再执行 3.符号引用就是一组符号来描述所引用的目标。符号应用的字面量形式明确定义在《java虚拟机规范》的class文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄 4.解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info/CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。 初始化模块初始化阶段就是执行类构造器方法clinit的过程 1.clinit()即“class or interface initialization method”注意他并不是指构造器init() 2.此方法不需要定义是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。 3.我们注意到如果没有静态变量c那么字节码文件中就不会有clinit方法 构造器方法clinit()中指令按语句在源文件中出现的顺序执行 虚拟机必须保证一个类的clinit()方法在多线程下被同步加锁 即一个类只需被clinit一次之后该类的内部信息就被存储在方法区。 可以看到线程2并不会重复执行初始化操作 类加载器分类 1.JVM支持两种类型的加载器分别为引导类加载器C/C实现BootStrap ClassLoader和自定义类加载器由Java实现 2.从概念上来讲自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器但是java虚拟机规范却没有这么定义而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。 3.注意上图中的加载器划分关系为包含关系并不是继承关系 4.按照这样的加载器的类型划分在程序中我们最常见的类加载器是引导类加载器BootStrapClassLoader、自定义类加载器(Extension Class Loader、System Class Loader、User-Defined ClassLoader 自定义类与核心类库的加载器 1.对于用户自定义类来说将使用系统类System Class Loader加载器中的AppClassLoader进行加载 2.java核心类库都是使用引导类加载器BootStrapClassLoader加载的 /*** ClassLoader加载*/ public class ClassLoaderTest {public static void main(String[] args) {//获取系统类加载器ClassLoader systemClassLoader ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader18b4aac2//获取其上层 扩展类加载器ClassLoader extClassLoader systemClassLoader.getParent();System.out.println(extClassLoader);//sun.misc.Launcher$ExtClassLoader610455d6//获取其上层 获取不到引导类加载器ClassLoader bootStrapClassLoader extClassLoader.getParent();System.out.println(bootStrapClassLoader);//null//对于用户自定义类来说使用系统类加载器进行加载ClassLoader classLoader ClassLoaderTest.class.getClassLoader();System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader18b4aac2//String 类使用引导类加载器进行加载的 --java核心类库都是使用引导类加载器加载的ClassLoader classLoader1 String.class.getClassLoader();System.out.println(classLoader1);//null获取不到间接证明了String 类使用引导类加载器进行加载的} } 虚拟机自带的加载器 启动类加载器引导类加载器BootStrap ClassLoader 1.这个类加载使用C/C语言实现的嵌套在JVM内部 2.它用来加载java的核心库JAVA_HOME/jre/lib/rt.jar/resources.jar或sun.boot.class.path路径下的内容用于提供JVM自身需要的类 3.并不继承自java.lang.ClassLoader,没有父加载器 4.加载拓展类和应用程序类加载器并指定为他们的父加载器即ClassLoader 5.出于安全考虑BootStrap启动类加载器只加载包名为java、javax、sun等开头的类 拓展类加载器Extension ClassLoader 1.java语言编写 由sun.misc.Launcher$ExtClassLoader实现。 2.派生于ClassLoader类 3.从java.ext.dirs系统属性所指定的目录中加载类库或从JDK的安装目录的jre/lib/ext子目录扩展目录下加载类库。如果用户创建的JAR放在此目录下也会由拓展类加载器自动加载 应用程序类加载器系统类加载器AppClassLoader 1.java语言编写 由sun.misc.Launcher$AppClassLoader实现。 2.派生于ClassLoader类 3.它负责加载环境变量classpath或系统属性 java.class.path指定路径下的类库 4.该类加载器是程序中默认的类加载器一般来说java应用的类都是由它来完成加载 5.通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器 代码演示 /*** 虚拟机自带加载器*/ public class ClassLoaderTest1 {public static void main(String[] args) {System.out.println(********启动类加载器*********);URL[] urls sun.misc.Launcher.getBootstrapClassPath().getURLs();//获取BootStrapClassLoader能够加载的api路径for (URL e:urls){System.out.println(e.toExternalForm());}//从上面的路径中随意选择一个类 看看他的类加载器是什么//Provider位于 /jdk1.8.0_171.jdk/Contents/Home/jre/lib/jsse.jar 下引导类加载器加载它ClassLoader classLoader Provider.class.getClassLoader();System.out.println(classLoader);//nullSystem.out.println(********拓展类加载器********);String extDirs System.getProperty(java.ext.dirs);for (String path : extDirs.split(;)){System.out.println(path);}//从上面的路径中随意选择一个类 看看他的类加载器是什么:拓展类加载器ClassLoader classLoader1 CurveDB.class.getClassLoader();System.out.println(classLoader1);//sun.misc.Launcher$ExtClassLoader4dc63996} } 知识扩展启动类加载器BootStrapClassLoader能够加载的api路径有 最近看java.util.concurrent包的内容发现java.time.、java.util.、java.nio.、java.lang.、java.text.、java.sql.、java.math.*等等都在rt.jar包下 为什么要使用用户自定义类加载器 1.隔离加载类 2.修改类加载的方式 3.拓展加载源 4.防止源码泄漏 ClassLoader的常用方法及获取方法 ClassLoader类它是一个抽象类其后所有的类加载器都继承自ClassLoader不包括启动类加载器 ClassLoader继承关系 代码示例如下 双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式也就是说当需要使用该类时才会将她的class文件加载到内存生成的class对象。而且加载某个类的class文件时java虚拟机采用的是双亲委派模式即把请求交由父类处理它是一种任务委派 模式 双亲委派机制工作原理 代码示例 如图虽然我们自定义了一个java.lang包下的String尝试覆盖核心类库中的String但是由于双亲委派机制启动加载器会加载java核心类库的String类BootStrap启动类加载器只加载包名为java、javax、sun等开头的类而核心类库中的String并没有main方法 双亲委派机制的优势 1.避免类的重复加载如上 2.保护程序安全防止核心API被随意修改 启动类加载器可以抢在标准扩展类装载器之前去装载类而标准扩展类装载器可以抢在类路径加载器之前去装载那个类类路径装载 器又可以抢在自定义类加载器之前去加载它。所以Java虚拟机先从最可信的Java核心API查找类型这是为了防止不可靠的类扮演被信任的类试想一 下网络上有个名叫java.lang.Integer的类它是某个黑客为了想混进java.lang包所起的名字实际上里面含有恶意代码但是这种 伎俩在双亲模式加载体系结构下是行不通的因为网络类加载器在加载它的时候它首先调用双亲类加载器这样一直向上委托直到启动类加载器而启动类加载 器在核心Java API里发现了这个名字的类所以它就直接加载Java核心API的java.lang.Integer类然后将这个类返回所以自始自终网络上的 java.lang.Integer的类是不会被加载的。 3.保证核心API包的访问权限 但是如果这个移动代码不是去试图替换一个被信任的类就是前面说的那种情况而是想在一个被信任的包中插入一个全新的类型情况会怎样呢比如一个名为 java.lang.Virus的类经过双亲委托模式最终类装载器试图从网络上下载这个类因为网络类装载器的双亲们都没有这个类当然没有了因为 是病毒嘛。假设成功下载了这个类那你肯定会想Virus和lang下的其他类痛在java.lang包下暗示这个类是Java API的一部分那么是不是也拥有修改Java.lang包中数据的权限呢答案当然不是因为要取得访问和修改java.lang包中的权 限java.lang.Virus和java.lang下其他类必须是属于同一个运行时包的什么是运行时包运行时包是指由同一个类装载器装载的、属 于同一个包的、多个类型的集合。考虑一下java.lang.Virus和java.lang其他类是同一个类装载器装载的吗不是 的java.lang.Virus是由网络类装载器装载的 自定义类java.lang.MeDshjava.lang包需要访问权限阻止我们用包名自定义类 双亲委派机制在SPI中的应用# 1.某个应用程序由双亲委派机制找到引导类加载器首先调用rt.jar包中的SPI核心但由于SPI核心当中有各种各样的接口需要被实现这里指具体的服务提供商这里我们已JDBC.jar为例jdbc.jar可以为我们提供具体的实现。 2.那么这时我们需要反向委托找到线程上下文类加载器去加载jdbc.jar 3.线程上下文类加载器属于系统类加载器 JVM中表示两个class对象是否为同一个类 1.在jvm中表示两个class对象是否为同一个类存在的两个必要条件 类的完整类名必须一致包括包名 即使类的完整类名一致同时要求加载这个类的ClassLoader指ClassLoader实例对象必须相同是引导类加载器、还是定义类加载器 2.换句话说在jvm中即使这两个类对象class对象来源同一个Class文件被同一个虚拟机所加载但只要加载它们的ClassLoader实例对象不同那么这两个类对象也是不相等的. 3.对类加载器的引用JVM必须知道一个类型是有启动类加载器加载的还是由用户类加载器加载的。如果一个类型由用户类加载器加载的那么jvm会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候JVM需要保证两个类型的加载器是相同的。 类的主动使用和被动使用 java程序对类的使用方式分为主动使用和被动使用即是否调用了clinit()方法 主动使用在类加载系统中的第三阶段initialization即初始化阶段调用了clinit()方法 而被动使用不会去调用 主动使用分为七种情况 1.创建类的实例 2.访问某各类或接口的静态变量或者对静态变量赋值 3.调用类的静态方法 4.反射 比如Class.forName(com.dsh.jvm.xxx) 5.初始化一个类的子类 6.java虚拟机启动时被标明为启动类的类 7.JDK 7 开始提供的动态语言支持java.lang.invoke.MethodHandle实例的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic句柄对应的类没有初始化则初始化 除了以上七种情况其他使用java类的方式都被看作是对类的被动使用都不会导致类的初始化。 文章转载自: http://www.morning.rqsr.cn.gov.cn.rqsr.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.xprq.cn.gov.cn.xprq.cn http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn http://www.morning.sffkm.cn.gov.cn.sffkm.cn http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.ldpjm.cn.gov.cn.ldpjm.cn http://www.morning.mlzyx.cn.gov.cn.mlzyx.cn http://www.morning.guanszz.com.gov.cn.guanszz.com http://www.morning.mxftp.com.gov.cn.mxftp.com http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn http://www.morning.kqgqy.cn.gov.cn.kqgqy.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.smpmn.cn.gov.cn.smpmn.cn http://www.morning.bpmfl.cn.gov.cn.bpmfl.cn http://www.morning.qwmdx.cn.gov.cn.qwmdx.cn http://www.morning.yhpl.cn.gov.cn.yhpl.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.rqxmz.cn.gov.cn.rqxmz.cn http://www.morning.rngyq.cn.gov.cn.rngyq.cn http://www.morning.grbgn.cn.gov.cn.grbgn.cn http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn http://www.morning.nlpbh.cn.gov.cn.nlpbh.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.mhpkz.cn.gov.cn.mhpkz.cn http://www.morning.qhfdl.cn.gov.cn.qhfdl.cn http://www.morning.fosfox.com.gov.cn.fosfox.com http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.hydkd.cn.gov.cn.hydkd.cn http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn http://www.morning.fmtfj.cn.gov.cn.fmtfj.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.rwtlj.cn.gov.cn.rwtlj.cn http://www.morning.weitao0415.cn.gov.cn.weitao0415.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.fkwp.cn.gov.cn.fkwp.cn http://www.morning.yzxhk.cn.gov.cn.yzxhk.cn http://www.morning.irqlul.cn.gov.cn.irqlul.cn http://www.morning.dnpft.cn.gov.cn.dnpft.cn http://www.morning.tdcql.cn.gov.cn.tdcql.cn http://www.morning.wnjbn.cn.gov.cn.wnjbn.cn http://www.morning.jzccn.cn.gov.cn.jzccn.cn http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn http://www.morning.kchwr.cn.gov.cn.kchwr.cn http://www.morning.dkfrd.cn.gov.cn.dkfrd.cn http://www.morning.gnfkl.cn.gov.cn.gnfkl.cn http://www.morning.lflsq.cn.gov.cn.lflsq.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn http://www.morning.wmpw.cn.gov.cn.wmpw.cn http://www.morning.mrttc.cn.gov.cn.mrttc.cn http://www.morning.nqgjn.cn.gov.cn.nqgjn.cn http://www.morning.bswhr.cn.gov.cn.bswhr.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.ahlart.com.gov.cn.ahlart.com http://www.morning.xnwjt.cn.gov.cn.xnwjt.cn http://www.morning.tjkth.cn.gov.cn.tjkth.cn http://www.morning.drgmr.cn.gov.cn.drgmr.cn http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn http://www.morning.lflsq.cn.gov.cn.lflsq.cn http://www.morning.qmpbs.cn.gov.cn.qmpbs.cn http://www.morning.mprpx.cn.gov.cn.mprpx.cn http://www.morning.psxxp.cn.gov.cn.psxxp.cn http://www.morning.jggr.cn.gov.cn.jggr.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.nlgnk.cn.gov.cn.nlgnk.cn http://www.morning.wmfh.cn.gov.cn.wmfh.cn http://www.morning.yngtl.cn.gov.cn.yngtl.cn http://www.morning.tdmr.cn.gov.cn.tdmr.cn http://www.morning.ylqrc.cn.gov.cn.ylqrc.cn http://www.morning.jbtlf.cn.gov.cn.jbtlf.cn http://www.morning.ckbmz.cn.gov.cn.ckbmz.cn http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.qjtbt.cn.gov.cn.qjtbt.cn http://www.morning.cftkz.cn.gov.cn.cftkz.cn http://www.morning.mhxlb.cn.gov.cn.mhxlb.cn http://www.morning.glrzr.cn.gov.cn.glrzr.cn http://www.morning.dnqlba.cn.gov.cn.dnqlba.cn 查看全文 http://www.tj-hxxt.cn/news/248485.html 相关文章: flash网站建设教程视频做房产应看的网站 加盟网站合作wordpress js放到oss 梧州网站建设公司手机做ppt的软件 机票酒店 网站建设免费完整版的网站模板 购物网站前台功能模块分析企业建网站需要准备哪些资料呢 怎么可以创建网站长沙做网站价格 如何新建网站dw长沙seo关键词 印尼做网站的教学 中文企业登记信息查询系统 12306网站多钱做的租号网站建设贴吧 怎样设置网站主域名商城系统的基本 关于学校的网站模板免费下载长沙做引流推广的公司 域名查询站长工具seo工程师招聘 下载吧网站整站源码昆山建站公司 做学校网站的内容中山品牌网站建设报价 网站建设服务合同书网站开发Z亿玛酷1订制 青岛商家都上什么网站网站开发seo要求 如何做推广网站服务专业的网站制作服务 灯光设计网站推荐自动化培训机构排名 工信部网站备案查询验证码错误企业免费建站网站 邯郸住房和城乡建设部网站网站建设费按几年摊销 怎样建设公司网站湛江 网站建设 网站建设公司的方案wordpress无法使用api 网站建设 总体思路电商有哪些推广方法 备案时网站建设方案书谷歌商店下载官方 asp网站开发工具神器wordpress春节插件 提供赣州网站建设diango做的网站怎么用 一年网站维护做网站 租服务器 深圳网站优化多少钱网站建设技术文档 建筑网站步骤百度seo关键词优化工具 南京网站设计公司济南兴田德润简介图片泰安齐鲁人才网