类的加载,链接和初始化——1运行时常量池(来自于java虚拟机规范英文版本+本人的翻译和理解)
加载(loading):通过一个特定的名字,找到类或接口的二进制表示,并通过这个二进制表示创建一个类或接口的过程。
链接:是获取类或接口并把它结合到JVM的运行时状态中,以让类或接口可以被执行
初始化:初始化一个类或接口——就是执行这个类或接口的<clinit>方法
运行时常量池(在方法区中)
在类或接口C创建的过程中,根据类或接口C的二进制表示中的常量池来创建运行时常量池。
运行时常量池中有许多运行时常量,运行时常量 有的是符号引用,有的不是符号引用
运行时常量池中所有的引用最初都是符号引用,运行时常量池中的符号引用来自于类或接口C二进制表示中的如下接口
1,类或接口C的符号引用——来自类或接口C的二进制表示中的CONSTANT_Class_info结构
类或接口C的符号引用通过调用方法Class.getName()给出类或接口C的名字A——对于非数组来说,A就是类或接口C的二进制名称(全限定名)
对n维数组来说,名称A以n个[ 开头,然后跟上数组的元素类型的名称
例如。int[ ] [ ]——名称为“[ [ I”,Thread[ ] [ ] [ ]——名称为“[ [ [ Ljava/lang/Thread;”
2,C中字段B的符号引用——来自C的二进制表示中的CONSTANT_Fieldref_info结构
C中字段B的符号引用——给出B的名称和描述符,以及一个指向字段B所在类或接口的符号引用
3,类中某个方法E的符号引用——来自类或接口的二进制表示中的CONSTANT_Methodref_info结构
类中某个方法E的符号引用——给出了方法E的名称和描述符,以及一个指向方法E所在类的符号引用
4,接口中某个方法F的符号引用——来自类或接口的二进制表示中的 CONSTANT_InterfaceMethodref_info结构
接口中某个方法F的符号引用——给出了接口方法F的名称和描述符,以及一个指向方法F所在接口的符号引用
5,method handle的符号引用——来自C的二进制表示中的CONSTANT_MethodHandle_info结构
method handle的符号引用 是 ①指向类或接口的一个字段的符号引用 或②指向类中一个方法的符号引用 或③指向接口中一个方法的符号引用
6,method type的符号引用来自于类或接口的二进制表示中的CONSTANT_Method_info结构
这个符号引用——给出了一个方法描述符
7,调用点限定符(call sit specifier)的符号引用——来自类或接口二进制表示中的CONSTANT_InvokeDynamic_info结构。
这个符号引用可以是 ①作为一个bootstrap method为invokedynamic指令服务的method handle符号引用
②一系列符号引用(类符号引用,method type符号引用,method handle符号引用)或字符串常量(string literals)或运行时常量(run-time constant values)——用来作为bootsrap method静态参数的
③方法名称和方法描述符
!!另外,有一些运行时常量并不是符号引用,而是来自常量池表中的某些项——例如字符串常量(string literals)和运行时常量值
9,字符串常量——是一个指向String实例的引用,来自于类或接口二进制表示中的CONSTANT_String_info结构
CONSTANT_String_info结构——给出Unicode code points序列,用来组成字符串常量
(JAVA要求相同的字符串常量,必须指向相同的String实例)
10,运行时常量值——来自于二进制表示中的 CONSTANT_Integer_info
, CONSTANT_Float_info
, CONSTANT_Long_info
, or CONSTANT_Double_info
结构
类的加载,链接和初始化——1运行时常量池(来自于java虚拟机规范英文版本+本人的翻译和理解)的更多相关文章
- JVM详解之:类的加载链接和初始化
目录 简介 加载 运行时常量池 类加载器 链接 验证 准备 解析 初始化 总结 简介 有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化 ...
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- <JVM中篇:字节码与类的加载篇>04-再谈类的加载器
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- java虚拟机规范-加载、链接与初始化
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调.java代码本身并不能为jvm识别,实际上在jvm中的表现形式为Class对象,一个java类从字节 ...
- JVM 类的加载机制
在对类的实例化之前.JVM 一般会先进行初始化 主要经过如下几个阶段: 1.加载 类加载的第一阶段,类加载时机有两个: 1.预加载:当虚拟机启动时,会预加载 ...
- 24.类的加载机制和反射.md
目录 1类的加载连接和初始化 1.1类的加载过程 1.2类的加载器 1.2.1类的加载机制 1类的加载连接和初始化 1.1类的加载过程 类的加载过程简单为分为三步:加载->连接->初始化 ...
- 类的加载classload和类对象的生成
在Java中最重要的可以说就是类的加载了.不论我们编写的功能多么复杂,或是多么简单,永远逃离不开的,就是将这个类从class文件加载到JVM中来. 类的加载过程 首先我们要了解一下类的加载过程,包括: ...
- 透过现象看本质:Java类动态加载和热替换
摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...
- Java类的加载、链接和初始化
一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...
随机推荐
- PHP date_parse() 函数
------------恢复内容开始------------ 实例 返回一个包含指定日期的详细信息的关联数组: <?phpprint_r(date_parse("2013-05-01 ...
- 使用pdf.js实现前端页面预览pdf文档,解决了跨域请求
pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析 官网地址:http://mozilla.github.io/pdf.js/ 下 ...
- 7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径
LINK:因懒无名 20分显然有\(n\cdot q\)的暴力. 还有20分 每次只询问一种颜色的直径不过带修改. 容易想到利用线段树维护直径就可以解决了. 当然也可以进行线段树分治 每种颜色存一下直 ...
- luogu P4929 【模板】舞蹈链 DLX
LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂 ...
- MySQL(版本8.0.19)服务的启动/停止、登录/登出、修改密码
[先说明一点 ,windows系统下,英文字母不分大小写.] MySQL 服务的 启动 / 停止 方式一: (我的系统是windows10) 找到 此电脑 图标 右键点击,选择"管理&q ...
- day18.os模块 对系统进行操作
一.os操作 1.system()在python中执行系统命令 # os.system("ifconfig") # os.system("touch 1.txt" ...
- this.getClass().getResource(String) 路径问题
this.getClass().getResource(String) 路径问题 这里的默认当前路径是该类所在目录: this.getClass() 说明了一切!! 找到类,就找文件:很显然和类 ...
- windows下使用redis命令行模式查询数据
背景:redis的火,就像java一样,对于测试人员来说,使用它就需要好好搞下,现在就整理下命令行模式,来查询获取自己想要的值: 命令行连接命令:redis-cli -h 主机名 -p 端口号 -a ...
- 【FZYZOJ】愚人节礼物 题解(状压DP)
前言:麻麻我会写状压DP了! ---------------------------- 题目描述 愚人节到了!可爱的UOI小朋友要给孩子们送礼物(汗-原题不是可爱的打败图么= =..).在平面直角坐标 ...
- python3.5 continue和break 项目:买房分期付款(2)
#案例:买房分期付款24万(10年期限) i=1#定义年份sum1=0while i<=10: print("第",i,"年到了......") if i ...