码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【JVM】JVM类加载机制


    JVM类加载机制

    • 加载
      • 双亲委派模型
    • 验证
    • 准备
    • 解析
    • 初始化

    JVM的类加载机制,就是把类,从硬盘加载到内存中

    Java程序,最开始是一个Java文件,编译成.class文件,运行Java程序,JVM就会读取.class文件,把文件的内容,放到内存中,并且构造成.class类对象

    加载

    这里的加载是整个类加载的一个阶段,他和类加载是不同的

    在整个类加载的过程中 主要任务就是找到.class文件 打开文件 读取文件内容 ,并且尝试解析格式

    双亲委派模型

    双亲委派模型 描述类加载的过程中 如何找到.class文件

    JVM加载.class文件的时候,需要用到"类加载器"模块,JVM中自带了三个类加载器 Bootstrap ClassLoader,Extension ClassLoader,Application ClassLoader

    此处的三个类加载器有"父子关系",在一个对象内有一个parent引用指父类加载器实例
    在这里插入图片描述
    在这里插入图片描述

    验证

    检查当前.class文件的格式 是否符合要求

    .class文件虽然是二进制文件 但是内部也是有一定结构的

    1. 魔数(magic number) .class文件的开头四个字节是一个固定的魔数,用于标识该文件是否为有效的.class文件

    2. 版本信息 两个字节的版本号 表示编译器的主版本和次版本号,用于确定使用的Java编译器的版本

    3. 常量池(constant pool) 常量池是 .class 文件中最重要的部分之一,它存储了类、接口、字段、方法等元素的符号引用和常量值。常量池是一个表结构,以 1 开始计数,包含了若干个常量池项。

    4. 访问标志 访问标志用于描述类或接口的访问权限和特性,如是否为 public、final、abstract 等。

    5. 类索引 类索引指向常量池中类或接口的描述符;父类索引指向常量池中父类的描述符;接口索引表列出了实现的接口的描述符。

    6. 字段表和方法表 字段表包含了类或接口中定义的所有字段的信息,如名称、类型、修饰符等;方法表包含了类或接口中定义的所有方法的信息,如名称、参数类型、返回类型、修饰符等。

    7. 属性表 属性表包含了类、字段和方法的附加信息,如编译器生成的代码、注解等。属性表是可选的,可以包含零个或多个属性。

    总的来说 一个Java文件里的所有信息 在.class文件中都会有所体现

    准备

    准备阶段是正式为类中定义的变量,即静态变量 分配内存并设置变量初始值

    解析

    Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程

    .class文件中 不知道字符串真实的内存地址是在哪里,只知道一个相对的偏移量 也就是知道字符串的内容在.class文件的哪个地方 等到字符串内容加载到内存之后,就可以把真实 的地址,替换到刚才的符号引用这里了

    初始化

    初始化阶段,Java虚拟机真正开始执行类中编写的Java程序代码 将主导权移交给应用程序,初始化阶段就是执行类构造器方法的过程

    在这里插入图片描述

  • 相关阅读:
    18-基于CentOS7搭建RabbitMQ3.10.7集群镜像队列+HaProxy+Keepalived高可用架构
    【BP-Adaboost预测】基于BP神经网络的Adaboost的回归预测研究(Matlab代码实现)
    从阿里云“数字证书管理服务”申请免费的SSL证书
    让开发回归简单模式-组件封装
    离线强化学习(Offline RL)系列7: (状态处理) OfflineRL中的状态空间的数据增强(7种增强方案)
    浅谈智能化能源管理系统平台在企业中的应用
    线上mysql表字段加不了Fail to get MDL on replica during DDL synchronize,排查记录
    手把手带你用Python和文心一言搭建《AI看图写诗》网页项目(附上完整项目源码)
    【Linux】第八章 基础IO(open+write+read+文件描述符+重定向+缓冲区+文件系统管理+软硬链接)
    系统运维工程师的基本职责说明
  • 原文地址:https://blog.csdn.net/m0_72670269/article/details/133849895
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号