黑马程序员技术交流社区

标题: 在内存中,所有的方法都是在栈中被调用的吗? [打印本页]

作者: chengaq0    时间: 2015-10-12 14:26
标题: 在内存中,所有的方法都是在栈中被调用的吗?
我们知道创建对象的时候,系统会自动调用构造方法,来进行初始化操作。在内存中,构造方法的调用也是在栈中进行的吗?


作者: 雨来    时间: 2015-10-12 14:26
JVM内存分严格意义上讲分为 栈内存  堆内存  方法区    你的疑问是方法调用    构造方法的调用 的顺序  是  JVM-栈中的对象引用---->方法区---->堆中的实体 在堆中new对象的时候  构造函数的地址码也就是对象的地址 会在方法区中存储这个地址  至于为什么  可能Object类中的内部机制吧  我是这样理解的



栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。
堆内存:通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。

作者: 雨中的泪    时间: 2015-10-12 14:37
内存分为栈内存 和堆内存你说的是你是个
作者: chengaq0    时间: 2015-10-12 15:15
雨中的泪 发表于 2015-10-12 14:37
内存分为栈内存 和堆内存你说的是你是个

{:2_30:}你是没看懂我问的问题啊,我是问构造方法的调用是不是也在栈中调用,只是确认一下
作者: 重头再来_0809    时间: 2015-10-12 17:26
是的 用过之后 直接出栈
作者: 迷茫不堪的年纪    时间: 2015-10-12 20:43
构造方法的调用是栈中进行一次之后,出栈回收呢, 还是进堆。
作者: kamo    时间: 2015-10-12 21:42
出栈之后就销毁了,但是代码好像是保存在方法区,这个在堆中,下次再用时再入栈。
作者: Zero_base    时间: 2015-10-13 00:02
不是,栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。函数的调用主要在方法区,然后进入栈中获取对象。
作者: chengaq0    时间: 2015-10-13 08:04
迷茫不堪的年纪 发表于 2015-10-12 20:43
构造方法的调用是栈中进行一次之后,出栈回收呢, 还是进堆。

栈中的数据,弹栈后就消失了
作者: chengaq0    时间: 2015-10-13 08:07
Zero_base 发表于 2015-10-13 00:02
不是,栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句 ...

你说的不对啊,方法的调用是要进栈的
作者: 迷茫不堪的年纪    时间: 2015-10-13 16:37
chengaq0 发表于 2015-10-13 08:04
栈中的数据,弹栈后就消失了

OK,刚才又看了一下, 已然明白
作者: 雨中的泪    时间: 2015-10-15 22:34
是的。。。。。。。。。




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