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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 三生石 中级黑马   /  2014-3-5 20:45  /  3248 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • 先有堆还是先有栈,什么叫压栈?

评分

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

查看全部评分

4 个回复

倒序浏览
基本类型(8种)位于栈中,只占有一块内存。例如 int a = 3;而引用类型占两块内存,一块是引用对象名,在栈内存中,它指向另一块在堆中的实际值,这点跟c语言中的指针差不多,可以做相同的理解。例如Person p = new Person(“李明”,24),p就位于栈中,而new出来的对象-------24岁的李明,就位于堆中。

评分

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

查看全部评分

回复 使用道具 举报
应该是先有栈,不过这些JVM替我们管理的,可能需要底层的只是才能理解吧
压栈,就是把一个新的值存入栈里,栈的大小是固定的,先入栈的值存在较高位的内存中,后入栈的顺序向低位内存存储,栈具有先进后出的特点
回复 使用道具 举报
局部变量存在于栈内存中,存放指向堆内存中New出来的对象的地址或实际值
回复 使用道具 举报
本帖最后由 sanguodouble1 于 2014-3-6 11:20 编辑

java的内存可以分为4部分
stack栈
heap堆
code segment 代码区
data segement 数据区

其中stack用来存放 局部变量
heap用来存放对象,你可以理解为new出来的东西
code segment用来存放代码的字节码,比如当你要调用一个方法时,系统就会去这个区中找方法相应的字节码
data segment用来存放数据,比如一些静态常量啊什么的

举个例子,你在main函数中写了下面这条语句
int a = 10;
static int b = 20;
Animal dog = new Animal();
那么他在内存中是这样分布的先在stack中分出一个部分,用来存放变量a,他里面的值是10;
然后在data segment分出一部分,用来存放b,他里面的值是20;
然后又在stack里面划出一部分,用来存放dog,他里面的值是一堆用于指向heap区的引用
最后在heap里划出一部分,用来新建一个Animal类型的对象
通过stack的dog里面的值,可以指向Animal

所以java里虽然没有c++中指针这个概念,但他的引用无处不在

评分

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

查看全部评分

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