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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王少岩 中级黑马   /  2012-8-9 10:12  /  2016 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王少岩 于 2012-8-9 12:03 编辑

在定义一个变量并且给这个变量赋值的时候,是不是定义的那个变量无论什么类型都放在栈内存中,所要赋的值值无论什么类型都放到对内存中啊?我知道类似Person p = new Person()这样的赋值p放到栈内存,new Person()放到堆内存,那么类似int i = 0这样的赋值也是 i 放到栈内存,0放到对内存中吗?
还有所谓的方法区到底指的是什么,是真实存在还是抽象出来的,方法区也是内存吗?
这个问题困扰很久了,希望各位大神帮忙解惑啊

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
     通俗的讲,堆主要用来存放对象的,即用来存放由new创建的对象和数组(即对象实例),然后由Java虚拟机的自动垃圾回收器来管理;栈主要是用来执行程序的,栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char),和对象句柄(即对象的引用地址),同时栈中的数据可以共享。
    堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
    栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的(如存在某函数块中的局部变量,其生命周期即等到函数结束为止),缺乏灵活性。另外,栈数据可以共享。
    总体来说,基本数据类型,方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。引用数据类型,需要用new来创建,既在栈空间分配一个地址空间(对象的引用),又在堆空间分配对象的类变量。方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量new出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
基本数据类型直接在栈空间分配
方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收,
引用数据类型,需要new来创建,既在空间分配一个地址空间,又在对空间分配对象的类变量
方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用结束后栈空间立即被回收
局部变量new出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立即被回收,堆空间等待GC回收
方法调用时传入的参数,先在栈空间分配,在方法调用完成后从栈空间分配
字符串,常量在方法区域分配,this在堆空间分配。数组在栈空间分配数组名称,又在堆空间中分配数组实际长度。
static比较特殊,在java中所有对象的存储空间都是在堆内存中分配的,但这个对象的引用却是在堆栈中分配的。意思就是建立一个对象,从两个地方都分配内存,,在堆中分配的内存,实际建立这个对象,而栈中分配的内存只是一个指向这个堆对象的引用而已

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
了解了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马