黑马程序员技术交流社区

标题: 关于栈内存与堆内存 [打印本页]

作者: 张振纲    时间: 2012-8-4 23:41
标题: 关于栈内存与堆内存
我们都知道比方Person P =new Person();
这句话是在堆内存中开辟了一个空间,并且把地址赋给栈内存中的P引用

可是我想问,栈内存和堆内存谁先加载?
还有,如果对象有方法,那方法区又在什么时候加载呢?
作者: 樊占江    时间: 2012-8-4 23:43
基本数据类型放在栈,引用数据类型放在堆里面
作者: 樊占江    时间: 2012-8-4 23:48
堆内存是指存放的数据信息等“先进先出”,即取用先前存放的数据之后才能取用后面的,而栈内存恰好相反,即“先进后出”。  他们俩没有谁先谁后的问题。都是根据项目的需求来运行的
作者: 范泰洋    时间: 2012-8-5 00:28
[table]
[tr][td]我们都知道比方Person P =new Person();
这句话是在堆内存中开辟了一个空间,并且把地址赋
作者: 范泰洋    时间: 2012-8-5 00:29
本帖最后由 范泰洋 于 2012-8-5 00:32 编辑

我们都知道比方Person P =new Person();
这句话是在堆内存中开辟了一个空间,并且把地址赋给栈内存中的P引用
可是我想问,栈内存和堆内存谁先加载?
还有,如果对象有方法,那方法区又在什么时候加载呢?
首先,1:一开始主函数要先进栈,因为它是程序的入口出,这时后,栈内存就会先加载主函数,同时还有一个局部变量在栈内。2:然后,Person在堆内存中开辟了空间,这时候,堆内存开始加载,把地址值赋值给局部变量P。这时候,局部变量P就指向了对象Person。你说如果对象有方法,3:那就是当对象Person调用方法的时候,然后加载非静态区的方法,开始进栈,当方法结束的时候,就弹栈了。附图如下:

421421421.JPG (30.47 KB, 下载次数: 48)

421421421.JPG

作者: 马振兴    时间: 2012-8-5 00:45
Person p = new Person();在内存中做了哪些事情
顺序如下:
        (1)将Person.class文件加载进内存中。
        (2)如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。
        (3)在堆内存给对象分配空间。
        (4)对对象中的成员进行默认初始化。
        (5)对对象中的成员进行显示初始化。
        (6)调用构造代码块对对象进行初始化。(如果没有就不执行)
        (7)调用构造方法对对象进行初始化。对象初始化完毕。
        (8)将对象的内存地址赋值给p变量,让p变量指向该对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2