首页 > 其他分享 >【JVM】类加载子系统

【JVM】类加载子系统

时间:2024-03-12 18:28:13浏览次数:20  
标签:初始化 Java 自定义 ClassLoader JVM 子系统 加载

JVM(Java虚拟机)的类加载子系统是其重要组成部分之一,负责在运行时动态加载、验证、准备、解析和初始化Java类。这个过程从查找类文件到将其转换为可在JVM内部使用的运行时数据结构进行操作。以下是类加载子系统的几个关键点:

  1. 类加载器
    • JVM定义了多种类加载器,包括引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)、应用程序类加载器(Application ClassLoader)以及用户自定义类加载器。
    • 引导类加载器:负责加载核心Java API类,如rt.jar中的类,它是用C++实现并嵌入在JVM中的,没有对应的Java对象实例。
    • 扩展类加载器:负责加载标准扩展功能的相关类库,位于jre/lib/ext目录下或通过java.ext.dirs系统属性指定的路径下的类库。
    • 应用程序类加载器:也称为系统类加载器,加载用户类路径(classpath)上的类。
  2. 双亲委派模型
    • 类加载器之间采用双亲委派机制来加载类,即当一个类加载器收到类加载请求时,并不会立即加载,而是先委托给它的父加载器尝试加载。只有当父加载器无法完成加载请求时,子加载器才会尝试自己加载。这样可以保证类的唯一性及安全性。
  3. 类加载过程
    • 加载(Loading):根据类的全限定名找到二进制字节流,创建Class对象。
    • 验证(Verification):确保被加载类信息符合JVM规范,不包含非法数据或者潜在的安全问题。
    • 准备(Preparation):为类的静态变量分配内存空间,并初始化为默认值。
    • 解析(Resolution):将符号引用替换为直接引用的过程,比如解析类之间的依赖关系。
    • 初始化(Initialization):如果类还没有被初始化,则会执行类初始化方法<clinit>,按照语句顺序对静态变量进行赋值,并执行静态块。
  4. 自定义类加载器: 开发人员可以通过继承抽象类java.lang.ClassLoader来创建自定义类加载器,从而实现特定的类加载策略,比如从网络、数据库或其他非标准来源加载类。
  5. 类卸载: 在满足一定条件时,类加载器可能会卸载不再使用的类,释放资源。但类卸载并不频繁,因为JVM为了保证类型安全和类的全局可见性,通常要求类的生命周期与类加载器保持一致。

标签:初始化,Java,自定义,ClassLoader,JVM,子系统,加载
From: https://blog.csdn.net/yanyc0411/article/details/136608171

相关文章

  • win10在任意位置安装Linux子系统
    1.把WSL1设置为默认版本以管理员身份打开Powershell,输入命令wsl--set-default-version12.启用适用于Linux的Windows子系统控制面板--程序--程序和功能--启用或关闭Windows功能选中适用于Linux的Windows子系统,确定完成后重启生效3.下载WSLLinux手动安装包选择Linux版本,下载......
  • openlayers加载tms切片图层
    ol3舍弃了直接加载TMS服务的方法,但是可以通过类似于加载WMS瓦片的形式来加载TMS瓦片地图。参考:https://blog.csdn.net/Wxq666666/article/details/108527892谷歌TMS瓦片加载:newol.layer.Tile({source:newol.source.XYZ({tileUrlFunction:function(tileCoor......
  • SFTP子系统申请已拒绝, 请确保SSH连接的SFTP子系统设置有效
    一、报错信息报错:SFTP子系统申请已拒绝请确保SSH连接的SFTP子系统设置有效二、错误原因是ssh配置做了限制,修改一下配置文件就好了。三、解决方式修改 sshd_config 配置文件。vim/etc/ssh/sshd_config如果配置文件中不存在以下代码,找个位置添加上即可。Subsystem......
  • Angular 我在点击了上一页或者下一页方法之后,重新加载渲染数据。为什么还需要再点击一
    在你的TypeScript代码中,当调用nextPage_TopSelling()或prevPage_TopSelling()方法时,虽然你更新了currentPage_TopSelling的值并调用了reloadTopSelling()方法,但是Angular并不会自动检测到这些变化并重新渲染页面。这是因为Angular的变化检测机制是基于异步的,在一些......
  • JeecgBoot Vue3前端项目性能优化&按需加载方案
    JeecgBootvue3前端项目在3.5.5版本之前,的确存在很严重的性能问题,大家可以参考以下文档进行升级。按需加载改造方法1、全局注册地方去掉2、组件改成异步注册3、用不到的大组件可以删掉【精简项目方案】大组件1、富文本tinyme2、Markdown3、CodeMirror4、地图数据......
  • 面试学习——JVM
    讲讲JVM原理,JVM是做什么的JVM怎么判断一个对象可以销毁了类加载机制、有哪些类加载器jvm双亲委派机制,为什么要用双亲委派机制?垃圾回收器、垃圾回收算法一个对象什么时候会进入新生代、什么时候会进入老年代什么时候会发生younggc,什么时候会发生oldgc,什么时候会发生fu......
  • python加载2
    #testInstance.py#导入需要的模块importimportlib#导入模块以动态加载库中的类和函数importsys#导入系统模块,用于操作Python解释器的参数和变量importosimportpkgutil#定义TestInstance类classTestInstance:#初始化方法,当创建TestInstance对象时调......
  • 分布式锁——JVM锁、MySQL锁解决多线程下并发争抢资源
    分布式锁——JVM锁、MySQL锁解决库存超卖问题引入库存扣案例需求背景电商项目中,用户购买商品后,会对商品的库存进行扣减。需求实现根据用户购买商品及商品数量,对商品的库存进行指定数量的扣减publicStringdeductStock(LonggoodsId,Integercount){//1.查询商品......
  • python加载
    #testInstance.py#导入需要的模块importimportlib#导入模块以动态加载库中的类和函数importsys#导入系统模块,用于操作Python解释器的参数和变量importosimportpkgutil#定义TestInstance类classTestInstance:#初始化方法,当创建TestInstance对象时调......
  • MPU6050 memcmp(firmware+ii, cur, this_write)初始化问题|MPU6050固件库加载问题
    使用MPU6050dmp固件库时候报错:MPU6050固件库加载,最后运行到“memcmp(firmware+ii,cur,this_write)”无法通过!从网上查找了相同问题的解答,发现修改了IIcSDA与SCL端口但是头文件的中的宏定义没有修改未修改之前的端口:修改之后的端口:这里在修改宏定义的时候遇到了些问......