返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈JVM之类的加载链接和初始化
  • 690
分享到

浅谈JVM之类的加载链接和初始化

2024-04-02 19:04:59 690人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录加载运行时常量池类加载器链接验证准备解析初始化总结加载 JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。 从上面的图中,我们可

加载

JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。

从上面的图中,我们可以看到JVM中有三大部分,分别是类加载系统,运行时数据区域和Execution Engine。

加载就是根据特定名称查找类或者接口的二进制表示,并根据此二进制表示来创建类和接口的过程。

运行时常量池

我们知道JVM中有一个方法区的区域,在jdk8中,方法区的实现叫做元空间。这个元空间是存放在本地内存中的。

方法区中存放着每个class对应的运行时常量池。

当类或者接口创建的时候,就会通过class文件中定义的常量池来构建运行时常量池。

运行时常量池中有两种类型,分别是symbolic references符号引用和static constants静态常量。

其中静态常量不需要后续解析,而符号引用需要进一步进行解析处理。

静态常量分为两个部分:String常量和数字常量。

String常量是对String对象的引用,是从class中的CONSTANT_String_info结构体构建的。

数字常量是从class文件中的CONSTANT_Integer_info, CONSTANT_Float_info, CONSTANT_Long_info和 CONSTANT_Double_info 构建的。

符号引用也是从class中的constant_pool中构建的。

对class和interface的符号引用来自于CONSTANT_Class_info。

对class和interface中字段的引用来自于CONSTANT_Fieldref_info。

class中方法的引用来自于CONSTANT_Methodref_info。

interface中方法的引用来自于CONSTANT_InterfaceMethodref_info。

对方法句柄的引用来自于CONSTANT_MethodHandle_info。

对方法类型的引用来自于CONSTANT_MethodType_info。

对动态计算常量的符号引用来自于CONSTANT_MethodType_info。

对动态计算的call site的引用来自于CONSTANT_InvokeDynamic_info。

类加载器

类是怎么创建的呢?类的创建可以是由其他类调用该类的初始化方法来创建,也可以通过反射来创建。

类其实又可以分为两种,一种是数组类,一种是非数组类。

对于非数组类,因为他们有相应的二进制表示,所以是通过类加载器加载二进制表示来创建的。

而对于数组类,因为他们没有外部的二进制表示,所以数组类是由java虚拟机创建的。

java虚拟机中的类加载器又有两种,一种是虚拟机提供的引导类加载器,一种是用户自定义的类加载器。

如果是用户自定的类加载器,那么应该是ClassLoader的一个实现。用户自定义类加载器主要是为了扩展java虚拟机的功能,以支持动态加载并创建类。

链接

链接是为了让类或者接口可以被java虚拟机执行,而将类或者接口并入虚拟机运行时状态的过程。

链接具体的工作包括验证和准备类或者接口。而解析这个类或者接口中的符号引用是链接过程中的可选部分。

如果java虚拟机选择在用到类或者接口中的符号引用时才去解析他们,这叫做延迟解析。

如果java虚拟机在验证类的时候就解析符号引用,这就叫做预先解析。

验证

验证主要是为了保证类和接口的二进制表示的结构正确性。

如果类或者接口的二进制表示不满足相应的约束,则会抛出VerifyError异常。

准备

准备主要是创建类或者接口的静态字段,并使用默认值来初始化这些字段。

解析

解析是指根据运行时常量池中的符号引用来动态决定其具体值的过程。

在执行java虚拟机指令:

anewarray,checkcat, getfield, getstatic, instanceof, invokedynamic, invokeinterface, invokespecial, invokestatic, invokevirtual, ldc, ldc_w, multianewarray, new , putfield和putstatic这些指令的时候,都会去将符号引用指向运行时常量池,从而需要对符号引用进行解析。

解析可以分为类和接口的解析,字段解析,普通方法的解析,接口方法解析,方法类型和方法句柄解析,调用点限定符解析这几种。

初始化

类或者接口的初始化是指执行类或者接口的初始化方法

只有下面的几种情况,类或者接口才会被初始化:

1.执行需要引用类或者接口的java虚拟机指令(new,getstatic, putstatic, invokestatic)的时候。

2.初次调用java.lang.invoke.Methodhandle实例的时候。

3.调用类库中的某些反射方法的时候。

4.对类的某个子类进行初始化的时候。

5.被选定为java虚拟机启动时候的初始类的时候。

总结

class文件经过加载,链接和初始化之后,就可以提供给JVM在运行时使用了。

以上就是浅谈JVM之类的加载链接和初始化的详细内容,更多关于JVM之类的加载链接和初始化的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅谈JVM之类的加载链接和初始化

本文链接: https://lsjlt.com/news/127459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈JVM之类的加载链接和初始化
    目录加载运行时常量池类加载器链接验证准备解析初始化总结加载 JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。 从上面的图中,我们可...
    99+
    2024-04-02
  • 浅谈Java类的加载,链接及初始化
    一 类生命周期 Loading Linking(Verification、Preparation、Resolution) Initializing 二 类加载器...
    99+
    2024-04-02
  • 类的加载、链接和初始化是什么
    本篇内容介绍了“类的加载、链接和初始化是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 类的加载Java类的加载是由类加载器来完...
    99+
    2023-06-16
  • JVM中加载、链接、初始化的示例分析
    这篇文章主要为大家展示了“JVM中加载、链接、初始化的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JVM中加载、链接、初始化的示例分析”这篇文章吧。基本概念:类加载的过程大致分为三个阶...
    99+
    2023-05-31
    jvm
  • 浅谈SpringBoot资源初始化加载的几种方式
    目录一、问题二、资源初始化一、问题   在平时的业务模块开发过程中,难免会需要做一些全局的任务、缓存、线程等等的初始化工作,那么如何解决这个问题呢?方法有多种,但具体又要怎么选择呢?...
    99+
    2024-04-02
  • 如何深入理解Java虚拟机JVM类加载初始化
    如何深入理解Java虚拟机JVM类加载初始化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 Classloader的作用,概括来说就是将编译后的class装载、...
    99+
    2023-06-17
  • 详解Java中类的加载与其初始化
    目录java内存分析类加载的过程类的初始化java内存分析 类加载的过程 类的加载与ClassLoader的理解 类的初始化 package Collections; publ...
    99+
    2022-12-15
    Java 类加载 初始化 Java 类加载 Java类 初始化
  • spring初始化源码之关键类和扩展接口详解
    目录前言1、关键接口和类1.1、关键类之 DefaultListableBeanFactory1.2、关键类之XmlBeanDefinitionReader1.3、关键类之Class...
    99+
    2023-05-18
    spring初始化源码 spring初始化流程 spring源码分析
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作