知识库
并发编程
  • 分类
  • 标签
  • 归档
友情连接

luoliang

吾生也有涯,知也无涯
并发编程
  • 分类
  • 标签
  • 归档
友情连接
  • 类加载子系统
    • 类加载器分类
      • 启动类加载器 BootstrapClassLoader
      • 扩展类加载器 ExtClassloader
      • 应用类加载器 AppClassloader
      • 自定义类加载 CustomXxxClassloader
    • 类加载过程
      • 加载
      • 校验
      • 准备
      • 解析
      • 初始化
    • 双亲委派机制
      • 双亲委派机制的过程
      • 为什么需要双亲委派机制?
      • Tomcat打破双亲委派机制
      • 如何打破双亲委派机制?
  • JVM的整体结构
  • JVM的垃圾回收
  • arthas排查问题
  • jvm
weiluoliang
2024-04-08
目录

类加载子系统

当我们执行 java -jar xxx.jar的时候,JVM开始工作了,类加载子系统在初始化阶段开始工作,类加载经过哪些步骤?如何校验字节码是否正确?什么是双亲委派?双亲委派的作用是什么?Tomcat为什么要打破双亲委派?如何打破双亲委派?

# 类加载器分类

# 启动类加载器 BootstrapClassLoader

负责加载核心包 如 rt.jar ,charsets.jar , 目录位于 JRE的lib下

# 扩展类加载器 ExtClassloader

负责加载JRE的扩展库,目录位于JRE的lib/ext 。

# 应用类加载器 AppClassloader

负责加载classpath下的类库, 可指定加载jar ,加参数 --classpath , --cp

# 自定义类加载 CustomXxxClassloader

# 类加载过程

# 加载

将字节码文件从硬盘读取到内存的过程,这个过程是按需加载,只有被使用到的类才会加载, new 一个对象 , class.forName("xxx.class") 等会触发加载 。

注意 : Math math = null 这种不会被加载

# 校验

验证字节码文件格式是否正确

# 准备

给静态变量分配内存,并赋默认值。

# 解析

将符号引用替换为直接因为, 静态链接过程

# 初始化

  1. 给静态变量赋值
  2. 执行静态代码块

静态变量与静态代码块不区分优先级,按代码顺序执行

# 双亲委派机制

# 双亲委派机制的过程

  1. 委托父类加载器加载
  2. 父类加载器找不到再自己去加载

表现为向上委托,向下加载的过程

# 为什么需要双亲委派机制?

  1. 避免重复加载
  2. 防止核心类被篡改

# Tomcat打破双亲委派机制

一个Tomcat实例支持多个应用

tomcat
  -- webapp1  依赖spring 3 
  -- webapp2  依赖spring 4
  -- webapp3  依赖spring 5 

我们看到每个应用可能依赖不同的spring,如果使用双亲委派会导致版本问题,所以Tomcat必须打破双亲委派
  
1
2
3
4
5
6
7

# 如何打破双亲委派机制?

自己写一个类去继承 ClassLoader , 并且重写 loadClass 和 findClass 两个方法。

上次更新: 2024/04/22, 10:37:52
JVM的整体结构

JVM的整体结构→

最近更新
01
Linux常用命令
09-04
02
SpringBoot启动脚本
08-31
03
安装监控grafana
08-30
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式