黑马程序员技术交流社区

标题: 关于变量在内存的位置 [打印本页]

作者: litaojisuanji    时间: 2013-12-9 21:14
标题: 关于变量在内存的位置
本帖最后由 litaojisuanji 于 2013-12-10 21:08 编辑

我们都知道内存有,栈,堆,方法区,本地方法区,寄存区
比如 : Student s = new Student();
首先:java 先将Student类加载到方法区中,然后在栈中定义一个变量s ,在堆中用new申请一段空间放Student,再把这个首地址赋给s,s就指向了堆里的Student,那Student中有一个study方法,这个方法也在方法区中,那这个方法中假如有一个变量,是存放在哪呢。。

作者: lyn    时间: 2013-12-9 21:30
本帖最后由 lyn 于 2013-12-9 21:32 编辑

栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。存在于栈内存中

作者: 刘敏    时间: 2013-12-9 21:31
方法区里的变量在调用方法时,才会在堆或栈中重新分配空间,如果一直没调用,就不会分配空间。
作者: 回音    时间: 2013-12-9 21:57
1. 局部变量是方法或语句块内部定义的变量,比如形参。局部变量必须初始化。 局部变量存在于栈中。栈中的局部变量随着方法运行完毕而消失(修改栈指针,局部变量出栈消失,由编译器控制)。
2. 因为局部变量的大小和生命周期是可以在编译时确定的,所以栈指针的移动可以在编译时确定。加之栈的速度快,所以局部变量会被放在栈中。每个线程包含一个栈,栈内数据共享,不同栈间的数据不共享。
3. 线程的栈有多个部分,其中一个叫方法调用栈,会追踪线程运行中一系列的方法调用过程。这个栈的基本元素叫做帧。每当线程调用一个方法时,会向栈中压入一个新的帧。帧中储存着方法的参数,局部变量和其他临时数据。java中栈不可由用户直接操作,由虚拟机控制。所以java中栈的内存可以是不连续的。
作者: 回音    时间: 2013-12-9 21:58
本帖最后由 回音 于 2013-12-9 22:01 编辑

(抱歉,重复了不知咋删掉)
作者: kun1990    时间: 2013-12-9 22:04
方法的运行特点是只要调用的时候才会运行,因此当方法被调用的时候会在栈开辟内存空间,此时就会将变量存放在这段空间里。




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