黑马程序员技术交流社区
标题:
关于栈内存与堆内存
[打印本页]
作者:
张振纲
时间:
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)
下载附件
2012-8-5 00:32 上传
作者:
马振兴
时间:
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