A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

什么样的变量是在堆内存中,什么样的变量是在栈内存中。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

9 个回复

倒序浏览
一年_Hei 来自手机 中级黑马 2014-2-20 22:24:56
沙发
一般引用变量在栈内存,创造的对象在堆内存。
回复 使用道具 举报
堆内存用来存放由new创建的对象和数组。
在堆中产生了一个对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
栈中主要存放一些基本类型的变量和引用变量
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
在C/C++中, 堆用户自己申请的内存空间,通过 关键字malloc和new,通过free和delete去释放。堆是自己申请空间,自己负责释放的。 栈是系统给你分配的,很常见的就是局部变量,比如 int i 神马的。。。
我觉得JAVA应该差不多吧。。只是释放不用你操心。。

JVM好像分了5块内存区。。。。。以下为转:
JVM的内存了。它主要分为五个部分——
1、Heap (堆):一个Java虚拟实例中只存在一个堆空间
2、Method Area(方法区域):被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。
3、Java Stack(java的栈):虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈
4、Program Counter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
5、Native method stack(本地方法栈):保存native方法进入区域的地址

以上五部分只有Heap 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有自己的部分。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
一些基本类型的变量和对象的引用变量都是在栈内存中分配,堆内存用于存放由new创建的对象和数组。堆主要用来存放对象的,栈主要是用来执行程序的,

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
一些基本类型的变量和对象的引用变量都是在栈内存中分配。堆内存中放的是一些功能,例如对象。这些大家都知道

那有个小知识点和大家分享一下 如果在“栈内存”中的变量为null,或者不再被使用使,这些数据就会从内存中自动释放  
如果在“堆内存”中的数据没有被指向或调用,那么系统会启用一个“垃圾回收机制”,这些数据会不确定时间被电脑清空(以前的数据都是我们程序员自己记着清理的,如果忘记就忘记了,发展到今天就有了这样一个“垃圾回收机制”方便不少)

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
懂了,谢谢!
回复 使用道具 举报
变量不是在堆内存中的!堆内存中存在的是我们new的对象,也就是我们自己创建的实例对象!而栈内存是存储才是存储变量的地方!我们new出来的对象有些需要赋值,而这些对应的值是在栈内存中的!!那么堆内存中的对象是怎么和栈内存中的变量相关联的!!是因为在对内存中的对象持有了对应栈内存变量的地址值!也就是引用~所以才相关联在了一起!!!这里我说一点~内存中还有一些常量池等等拥有自己类型和的存储地方!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
引用和方法的局部变量,以及方法定义的形参会放到栈空间中,实际对象就是放到堆空间中的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马