-
java 变量分配_Java中成员变量和局部变量在内存中的分配
2021-02-12 15:02:49形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引用存在栈中,对象存在堆中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 ...首先说明,"Java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。 形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引用存在栈中,对象存在堆中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 如以下代码:
classBirthDate {private intday;private intmonth;private intyear;public BirthDate(int d, int m, inty) {
day=d;
month=m;
year=y;
}//省略get,set方法………
}public classTest {public static voidmain(String args[]) {int date = 9;
Test test= newTest();
test.change(date);
BirthDate d1= new BirthDate(7, 7, 1970);
}public void change(inti) {
i= 1234;
}
}
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:
1.main方法开始执行:int date = 9; date局部变量,基础类型,引用和值都存在栈中。
2.Test test = new Test();test为对象引用,存在栈中,对象(new Test())存在堆中。
3.test.change(date); i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4.BirthDate d1= new BirthDate(7,7,1970); d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(), new BirthDate()将等待垃圾回收。
-
Java中成员变量和局部变量在内存中的分配
2020-03-13 21:39:57首先说明,"Java中的基本数据类型一定存储在栈中的...局部变量中 基础数据类型的引用 和值都存储在栈中 局部变量中 对象引用存在栈中,对象实例存在堆中 栈内存中的局部变量随着方法的消失而消失。 成员变量存储在...首先说明,"Java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。
对于成员变量和局部变量:
- 成员变量就是方法外部,类的内部定义的变量
- 局部变量就是方法或语句块内部定义的变量
局部变量必须初始化。 形式参数也是局部变量
- 局部变量中 基础数据类型的引用 和 值 都存储在栈中
- 局部变量中 对象引用存在栈中,对象实例存在堆中
栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
如以下代码:
class BirthDate { private int day; private int month; private int year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } // 省略get,set方法……… } public class Test { public static void main(String args[]) { int date = 9; Test test = new Test(); test.change(date); BirthDate d1 = new BirthDate(7, 7, 1970); } public void change(int i) { i = 1234; } }
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:
1.main方法开始执行:int date = 9; date局部变量,基础类型,引用和值都存在栈中。
2.Test test = new Test();test为对象引用,存在栈中,对象(new Test())存在堆中。
3.test.change(date); i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4.BirthDate d1= new BirthDate(7,7,1970); d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(), new BirthDate()将等待垃圾回收。
成员变量:
定义位置:在方法外,类体中。
成员变量存储在堆中。
默认值:有默认值,在构造器中可以不对成员变量进行初始化。
生命周期:从对象实例化开始,到对象被GC垃圾回收为止。
局部变量:
定义位置:在方法内(包括小括号里边的形参)
局部变量存储在栈中。
默认值:没有默认值,使用前需要初始化。
生命周期:从声明开始到方法结束弹栈为止。
-
Java程序运行时,没有赋值的基本类型变量会在内存中分配空间吗?
2017-07-18 17:50:28基本类型的变量如果是临时变量,只要定义了,就会分配内存空间,不管是否被赋值;...2、 栈:保存局部变量的值,包括: 1)用来保存基本数据类型的值; 2)保存类的实例,即堆区对象的引用(指针) 3)也可以用来基本类型的变量如果是临时变量,只要定义了,就会分配内存空间,不管是否被赋值;如果是作为对象的属性出现,只要该对象不实例化,就不会分配内存空间。
一个完整的Java程序运行过程会涉及以下内存区域:
1、寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
2、 栈:保存局部变量的值,包括:
1)用来保存基本数据类型的值;
2)保存类的实例,即堆区对象的引用(指针)
3)也可以用来保存加载方法时的帧
3、堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
4、常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。
5、代码段:用来存放从硬盘上读取的源程序代码。
6、数据段:用来存放static定义的静态成员。
注意:
1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。
2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。 -
c语言可以同时申请多个变量吗、_C语言的内存分配方式:堆和栈
2020-11-28 06:13:03在 C 语言中,内存分配...2、在栈上分配同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。需要注意的是,栈内存分配运算内置于处理...在 C 语言中,内存分配方式有以下三种形式:
1、从静态存储区域分配
由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与 static 变量。
2、在栈上分配
同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。
需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。
3、从堆上分配
也称为动态内存分配,由程序员手动完成申请和释放。程序在运行的时,由程序员使用内存分配函数(如 malloc 函数)来申请内存,使用完之后再由程序员自己负责使用内存释放函数(如 free 函数)来释放内存。
需要注意的是,如果在堆上分配了内存空间,就必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误。
在 C 语言中,不同类型变量的存储位置和作用域也有所不同。
全局变量
从静态存储区域分配,其作用域是全局作用域,也就是整个程序的生命周期内都可以使用。如果程序是由多个源文件构成的,那么全局变量只要在一个文件中定义,就可以在其他所有的文件中使用,但必须在其他文件中通过使用extern关键字来声明该全局变量。
全局静态变量
从静态存储区域分配,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用。与全局变量不同的是,全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用。
局部变量
从栈上分配,其作用域只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,也即该变量的生命周期和该函数同在。
局部静态变量
从静态存储区域分配,其在第一次初始化后就一直存在直到程序结束。该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。
-
Java中栈内存与堆内存的分配--简谈
2010-10-21 11:53:05到底为什么要知道栈和堆的机制呢?这真的跟我们有关系吗?... 在java中是把局部变量放在栈里面的,方法调用和局部变量是属于java中的行为也就是方法的的属性。这有什么特点?我们知道在java中调用方法执行完毕... -
对象和数组都是在堆内存上分配吗???
2019-09-24 09:50:28JVM内存分配策略 关于JVM的内存结构及内存分配方式,不是本文的重点,这里只做简单回顾。...这里所提到的栈其实指的是虚拟机栈,或者说是虚拟栈中的局部变量表。 3、栈中存放一些基本类型的变量数据(int/sho... -
java中的基本数据类型一定存储在栈中吗?
2019-09-22 23:42:05首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。 栈:虚拟机栈:执行java方法是分配的内存模型。方法运行分配一个栈帧用于存放局部变量表,操作数栈、动态链接、方法出口等信息。。... -
详解c语言中动态分配内存的函数
2012-06-06 09:43:43c语言中动态分配内存的函数,可能有些初学c语言的...在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=” -
动态分配内存专题
2014-05-11 16:53:00我讲解一下c语言中动态分配内存的函数,可能有些...在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=... -
arraylist可以存储不同类型吗_C语言中不同类型变量的存储位置和作用域
2020-11-21 06:37:15在 C 语言中,内存分配...2、在栈上分配同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。需要注意的是,栈内存分配运算内置于处理... -
c语言 什么时候需要动态分配内存?
2017-07-04 20:47:44我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过...1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数); 2)字符常量区:主要是储存一些字符常量,比如:char -
c:动态分配内存空间
2013-10-05 20:25:28我讲解一下c语言中动态分配内存的函数,可能有些...在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str= -
什么时候需要动态分配内存?
2014-10-31 10:31:08我讲解一下c语言中动态分配内存的函数,可能有些...在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str= -
对象一定分配在堆中吗?有没有了解逃逸分析技术?
2020-12-07 11:43:47很多人都知道 栈存储的是方法里面的局部变量。而堆存储的是数组或者对象。那对象一定就分配在堆中么?答案是不一定的。 问题就出现在“逃逸分析”上面?那么什么是逃逸分析呢? 逃逸分析(Escape Analysis) :是一种... -
c++ 内存分配管理
2014-11-25 17:41:491、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。想知道为什么效率高吗?因为关于栈的操作如push集成在处理器的指令集中,效率很高,但是分配的内存... -
【九】栈与递归--程序栈空间
2015-05-27 20:54:261、C语言中的疑惑C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?解答: 保存局部变量的栈是函数调用时的栈; 程序中的“函数调用栈”是栈数据结构的一种应用; ... -
C语言动态内存分配 :malloc() calloc()
2015-01-04 12:29:52关于c语言中动态分配内存的函数,可能有些初学...在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=” -
动态开辟内存_C/C++工程师你理解程序的内存分区吗?
2021-01-11 21:59:32值类型的都存储在栈当中,其中的引用类型的指针存储在内存中的堆中,指针指的具体对象在堆中。一、其实C和C++的内存分区还是有一定区别的,但此处不作区分:1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的... -
专题四-栈与递归
2017-02-06 09:50:52小A:C语言常说局部变量在栈上分配空间,那么这个地方的栈和我们之前学习的栈数据结构有关系吗? 小B:我觉得应该没有关系吧,只是名称碰巧一致而已吧。 函数调用栈 (1)程序中的“函数调用栈”是栈数据结构的一... -
Java虚拟机栈相关知识总结
2021-01-15 17:19:17目录Java虚拟机栈相关知识总结Java虚拟机栈是什么?虚拟机栈大小的调整局部变量表操作数...每个方法被调用的时候,都会相应的在Java虚拟机栈中创建栈帧,虚拟机栈描述的是Java方法执行的内存模型: Java虚拟机栈是线 -
java成员_java中,成员变量 int a = 1, a存在哪, 1存在哪 (存在JVM哪)?
2021-02-12 09:28:32是问a这个字母吗?成员变量的a=1:编译为class后a,1这两个字符都在常量池里(class...结论:a和1存在于他们所在的实例对象所分配的堆内存中局部变量的a=1:方法调用是在jvm栈中,默认的javac编译,不包含局部变量名,那... -
高频golang面试题:简单聊聊内存逃逸?
2020-06-03 08:40:16在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出。 发送指针或带有指针的值到 channel 中。 在编译时,是没有办法知道哪个 goroutine... -
C++ 堆区 栈区 全局数据区 代码区
2019-05-21 14:40:00在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 ... -
内存管理内存管理内存管理
2011-04-04 20:16:26不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满足这些需求: 确定您是否有足够的内存... -
我们什么时候应该使用动态内存
2014-03-18 19:04:04我讲解一下c语言中动态分配内存的函数,可能有些初学...在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_ -
jvm内存结构_聊聊JVM内存结构
2020-12-03 16:18:06•假设你不知道局部变量实际上属于线程栈中的而非堆里面的,那么你就可能会担心是不是我这样写会有并发问题;•假设你不知道对象实例是分配在堆中,属于JVM共用的,那么你根本也就不会考虑在进行某些访问时进行加锁...
-
佳能打印机G2800不需要软件的清零方法.txt
-
Mysql数据库面试直通车
-
QT学习第一次作业
-
opencv3.3.1要的文件.rar
-
C++代码规范和Doxygen根据注释自动生成手册
-
STL 容器的常用操作(未完成)
-
第三章 C语言 PTA循环控制——作业-答案.html
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
Liunx安装Nginx
-
整合后的文件就叫可执行程序,windows后缀为.exe,Linux后缀为.out
-
SQL入门基本概念
-
网上行销原则.txt
-
Java讲座-源码
-
Rust解决cargo build太慢
-
MySQL 性能优化(思路拓展及实操)
-
银行上班时间
-
RxJava3.0.0 操作符篇 - 过滤操作符
-
金士顿U盘微博营销活动策划方案.ppt
-
鸿蒙系统Harmonyos源码架构分析-第1期第2课
-
B站弹幕爬取并制成词云