​ 在JVM中,类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。而解析阶段即是虚拟机将常量池内的符号引用替换为直接引用的过程。

符号引用(Symbolic References):

​ 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。

直接引用:

​ 直接引用可以是直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)

相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)

一个能间接定位到目标的句柄

​ 直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。

java字面量和符号引用_JVM中的直接引用和符号引用相关推荐

  1. Java: Java字面量、 变量和常量

    Java字面量. 变量和常量 先给出一段小代码,如下: int a = 10; //a为变量,10为字面量 final int b = 10; //b为常量,10为字面量 static str = & ...

  2. java 字面量_Java字面量

    Java字面量 本章节目标: 理解变量本质是什么,在开发中有什么用?变量三要素是什么?怎么声明变量?怎么给变量赋值?变量是如何分类的?变量的作用域? 知识框架: Java字面量 字面量就是数据/数值, ...

  3. java字面量和符号引用_java中字面量,常量和变量之间的区别(附:Integer缓存机制)...

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...

  4. java字面量和符号引用_java -- JVM的符号引用和直接引用

    在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...

  5. java字面量和符号引用

    1.字面量 字面量就是直接量,举个例子. String str = "str"; int i = 1; "str"和1都是字面量,有别于变量. 2.符号引用 符 ...

  6. java字面量 方法区_(一)java的内存模型

    程序计数器(私有) 程序计数器:"是一个非常小的内存空间,用来保证程序依次执行",它可以看作是当前线程所执行的字节码的行号指示器 由于java虚拟机的多线程是通过线程轮流切换并分配 ...

  7. java字面量_java基本数据类型的字面量

    java的基本数据类型一共有8种.其中:(每种类型后面列出了java中的该类型的字面量) 四种整型: int4字节: 12  +12  -12  077 0xFF  0b101(JDK7中支持的二进制 ...

  8. 【图文详解】JAVA字面量和变量

    文章目录 一.什么是字面量 二.什么是变量 三.变量的使用 四.知识拓展 一.什么是字面量 在Java语言中,"数据"被称为"字面量". 字面量有以下类型: 整 ...

  9. java gc 循环引用_JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制...

    ①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是"根"的一个,根还包含方法中的 ...

最新文章

  1. OSChina 周一乱弹 ——喝不到放心奶
  2. 服务器系统linux怎么安装教程,CentOS 8.0.1905 linux服务器系统安装与配置图解教程...
  3. mac下打开FTP服务
  4. DIV水平方向居中的几种方法
  5. 再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)
  6. GL 与 CV 管线 (pipeline) 比较与相互转换
  7. 剑指offer python版 数组中只出现一次的两个数字
  8. 空间组网(卫星组网)概述
  9. continue 与break 的区别
  10. linux如何看java安装路径,linux查看java的安装路径
  11. 送给那些有代码基础但仍旧不会学自动化测试的朋友们
  12. python创建类的实例化_在C中实例化python类#
  13. 经典数据库sql查询50题
  14. springboot中ehcache的使用
  15. h5 bootstrap 小程序模板_武汉商城小程序模板
  16. AI语音声控智能按摩椅方案/案列/APP/小程序/网站
  17. python打字_Python编写打字训练小程序
  18. java utility 是什么_Java Utility类代码示例
  19. 常见大数据应用有哪些?
  20. CSS实验案例02简单专业介绍网页

热门文章

  1. 意外断电后,Zabbix_proxy 重启无任何相关进程,如何处理?
  2. MySQL基于日志还原数据
  3. 如何提高员工的能动性,体现员工的自我价值
  4. 触发器中的 临时表 old 与 new
  5. 【Oracle】11g外部表指定oracle_datapump引擎,不能使用preprocessor预处理子句。
  6. 【Kettle】date类型不能被excel输出
  7. springboot解决跨域问题(Cors)
  8. 解决Linux系统在设置alias命令重启后失效的问题
  9. -bash: fork: Cannot allocate memory问题,进程数满了的解决办法
  10. 使用range()以相反的顺序打印列表?