• JVM知识体系总结1——JVM结构,类加载


    1.jvm基本结构

    JDK经典体系图:

    由图可见,可以分成三部分:

    第一部分:Java命令,如javac,jar等

    第二部分:Jre支持java运行环境核心内库

    第三部分Java虚拟机,虚拟机的类型是指规范在不同的运行场景实现,常用的HotSpot

    我们编写java文件,经过javac命令编辑成class文件在jvm里面运行,jvm从软件层面来解决了不同操作系统在底层硬件与指令上的区别,所以java也是个跨平台的语言

    虚拟机结构图:

    1,类加载子系统负责动态加载类,在运行时(而非编译时),当一个类初次被引用的时候,它将被加载、链接、初始化

    加载:通过类的权限名获取该类的二进制流,将二进制流中的静态存储结构转化为运行时数据结构,在内存中生成该类的class对象,作为数据访问入口。

    类的加载方式分为隐式加载和显示加载。隐式加载就是使用new等方式加载,会隐式的调用类加载器把他加载到jvm里面去,显示的就是直接通过调用class.forName()或者classLoader。class.forName()将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块

    把通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到了java虚拟机外部去实现,让程序自己觉得如何去获取所需要的累,这个动作的代码模块就是类加载器

    从jvm来看,类加载器分为两种,一种是启动类加载器,他是虚拟机的一部分,另外一种就是其他类加载器,他们由java实现,位于虚拟机外部,都继承了java.lang.classLoader

    从开发者角度来说:启动类加载器加载存在JAVA_HOMElib目录中或者指定路径中能被虚拟机识别的类,扩展类加载器负责加载JAVA_HOMElibext或者被java.ext.dirs系统变量指定路径找那个的类。应用程序类加载器也称为系统加载器,他负责加载用户路径上指定的类

    **双亲委派模式:类只需要加载进内存一次就够了,当父类加载器已经加载了该类子类加载器就不需要在加载了,避免重复,加载器之间的这种层次关系就叫做双亲委派模式。**所有的类加载器除了最顶层的启动类加载器都有自己的父类加载器,这里的父类不是指的继承关系而是组合关系,如果一个类加载器收到了加载请求,它不会立即加载这个类,而是吧这个请求交给父类加载器去完成,依次类推知道顶层,如果父类加载器不能加载则再让子类加载(简单的说就说先让父类去干,父类干不了的在自己干)。

    验证:确定class文件的字节流中的信息不危害到虚拟机:格式,元数据,字节码,符号

    准备:为静态变量赋默认值

    解析:完成符号引用到直接引用的转换,不一定在初始化之前也可能在之后

    初始化:给类的静态变量赋予正确的初始值执行静态代码块,真正开始执行类中定义的java程序代码

    使用

    卸载

  • 相关阅读:
    mybatis中使用<choose><when><otherwise>标签实现根据条件查询不同sql
    多线程事务(仅保证原子性)
    Navisworks二次开发——图元属性获取
    机械键盘怎么选?5年老码农倾情推荐!
    【Tomcat源码篇】自定义类加载器那点儿事儿
    RabbitMQ内容
    Windows server 安装和配置PostgreSQL 14
    git 提交规范化
    自动生成图片及修改图片尺寸
    JDK中字体的高度信息ascent/descent/leading是怎么计算的
  • 原文地址:https://blog.csdn.net/m0_67390379/article/details/126412294