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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张超超 黑马帝   /  2012-4-1 12:01  /  1769 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能给详细的说下java程序运行时的堆空间和栈空间啊

4 个回复

倒序浏览
栈内存是存放变量,地址的,而堆内存存放具体对象和对象的属性,不存放对象方法,因为方法了静态数据都存放在方法区。当一个对象被创建后,对象本体在堆内存,然后把地址赋值给栈内存中的对象名,对象名就指向那个对象了!
回复 使用道具 举报
java内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一个私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈灰释放,这栈中的变量也随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,列如,使用new创建的对象放在栈里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中而不是栈中
回复 使用道具 举报
Java的内存分配栈中存放两种类型数据:
1、基本数据类型:此处疑问?存放的是具体的数据还是也是一个内存地址。
假设1:栈中存放的是具体的数据,当然所有出现在基本类型的操作均可以解释。
假设2:数据存放于上边提到的常量区,而栈中存放的是此常量区对应数据的地址。所有基本数据类型操作似乎也可以解释。
其实Java设计师们很注重内存的利用,我们可能看见很多文章曾提到这样一个概念,当int n =1;时,Java会在内存中搜索,看有没有1的存在,假如有的话,则不会重新分配空间建立1,如果没有的话,则会建立1,假如int m=1;则Java不会再建立1的空间。可见似乎内存中存在一个存放数据的地方。如果用次观点解释假设2完全成立。
现在以下的结论均在假设2下展开。
2、引用类型:栈中存放的是对象的引用,此引用是通过new创建的对象在对中分配的地址。
现在分析String。
属于什么类型?基本数据类型、引用类型。
当作为String str = "abc";建立时,作为基本类型的假设2合理一些。
当作为String str = new String("abc");建立时,毫无疑问作为引用类型处理。

我们暂且将+作为一种Java特殊的处理机制,当它处理引号字符串时不会采用new方式建立String(即像"abc"+"def"),而对于栈中数据处理时会采用new方式建立String(即像a+b)。

当作为String str = String.valueOf("abc");建立或者执行+时,完全可以解释通过。
其实String.valueOf()可以看做是对"abc"的封装,但不是new的。


其实现在要是按照以上的观点,可以得出这样一种结论:
栈中存放的是句柄,包括基本数据类型。内存中存在另外一块区域(常量区),存放基本数据类型数据以及引号字符串数据。
堆中存放的是对象,且必须是new的或者通过+运算符的重载隐式new的。
回复 使用道具 举报
哥们,我建议你仔细回去看看老毕讲的相关的视频,很好的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马