海风影像馆 海风影像馆
首页
扎根医疗
学习笔记
技术实战
项目管理
影像空间
驴行天下
阳明心学
  • 学习方法
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 分类
  • 标签
  • 归档

知行旅人

生有热烈,藏于俗常。
首页
扎根医疗
学习笔记
技术实战
项目管理
影像空间
驴行天下
阳明心学
  • 学习方法
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 分类
  • 标签
  • 归档
  • 数据结构

  • 算法

  • Java基础

  • Java并发

  • JVM

    • 内存模型
    • 类加载
      • 1 类的加载流程?
        • 1.1 加载
        • 1.2 验证
        • 1.3 准备
        • 1.4 解析
        • 1.5 初始化
        • 1.6 卸载
      • 2 双亲委派机制
        • 2.1 为什么要设计双亲委派机制?
        • 2.2 双亲委派的加载顺序?
        • 2.3 怎么实现自定义加载器?
        • 2.4 怎么打破双亲委派机制?
    • 虚拟机对象
    • 垃圾回收
    • 工具命令
    • 生产配置示例
  • 开发框架

  • 持久化

  • 缓存

  • 消息中间件

  • 微服务

  • 系统架构

  • 网络

  • 操作系统

  • 学习笔记
  • JVM
zhixinglvren
2022-05-07
目录

类加载

# 1 类的加载流程?

一个类的完整生命周期如下:

# 1.1 加载

类加载过程的第一步,主要完成3件事情:

1.通过全类名获取定义此类的二进制字节流。

2.将字节流信息转换成方法区的数据结构。

3.在方法区(元空间)内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口。

# 1.2 验证

确保加载的类符合JVM规范和安全,其实就是一个安全检查。

# 1.3 准备

为静态变量分配内存并赋予默认值的阶段。

# 1.4 解析

虚拟机将常量池内的符号引用替换为直接引用。

也就是得到类或者字段、方法在内存中的指针或者偏移量。

# 1.5 初始化

初始化静态变量为指定的值,执行静态代码块。

# 1.6 卸载

卸载类即该类的Class对象被GC。

卸载需要满足3个条件:

1.该类的所有实例对象已被GC。

2.该类没有在其他任何地方被引用。

3.该类的类加载器的实例已被GC。

所以,在JVM生命周期内,由jvm自带的类加载器加载的类是不会被卸载的。自定义的类加载器加载的类可能被卸载。

# 2 双亲委派机制

# 2.1 为什么要设计双亲委派机制?

1)沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改。

2)避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性。

# 2.2 双亲委派的加载顺序?

双亲委派加载顺序为什么要从:

AppcClassLoader -> ExtClassLoader -> BootstrapClassLoader -> ExtClassLoader -> AppcClassLoader

为什么不直接:

BootstrapClassLoader -> ExtClassLoader -> AppcClassLoader

答:开发的应用中大部分用到的是appclassloader,第一次加载会麻烦一点,但是第二次加载如果发现该类已经加载过(c++实现),则直接用该加载器加载。

# 2.3 怎么实现自定义加载器?

继承ClassLoader,重写ClassLoader类中的findClass方法。

除了BootstrapClassLoader,其他类加载器均由Java实现且全部继承自java.lang.ClassLoader。

# 2.4 怎么打破双亲委派机制?

重写loadClass方法。

上次更新: 2022/11/24, 17:59:25
内存模型
虚拟机对象

← 内存模型 虚拟机对象→

最近更新
01
Linux常用指令
11-24
02
GitHub高级搜索技巧
11-24
03
散列表
11-09
更多文章>
Theme by Vdoing | Copyright © 2020-2023 知行旅人 | MIT License | 粤ICP备20036515号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式