当前位置: 首页 > web >正文

接地气的方式认识JVM(二)

最近实习,感觉属于自己的时间越来越少了,这次来一起说说jvm的类加载器吧。

类加载器

他是干什么的?
类加载器是用来将.class文件搬运到内存中的,并将这些内容转换成方法区运行时的数据结构,并且ClassLoader只负责class文件的加载,而是否能运行则有Execution Engine来决定。

1.1类加载器的流程

加载器的流程包括:加载、链接、初始化
再具体一点就是:加载,验证,准备,解析,初始化,使用,卸载
其中验证,准备,解析都属于链接

1.1.1加载

1.将.class文件加载到内存中去
2.将静态的数据结构转化成方法区运行时的数据结构
3.在堆上生成一个代表这个类的java.lang.Class文件对象作为数据的入口

1.1.2链接

1.验证:对类做一个安全检查,防止这个文件会对jvm做一些攻击的事情
2.准备:为static变量在方法区中分配内存方法,设置变量的初始值,例如 static int a=3
3.解析:虚拟机将常量池内的符号引用替换为直接引用的过程(从import java.util…这算法号引用,直接引用就是指针或者对象地址

1.1.3初始化

初始化其实就是执行类构造器方法的()的过程,而且要保证执行前父类的()方法执行完毕。这个方法由编译器收集,顺序执行所有类变量(static 修饰的成员变量)显式初始化和静态代码块中语句。此时准备阶段时的那个 static int a 由默认初始化的 0 变成了显式初始化的 3。

1.1.4卸载

GC将无用对象从内存中卸载

1.2类加载器的加载顺序

加载一个类是有优先级的
1.BootStrap ClassLoader rt.jar
2.Extension ClassLoader 加载拓展的jar包
3.App ClassLoader 指定classpath下的jar包
4.Custom ClassLoader 自定义的类加载器

1.3双亲委派机制

当一个类收到了加载请求时,它是不会自己进行加载的,而是委托给父类去完成,比如说我现在要new一个Student类,这个Student类是我们自定义的类,Student类会先去委托App ClassLoader类,然后,App ClassLoader类会去委托Extension ClassLoader类,然后会去BootStrap类中去加载,只有当父类中都找不到这个类时,才回去当前类进行加载
这样做的好处是,在加载rt.jar包中的类时,不管是哪一个类加载器,最终都会委托到BootStrap类进行加载,这样保证了使用的不同的类加载器,加载的结果是一致的
over!

http://www.xdnf.cn/news/13005.html

相关文章:

  • MinIO Docker 部署:仅开放一个端口
  • 数据结构-线性表
  • Fabric V2.5 通用溯源系统——增加图片上传与下载功能
  • 使用LangGraph和LangSmith构建多智能体人工智能系统
  • 【java面试】微服务篇
  • 【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解
  • CSP-38th
  • ARM SMMUv3 STE表和CD表数据格式分析(三)
  • 职位竞聘BA商业推理测评管理人员TAS倍智题库天翼云益丰等企业
  • Secs/Gem第十一讲(基于secs4net项目的ChatGpt介绍)
  • @Import原理与实战
  • VBA经典应用69例应用8:利用VBA,预设某个程序在晚上21点运行
  • 浮点数精度问题(CSP38思考)
  • (新)Gateway网关+基于Nacos配置动态路由
  • 【Ftrace专栏】function graph的trace输出格式使用
  • NumPy数组属性
  • 《最短路(Floyd)》题集
  • Qwen3开源最新Embedding模型
  • Cesium快速入门到精通系列教程八:时间系统
  • 【术语扫盲】评估指标Precision、Recall、F1-score、Support是什么含义?
  • 论文解析:一文弄懂Transformer!
  • Visio粘贴Word公式技巧
  • 深究二分查找算法:从普通到进阶
  • AI书签管理工具开发全记录(十六):Sun-Panel接口分析
  • Java中线程的常用方法
  • 6月8日python-AI代码
  • RPG23.应用武器伤害(一):设置武器命中
  • AD学习(2)
  • 深入理解链接与加载:从静态库到动态库的全流程解析
  • OD 算法题 B卷【反转每对括号间的子串】