Java基本数据类型存储在JVM中的存储位置介绍

 更新时间:2023年07月31日 11:31:15   作者:普通网友  
这篇文章主要介绍了Java基本数据类型存储在JVM中的存储位置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java基本数据类型存储在JVM中的存储位置

我们都知道虚拟机栈来存储通过栈帧的形式来存储每一个方法,堆来存储所有对象实例和数组。

而对基本数据类型,即可能声明在方法的局部变量中,也可能声明在类的成员中,这就造成并没有明确的规定来说明基本数据类型到底是存储在堆中还是栈中。

我在 SO 上寻找到了答案

Simplistic answer: it depends on where the variable is declared, not on its type.
Local variables are stored on the stack. Instance and static variables are stored on the heap.

简单来说:这取决于变量的声明位置,而不是它的类型。

局部变量存储在栈中,实例变量和静态变量存储在堆中。

也就是说,基本数据类型如果声明在方法内,那么它就存储在栈中,如果声明在类的成员或声明为 static 那么就存储在堆中。

参考链接:Where does the JVM store primitive variables?

基本数据类型的成员变量放在jvm得哪块内存区域里?

java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》

很多java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。 这个说法不准确,事实上,如上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。        

如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。

这两个对象都是线程私有(安全)的。

比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中EnumMap代替序数索引代码详解

    Java中EnumMap代替序数索引代码详解

    这篇文章主要介绍了Java中EnumMap代替序数索引代码详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java中支持可变参数详解

    Java中支持可变参数详解

    那个可变参数的就是个数组,你传多少个参数都被放到那个数组里面。这样方便了程序员,因为如果不确定要传的参数的个数的话,我们要写带1个参数的,带2个参数,带3个参数的,这样很麻烦。 该进后的这个方法,我们只要写一个函数就好,可以传任意个参数。
    2015-05-05
  • Java实现猜数字小游戏代码

    Java实现猜数字小游戏代码

    大家好,本篇文章主要讲的是Java实现猜数字小游戏代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • java如何写接口给别人调用的示例代码

    java如何写接口给别人调用的示例代码

    这篇文章主要介绍了java如何写接口给别人调用的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Netty分布式固定长度解码器实现原理剖析

    Netty分布式固定长度解码器实现原理剖析

    这篇文章主要为大家介绍了Netty分布式固定长度解码器原理剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 利用keytools为tomcat 7配置ssl双向认证的方法

    利用keytools为tomcat 7配置ssl双向认证的方法

    双向认证和单向认证原理基本差不多,只是除了客户端需要认证服务端以外,增加了服务端对客户端的认证,下面这篇文章主要介绍了利用keytools为tomcat 7配置ssl双向认证的方法,需要的朋友可以借鉴,下面来一起看看吧。
    2017-02-02
  • Spring+SpringMVC+Hibernate项目环境搭建的步骤(图文)

    Spring+SpringMVC+Hibernate项目环境搭建的步骤(图文)

    这篇文章主要介绍了Spring+SpringMVC+Hibernate项目环境搭建的步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • linux重启java服务的脚本

    linux重启java服务的脚本

    这篇文章主要介绍了linux重启java服务的脚本,本文分步骤通过shell脚本给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • JAVA String.valueOf()方法的用法说明

    JAVA String.valueOf()方法的用法说明

    这篇文章主要介绍了JAVA String.valueOf()方法的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 如何使用Jenkins编译并打包SpringCloud微服务目录

    如何使用Jenkins编译并打包SpringCloud微服务目录

    这篇文章主要介绍了如何使用Jenkins编译并打包SpringCloud微服务目录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论