JVM易混淆名称

字面量:

字面量指由字母、数字等构成的字符串或者数字常量,如1,"abc",10这些都是字面量

变量:

定义出一个符号,这个符号在某个范围内,就代表一个变化的量。要注意两点:1. 变量必须先定义才可以使用。2. 变量如果先被赋值或者初始化才可以使用。如 int a = 1,a就是变量;String s = "abc",s也是变量

常量:

final修饰的变量

静态变量:

static修饰的变量,只能是类的成员变量,不能定义在方法中

符号引用:

符号引用就是一个类中(当然不仅是类,还包括类的其他部分,比如方法,字段等)引入了其他的类,可是JVM并不知道引入的其他类在哪里,所以就用唯一符号来代替,等到类加载器去解析的时候,就通过符号引用找到那个引用类的地址(如果找不到说明引用类还没加载,那就直接把引用类也加载了),这个地址也就是直接引用。

在编译时,java类并不知道所引用的类的实际地址(只是javac编译,JVM还没运行呢,哪知道地址?),因此只能使用符号引用来代替

符号引用包括以下常量:

  • 被模块导出或者开放的包
  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法的名称和描述符
  • 方法句柄和方法类型
  • 动态调用点和动态常量

直接引用:

直接引用是可以直接指向目标的指针、相对偏移量 或者是一个能间接定位到目标的句柄。直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。

常量池:

每个class文件独有一份,常量池中有字面量(数量值、字符串值)和符号引用(类符号引用、字段符号引用、方法符号引用),虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型

运行时常量池:

当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,经过解析(resolve)之后,也就是把符号引用替换为直接引用

相关推荐
这个DBA有点耶15 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
karry_k16 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k16 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
这个DBA有点耶17 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技18 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend19 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
SamDeepThinking19 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
用户8524950718420 小时前
解密 JavaScript 中的 this:谁才是真正的调用者?
javascript·面试
Heo20 小时前
Vite进阶用法详解
前端·javascript·面试
洛卡卡了20 小时前
Claude Code rules 要怎么用,团队协作时如何统一代码规范呢?
面试·agent·claude