基本数据类型在JVM中的存储位置?对于基本数据类型存储于栈空间的疑问

前言

本文只讨论内存存储,所以JVM中的其他无关内容不加以说明。
通过JVM相关书籍和资料可以得知,堆用于存储实例对象,运行时常量池用于存储编译期生
成的各种字面量符号引用。虚拟机栈的每个栈帧都包含了对应的局部变量表动态链接

讨论例子

int i = 10;//命名为d1
int o = i + 1;//命名为d2
int t = o - 1;//命名为d3

例子不局限于局部变量

问题

从其他资料和一些博文中经常会看到基本数据类型存储于栈空间这种说法让我产生了疑问
基本数据类型究竟存储于JVM什么位置?

  1. 基本数据类型被用于局部变量,存储在栈帧上的局部变量表,以上说法虽不精确但也勉强成立。
    1. 基本数据类型使用字面量进行声明时,理应存储于运行时常量池中,那以上说法就不成立了
      1. 那么是不是说,如果使用字面量那么局部变量表存储的也只是指向运行时常量池的指针?已解决
    2. 如果是不满足进入运行时常量池的局部变量,此时它存储在栈帧上吗?
  2. 基本数据类型被用于类的成员属性
    1. 我们知道堆存储了对象实例,对象类型的成员属性好理解,依然存储了指向了堆中另一个对象的指针。
    2. 基本类型给成员属性呢?也只是在堆中的这个对象实例中吗?
    3. 如果也是字面量声明的话,是不是这个变量也只是存储了指向运行时常量池的指针?已解决
  3. 对于值相同的两个基本数据类型,两个d1是否使用同一份内存空间?d1和d3呢?已解决

具体疑问通过加粗处理

尝试过的解决方案

阅读了《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》和《深入理解 JAVA 虚拟机》
从其中的堆,虚拟机栈,运行时常量池,对象结构相关内容,类加载相关内容中没有找到几个问题的答案。

延申

暂时认为所有基本数据类型在存储位置的逻辑没有不同,所以只拿了int作为例子,如果有所不同望各位大神指出

验证方式

java是否有方式可以拿到一个变量指向的真实内存地址呢?通过使用了Unsafe的一些方法获得了真实的内存地址,但依然不知道这个地址是属于堆还是运行时常量池
C/C++的能力有限,所以暂时没有尝试去阅读JVM源码,也不知从何处可以拿到相关源码进行阅读,是否可以提供一个合适的获取源码的方式?比如某一个适合探讨这个问题的版本的源码

其他

最近正在学习JVM相关的内容,对于一些比较细致的疑问总是很难从书籍或者网络资料中得到答案,只能求助于社区
非常感谢同样有疑问并尝试寻找资料解答问题的大佬们,也非常感谢已经理解透彻能够直接解答的大佬们!

已解决

  • 是否进入运行时常量池
    • 不同基本类型是否进入运行时常量池是不一样的
    • 比如 数字类型的都是 [-128, 127]都是会存储于运行时常量池
    • 无论是局部变量还是成员属性
    • 可以通过Unsafe进行测试
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!