首页 > 其他分享 >JVM类加载机制

JVM类加载机制

时间:2023-12-21 11:34:53浏览次数:32  
标签:初始化 Java 虚拟机 JVM 机制 Class 加载

JVM类加载机制

类加载机制概念

image-20221011112137522

概念说明:

1)虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型。程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载(loading)、连接(linking)、初始化(initialization)3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。

2)Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把Class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。

类装载方式有两种:
隐式装载:程序在运行过程中当碰到通过new等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。
显式装载:通过class.forname()等方法,显式加载需要的类。

3)Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到JVM中,至于其他类,则在需要的时候才加载,这当然就是为了节省内存开销。

加载、连接过程、初始化

1)加载
加载指的是将类的Class文件读入到内存,并将这些静态数据转换成方法区中的运行时数据结构,并在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。Java类加载器由JVM提供,是所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。类加载器,可以从不同来源加载类的二进制数据,比如本地Class文件、Jar包Class文件、网络Class文件等。类加载的最终产物就是位于堆中的Class对象(注意不是目标类对象),该对象封装了类在方法区中的数据结构,并且向用户提供了访问方法区数据结构的接口,即Java反射的接口。

2)连接过程
当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中(意思就是将Java类的二进制代码合并到JVM的运行状态之中)。

类连接又可分为如下3个阶段:
验证:确保加载的类信息符合JVM规范,没有安全方面的问题。主要验证是否符合Class文件格式规范,并且是否能被当前的虚拟机加载处理。
准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
解析:虚拟机常量池的符号引用替换为字节引用过程。

3)初始化
初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收藏类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生,代码从上往下执行。当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

初始化的总结就是:初始化是为类的静态变量赋予正确的初始值。

类加载器类别

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器,主要有一下四种类加载器:
1)启动类加载器(Bootstrap ClassLoader)
用来加载java核心类库,无法被java程序直接引用。

2)扩展类加载器(extensions class loader)
它用来加载Java的扩展库。Java虚拟机的实现会提供一个扩展库目录,该类加载器在此目录里面查找并加载Java类。

3)系统类加载器(system class loader)
它根据Java应用的类路径(CLASSPATH)来加载Java类。一般来说,Java应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。

4)用户自定义类加载器
通过继承java.lang.ClassLoader类的方式实现。

双亲委派模型

image-20221011114835716

概念说明:

如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。

标签:初始化,Java,虚拟机,JVM,机制,Class,加载
From: https://www.cnblogs.com/xdzy/p/17918620.html

相关文章

  • JVM内存模型
    JVM内存模型JDK7堆内存模型内存模型说明:1)Young(新生代)Young区被划分为三部分,Eden(ˈiːdn)区和两个大小严格相同的Survivor(sərˈvaɪvər)区,其中Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Eden区间变满的时候,GC就会将存活的对象移到空闲......
  • 继承--类中加载顺序
    1.题目介绍关于类中加载顺序的说法,以下说法正确的有(A,B,D)A.父类中的静态代码块先于子类中的静态代码块B.父类中的构造方法先于子类中的构造方法C.子类中的非静态代码块会执行,而父类不会D.子类中的构造块先于子类中的构造方法2.题解参考链接:Java代码块与构造方法执行顺序静......
  • 接口超时,接口参数的特殊符号,接口的有序性,重试机制的结果一致性
    接口超时,接口参数的特殊符号,接口的有序性,重试机制的结果一致性1.http超时时间,将restTemplate的连接,超时时间设置更加长的时间。2.httpmvcGET请求,?a=1&b=2&c=#3,测试发现含#符号会在服务接口接收参数异常。需要将#特殊符合过滤,比如:可以替换为中文”井“3.请求的有序性保持3.1服......
  • JVM虚拟机系统性学习-垃圾回收器CMS、G1和ZGC
    CMS:低延迟在JDK1.5时,HotSpot推出了CMS收集器,CMS收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程和用户线程同时工作CMS收集器关注尽可能地降低用户线程的停顿时间,停顿时间越短,用户的体验越好CMS收集器采用标记-清除算法和STW机制来回......
  • python代码实现保存微博文娱榜的数据Ajax异步加载
    最近有小伙伴看完蜜蜂之前分享的爬虫文章之后,使用python代码实现了自动保存网站上面的图片到本地,但是最近又有新的需求。需求描述:爬取微博文娱榜的数据,并保存到csv文件中网址:https://weibo.com/hot/entertainment需要将一下框上的两个字段都爬取下来。对于这样的需求,看过蜜蜂之前......
  • ArcGis加载天地图山东WMTS服务
    转自http://www.taodudu.cc/news/show-6306550.html?action=onClickhttp://www.taodudu.cc/news/show-4749559.html?action=onClick一、使用条件1.软件:本次测试软件ArcMap10.82.电脑可以连接互联网3、进入山东省地理信息公共服务平台完成注册山东省地理信息公共服务平台(s......
  • QT 加载构建控件的时候 是灰色的,并且不能编译
    先上图 我安装完程序之后,返现上面红框中是灰色的,并且前面还带一个黄色感叹号并且下面C++的地方还是空的,应该是系统没有c++编译器 为系统安装g++编译器sudoapt-getinstallg++不能编译需要安装套件,用命令行安装sudoapt-getinstallbuild-essential......
  • vue2加载远程组件
    <template> <divclass="async-component"> <div@click="child">hahah</div> <componentref="test":is="remote"v-if="remote":test="test"@handler="haha"/> ......
  • JVM初了解
    一、JVM常用启动参数说明以-开头为标准参数,所有的JVM都要实现这些参数,并且向后兼容,如-server。-D设置系统属性,如-Dfile.encoding=UTF-8。以-X开头为非标准参数,基本都是传给JVM的,默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容......
  • 《深入浅出Java虚拟机:JVM原理与实战》
    ......