JVM - 类加载,连接和初始化

news2024/12/25 13:34:41

目录

类加载和类加载器

概述

类加载要完成的功能

加载类的方式

类加载器

类加载器的关系

类加载器说明

双亲委派模型

工作过程如下:

双亲委派模型说明:

破坏双亲委派模型:

类连接和初始化

类连接主要验证的内容

类连接中的解析

类的初始化时机

类的卸载


  • 类加载和类加载器

  • 类从被加载到JVM开始,到卸载出内存,整个生命周期如图

  • 概述

  • 加载:
    • 查找并加载类文件的二进制数据
  • 连接:
    • 就是将已经读入内存的类的二进制数据合并到JVM运行时环境中去
    • 包含如下几个步骤:
      • (1)验证:确保被加载类的正确性
      • (2)准备:为类的静态变量分配内存,并初始化它们
      • (3)解析:把常量池中的符号引用转换成直接引用
  • 初始化:
    • 为类的静态变量赋初始值
  • 类加载要完成的功能

  • (1)通过类的全限定名来获取该类的二进制字节流
  • (2)把二进制字节流转化为方法区的运行时数据结构
  • (3)在堆上创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并向外提供了访问方法区内数据结构的接口
  • 加载类的方式

  • 最常见的方式:本地文件系统中加载、从jar等归档文件中加载
  • 动态的方式:将java源文件动态编译成class
  • 其它方式:网络下载、从专有数据库中加载等等
  • 类加载器

  • Java虚拟机自带的加载器包括如下几种:
  • 启动类加载器(BootstrapClassLoader)
  • 平台类加载器(PlatformClassLoader)(JDK8:扩展类加载器ExtensionClassLoader)
  • 应用程序类加载器(AppClassLoader)
  • 用户自定义的加载器,是java.lang.ClassLoader的子类,用户可以定制类的加载方式;只不过自定义类加载器其加载的顺序是在所有系统类加载器的最后
  • 类加载器的关系

  • 类加载器说明

  • 启动类加载器:用于加载启动的基础模块类
  • 比如:java.base、java.management、java.xml等等
  • 平台类加载器:用于加载一些平台相关的模块
  • 比如:java.scripting、java.compiler*、java.corba*等等
  • 应用程序类加载器:用于加载应用级别的模块
  • 比如:jdk.compiler、jdk.jartool、jdk.jshell等等;还加载classpath路径中的所有类库
  • JDK8:启动类加载器:
  • 负责将<JAVA_HOME>/lib,或者-Xbootclasspath参数指定的路径中的,且是虚拟机识别的类库加载到内存中(按照名字识别,比如rt.jar,对于不能识别的文件不予装载)
  • JDK8:扩展类加载器:
  • 负责加载<JRE_HOME>/lib/ext,或者java.ext.dirs系统变量所指定路径中的所有类库
  • JDK8:应用程序类加载器:
  • 负责加载classpath路径中的所有类库
  • Java程序不能直接引用启动类加载器,直接设置classLoader为null,默认就使用启动类加载器
  • 类加载器并不需要等到某个类“首次主动使用”的时候才加载它,Jvm规范允许类加载器在预料到某个类将要被使用的时候就预先加载它
  • 如果在加载的时候.class文件缺失,会在该类首次主动使用时报告LinkageError错误,如果一直没有被使用,就不会报错
  • 双亲委派模型

  • JVM中的ClassLoader通常采用双亲委派模型,要求除了启动类加载器外,其余的类加载器都应该有自己的父级加载器
  • 这里的父子关系是组合而不是继承
  • 工作过程如下:

    • (1)一个类加载器接收到类加载请求后,首先搜索它的内建加载器定义的所有“具名模块”
    • (2)如果找到了合适的模块定义,将会使用该加载器来加载
    • (3)如果class没有在这些加载器定义的具名模块中找到,那么将会委托给父级加载器,直到启动类加载器
    • (4)如果父级加载器反馈它不能完成加载请求,比如在它的搜索路径下找不到这个类,那子的类加载器才自己来加载
    • (5)在类路径下找到的类将成为这些加载器的无名模块
  • 双亲委派模型说明:

  • (1)双亲委派模型对于保证Java程序的稳定运作很重要
  • (2)实现双亲委派的代码在java.lang.ClassLoader的loadClass()方法中,如果自定义类加载器的话,推荐覆盖实现findClass()方法
  • (3)如果有一个类加载器能加载某个类,称为定义类加载器,所有能成功返回该类的Class的类加载器都被称为初始类加载器
  • (4)如果没有指定父加载器,默认就是启动加载器
  • (5)每个类加载器都有自己的命名空间,命名空间由该加载器及其所有父加载器所加载的类构成,不同的命名空间,可以出现类的全路径名相同的情况
  • (6)运行时包由同一个类加载器的类构成,决定两个类是否属于同一个运行时包,不仅要看全路径名是否一样,还要看定义类加载器是否相同;只有属于同一个运行时包的类才能实现相互包内可见
  • 破坏双亲委派模型:

  • 双亲模型有个问题:
    • 父加载器无法向下识别子加载器加载的资源
  • 为了解决这个问题
    • 引入了线程上下文类加载器,可以通过Thread的setContextClassLoader()进行设置
  • 另外一种典型情况就是实现热替换,比如OSGI的模块化热部署,它的类加载器就不再是严格按照双亲委派模型,很多可能就在平级的类加载器中执行了
  • 类连接和初始化

  • 类连接主要验证的内容

  • 类文件结构检查:
    • 按照JVM规范规定的类文件结构进行
  • 元数据验证:
    • 对字节码描述的信息进行语义分析,保证其符合Java语言规范要求
  • 字节码验证:
    • 通过对数据流和控制流进行分析,确保程序语义是合法和符合逻辑的;这里主要对方法体进行校验
  • 符号引用验证:
    • 对类自身以外的信息,也就是常量池中的各种符号引用,进行匹配校验
  • 类连接中的解析

  • 所谓解析就是把常量池中的符号引用转换成直接引用的过程
  • 包括:
  • 符号引用:
    • 以一组无歧义的符号来描述所引用的目标,与虚拟机的实现无关
  • 直接引用:
    • 直接指向目标的指针、相对偏移量、或是能间接定位到目标的句柄,是和虚拟机实现相关的
  • 主要针对:类、接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符
  • 类的初始化时机

  • Java程序对类的使用方式分成:
  • 主动使用和被动使用
  • JVM必须在每个类或接口“首次主动使用”时才初始化它们
  • 被动使用类不会导致类的初始化
  • 主动使用的情况:
    • (1)创建类实例
    • (2)访问某个类或接口的静态变量
    • (3)调用类的静态方法
    • (4)反射某个类
    • (5)初始化某个类的子类,而父类还没有初始化
    • (6)JVM启动的时候运行的主类
    • (7)定义了default方法的接口,当接口实现类初始化时
  • 类的卸载

  • 当代表一个类的Class对象不再被引用,那么Class对象的生命周期就结束了,对应的在方法区中的数据也会被卸载
  • Jvm自带的类加载器装载的类,是不会卸载的,由用户自定义的类加载器加载的类是可以卸载的

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

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

相关文章

c++重中之重:“换个龟壳继续套娃“:运算符重载等的学习

文章目录 前言一.运算符重载二.const成员三.取地址重载总结前言 上一期我们讲到类的6个默认构造函数中的拷贝构造函数&#xff0c;这一期我们继续往下讲&#xff0c;当然难点肯定是运算符重载了。 一、运算符重载 运算符重载是c为了增强代码的可读性引入了运算符重载&#xf…

笑死,面试官又问我SpringBoot自动配置原理

面试官&#xff1a;好久没见&#xff0c;甚是想念。今天来聊聊SpringBoot的自动配置吧&#xff1f; 候选者&#xff1a;嗯&#xff0c;SpringBoot的自动配置我觉得是SpringBoot很重要的“特性”了。众所周知&#xff0c;SpringBoot有着“约定大于配置”的理念&#xff0c;这一…

亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )

专栏&#xff1a;高并发---前后端分布式项目 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、…

Spring-事务2

文章目录前言一、事务的特性&#xff08;ACID&#xff09;二、事务的隔离级别三、spring中的事务平台事务管理器.事务定义ISOLation_XXX&#xff1a;**事务隔离级别.**PROPAGATION_XXX&#xff1a;**事务的传播行为**.事务状态关系&#xff1a;四、使用XML文件配置事务1、 搭建…

2023前端面试题——JS篇

1.判断 js 类型的方式 1. typeof 可以判断出’string’,‘number’,‘boolean’,‘undefined’,‘symbol’ 但判断 typeof(null) 时值为 ‘object’; 判断数组和对象时值均为 ‘object’ 2. instanceof 原理是 构造函数的 prototype 属性是否出现在对象的原型链中的任何位置 …

Vue原理解析

文章目录1. VUE的响应式原理1.1 ViewModel1.2 双向绑定的基本原理1.3 什么是响应性1.4 Vue 中的响应性是如何工作的2. Vue 渲染机制2.1 虚拟 DOM2.2 渲染管线2.3 带编译时信息的虚拟 DOM2.3.1 静态提升2.3.2 修补标记 Flags2.3.3 树结构打平2.3.4 对 SSR 激活的影响1. VUE的响应…

Zookeeper安装和基本使用

目录标题一、下载二、安装三、启动客户端测试四、使用zk一、下载 注意&#xff1a;自zk3.5.5版本以后&#xff0c;已编译的jar包&#xff0c;尾部有bin&#xff0c;应该使用的是apache-zookeeper-3.8.0-bin.tar.gz。&#xff0c;因此在下载高版本时&#xff0c;因该下载后缀带b…

华为手表开发:WATCH 3 Pro(5)点击按钮弹窗

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;5&#xff09;点击按钮弹窗初环境与设备创建项目认识目录结构修改首页 -> 新建按钮 “ 按钮 ”文件名&#xff1a;**index.hml**引用包&#xff1a;system.prompt点击结果初 鸿蒙可穿戴开发 希望能写一些简单的教程和案例…

三大指标继续狂飙!重庆啤酒:不惧强弱分化加剧,深耕高端市场

十多年前&#xff0c;重庆啤酒因为9个跌停而被一片唱衰&#xff0c;资本市场经典的“关灯吃面”典故自此出现&#xff0c;被股民沿用至今。不过自2020年&#xff0c;重庆啤酒开始逆转走势&#xff0c;股价连续上涨。2021年重庆啤酒营收突破百亿大关&#xff0c;净赚11.66亿元&a…

关于小程序,你想知道的这些

近年来&#xff0c;各大平台纷纷上架小程序&#xff0c;迎来了小程序的爆发式增长。今天就来跟大家简单分享一下小程序基本的运行机制和安全机制。 小程序的由来 在小程序没有出来之前&#xff0c;最初微信WebView逐渐成为移动web重要入口&#xff0c;微信发布了一整套网页开…

自监督表征学习方法——BYOL(Bootstrap Your Own Latent)

自监督表征学习方法——BYOL(Bootstrap Your Own Latent) 参考文献&#xff1a;《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》 1.前言背景 学习良好的图像表示是计算机视觉中的一个关键挑战&#xff0c;因为它允许对下游任务进行有效的训练。许…

POE接口电路设计

首先看到PSE端&#xff0c;主要包含PSE芯片&#xff0c;MOS管&#xff08;有些PSE芯片MOS管是集成在芯片里面的&#xff09;&#xff0c;自恢复保险丝&#xff0c;还有TVS管&#xff0c;一般这个TVS管保护电压是58V的。这个电阻是用来检测POE传输的电流的&#xff0c;一般是0.几…

vue2 diff算法及虚拟DOM

概括&#xff1a;diff算法&#xff0c;虚拟DOM中采用的算法&#xff0c;把树形结构按照层级分解&#xff0c;只比较同级元素&#xff0c;不同层级的节点只有创建和删除操作。 一、虚拟DOM (1) 什么是虚拟DOM&#xff1f; 虚拟 DOM (Virtual DOM&#xff0c;简称 VDOM) 是一种…

KDDAC-10kV 电缆交流耐压及振荡波局放测试系统

一、概述 目前对电力电缆检修的管理&#xff0c;主要是依据《电力设备交接和预防性试验规程》所规定的项目和试验周期&#xff0c;定期在停电状态下进行绝缘性能试验。其中变频串联谐振试验由于试验状况接近电缆的运行工况&#xff0c;因此成为国内目前应用广泛的试验方法。 …

社科院与杜兰大学中外合作办学金融管理硕士——30+的年龄在职读研有必要吗?

说起读研&#xff0c;年龄在什么区间最合适呢&#xff1f;上次有位咨询的同学反馈年龄已经快35岁了&#xff0c;有一份不错的工作&#xff0c;但又不甘心止步于此&#xff0c;想要通过提升学历升职加薪&#xff0c;但又纠结自己是否能静下心来学习、是否能顺利毕业、拿到的证书…

[HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分

比赛后有讲解&#xff0c;没赶上&#xff0c;前20比赛完1小时提交WP&#xff0c;谁会大半夜的起来写WP。总的感觉pwn,crypto过于简单&#xff0c;rev有2个难的不会&#xff0c;其它不是我的方向都感觉过于难&#xff0c;一个都没作。revDECOMPILEONEOONE入门题&#xff0c;一个…

12 循环神经网络(基础篇) Basic RNN

文章目录问题引入关于权重权重共享RNN CellRNN原理RNN计算过程代码实现RNN Cell维度说明代码RNN维度说明NumLayers说明计算过程代码参考实例问题分析多分类问题代码RNN CellRNN改进Embedding网络结构Embedding说明Linear说明代码课程来源&#xff1a; 链接课程文本参考&#xf…

前端react面试题指南

概述下 React 中的事件处理逻辑 抹平浏览器差异&#xff0c;实现更好的跨平台。避免垃圾回收&#xff0c;React 引入事件池&#xff0c;在事件池中获取或释放事件对象&#xff0c;避免频繁地去创建和销毁。方便事件统一管理和事务机制。 为了解决跨浏览器兼容性问题&#xff0…

CSS基础:盒子模型和浮动

盒子模型 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子&#xff0c;封装HTML元素。 它包括&#xff1a;外边距&#xff08;margin&#xff09;&#xff0c;边框&#xff08;bord…

操作系统考试突击复习笔记

0 基础概念补充特权命令&#xff1a;有特殊权限的指令&#xff0c;比如清内存、置时钟、分配系统资源、修改虚拟内存的段表和页表&#xff0c;修改用户的访问权限。系统调用&#xff1a;操作系统为应用程序提供的使用接口&#xff0c;可以理解为一种可供应用程序调用的特殊函数…