Java中变量a = 3中的3是存储在栈还是堆?

1、栈区(stack)

由编译器自动分配释放,存放函数的参数值,局部变量的值等。

2、堆区(heap)

是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),在java中,所由使用new xxx()构造出来的对象都在堆中存储一般由程序员分配释放。

3、常量池

存放字符串常量和基本类型常量(public static final)

常量池的好处是为了避免频繁的创建和销毁对象而影响系统性能,其实实现了对象的共享。

4、变量

诸如int a = 3; long b = 255L;(L必须加,不加默认是int类型)的形式来定义,称为自动变量即变量。

值得注意的是,这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存周期可知(这些字面值固定定义在某个程序块里,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享

假设我们同时定义:

int a = 3;

int b =3;

编译器首先会处理 int a = 3,首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理 int b = 3;在创建完b这个引用变量后,由于在堆中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况

【上文提到了“引用+数值+内存地址”这个三个名字,其中变量名就是引用,给变量赋的值就是数值,而所提到的内存是抽象的内容,让引用指向的不是数值,而是存存数值的那块内存地址】

定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。在编译器内部,遇到值4时,它就会重新搜索堆中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

【定义变量,给变量赋值,然后在编译的过程中就可以将其保存在内存中了。】

经过官方文档考察,各方求证,int a = 3存储到栈还是堆中?其实变量a 和值3都存储在栈中,JVM内存模型如下:

更具体的来说是存储到虚拟机栈,将数值3存储到操作数栈,将变量a存储到局部变量表栈

                                                                                                            @精彩好文章推荐人——康宁

                                                                                                                       人生在于勤,志达天下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/778363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

状态模式实战运用

目录 前言 UML plantuml 类图 实战代码 Form State Client 前言 通常一个完整的业务流程中,会经历多个阶段,每个阶段即一个业务状态,不同状态下对应这不同的业务处理逻辑。 无脑堆砌 if else 做判断然后选择对应的业务处理其实也能…

JavaScript es6之前实现继承的方法

1.原型链继承 function Parent() {this.parentProperty true; }function Child() {this.childProperty false; }Child.prototype new Parent();var child new Child(); console.log(child.parentProperty ); // true 优点: 简单直观可以继承原型上的属性和方…

STM32使用USART发送数据包指令点亮板载LED灯

电路连接: 连接显示屏模块,显示屏的SCL在B10,SDA在B11。 程序目的: 发送LED_ON指令打开板载LED灯,发送LED_OFF关闭板载LED灯,与上一个博客不同,这个实际上是实现串口收发文本数据包。 …

FFMPEG C++封装(二)

4 详细设计 这章是FFMPEG C封装库的详细设计。 4.1 Init 该模块初始化FFMPEG库。 4.1.1 Init定义 namespace media { namespace sdk { void MEDIASDK_EXPORT Init(); } }函数说明: Init 初始化FFMPEG库,该函数可调用多次。 4.1.2 Init实现 name…

enscan自动化主域名信息收集

enscan下载 Releases wgpsec/ENScan_GO (github.com) 能查的分类 实操: 首先打开linux 的虚拟机、 然后把下面这个粘贴到虚拟机中 解压后打开命令行 初始化 ./enscan-0.0.16-linux-amd64 -v 命令参数如下 oppo信息收集 运行下面代码时 先去配置文件把coo…

极狐GitLab 14.4 重点功能解读,和禅道集成啦【二】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 更多关于极狐GitLab &#xff1…

如何购买阿里云服务器?2024年阿里云服务器购买流程分享

很多新手用户不知道阿里云服务器购买的流程,不清楚该如何选购云服务器配置才能既满足需求又不会掉“坑”里,为此笔者整理了2024年购买阿里云服务器的完整流程,分为通过云服务器ECS产品页下单购买和通过阿里云活动购买云服务器两种最常见的购买…

速锐得解码广汽智能数字技术车型埃安Y纯电动CAN数据DBC控制策略

随着电动化、智能化、信息化、数字化、网联化、共享化技术的不断应用与汽车行业出行趋势加深,为进一步巩固关键技术优势以及稳供控本、提升盈利能力,整车厂加速推进新能源产业链垂直整合。广汽埃安就是最为杰出的代表,他们不仅布局了芯片&…

大话设计模式之迪米特法则

迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个重要原则,其核心思想是降低耦合度、减少对象之间的依赖关系,从而使系统更加灵活、易于维护和扩展。 根据迪米特法则,一…

DataX-Oracle新增writeMode支持update

目录 前言 第一步下载源码 第二步修改源码 1、Oraclewriter 2、WriterUtil 2.1、修改getWriteTemplate方法 2.2、新增onMergeIntoDoString与getStrings方法 3、CommonRdbmsWriter 3.1、修改startWriteWithConnection 3.2、修改doBatchInsert 3.3、修改fillPreparedStatem…

Web Components使用(一)

在使用Web Components之前,我们先看看上一篇文章Web Components简介,其中提到了相关的接口、属性和方法。 正是这些接口、属性和方法才实现了Web Components的主要技术:Custom elements(自定义元素)、Shadow DOM&#…

轻松解决Composer常见错误

引言: Composer作为PHP的一个重要组成部分,为PHP开发者提供了非常方便的依赖管理工具。但是,难免会在使用中遇到一些常见的错误,如连接错误、内存限制错误、版本冲突错误、锁定文件错误和类未找到错误等。这些错误可能会影响我们…

vue3 项目中引入tailwindcss

Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类(class)名,然后生成相应的样式代码并写入 到一个静态 CSS 文件中。 官网:https://www.tailwindcss.cn/docs/installation 在项目中使用过…

C#手术麻醉信息系统全套商业源码,自主版权,支持二次开发 医院手麻系统源码

手术麻醉信息系统是HIS产品的中的一个组成部分,主要应用于医院的麻醉科,属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程,包括手术申请与排班、审批、安排、术前、术中和术后的信息管理提供支持。 手术麻醉信息系统可与EM…

MySQL 数据库的日志管理、备份与恢复

一. 数据库备份 1.数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因: 程序错误人为,操作错误,运算错误,磁盘故障灾难(如火灾、地震&#xff0…

LeetCode 20.有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都…

ModuleNotFoundError: No module named ‘langchain.schema‘

自定义langchain文档分割器时报错找不到 langchain.schema 模块 langchain0.0.20 from langchain.schema import messages_to_dict ----> 1 from langchain.schema import DocumentModuleNotFoundError: No module named langchain.schema解决办法 pip install -U langcha…

Android的硬件接口HAL-2 HIDL

没写完哈。 不说废话,直接上干活。 1 创建HAL 2 生成桩代码 PACKAGEvendor.xxx.hardware.logiuvc21.0 LOCvendor/xxx/hardware/xxx2/1.0/default hidl-gen -o $LOC -Lc-impl -rvendor.xxx.hardware:vendor/xxx/hardware -randroid.hidl:system/libhidl/transport …

prometheus配置文件详解

以下是prometheus配置文件详解,重点地方有中文简介 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is e…

Docker部署MinIO对象存储服务

1. 拉取MinIO镜像 # 下载镜像 docker pull minio/minio#查看镜像 docker images2. 创建目录 # 文件存储目录 mkdir -p /opt/minio/data# 配置文件 mkdir -p /opt/minio/config# 日志文件 mkdir -p /opt/minio/logs3. 创建Minio容器并运行 docker run \ -p 9000:9000 \ -p 90…