黑马程序员技术交流社区

标题: 内存的空白 [打印本页]

作者: 不破大地    时间: 2013-6-24 11:06
标题: 内存的空白
本帖最后由 Super_Class 于 2013-6-24 18:29 编辑

其实一直很不明白,之前毕姥爷讲的栈、堆内存还是有点不懂,感觉要学好java,还得把这些东东弄透彻
(1)栈、堆内存二者之间是什么关系,在具体操作上有什么不一样,比如说在new对象时为啥引用进入的是栈,而new出来的进入的是堆啊?
(2)除了栈、堆内存之外,还有哪些内存,他们和栈堆之间有什么样的联系
还有请各位帅哥美女授业解惑啊.....
作者: 王靖远    时间: 2013-6-24 11:28
在我的理解里堆内存就是生命周期比较长,考垃圾回收机制消失,栈内存生命周期短,用完了就自动释放了。
作者: 万琪    时间: 2013-6-24 14:17
不运算的,,,一次性的,,全放在栈,,,
要运算的,,,对象,,啥的,,全放在堆,,,

静态的的,,类加载的,,全在方法区,,,,

作者: wangpan    时间: 2013-6-24 14:23
看完下面一段话,你就应该明白了:
当某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈空间。当函数运行结束时,分配给函数的栈空间被收回。在这个函数中被定义的变量也随之被释放和消失。通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!

作者: Super_Class    时间: 2013-6-24 18:29
栈空间中是存储变量的。

new对象的时候其实是用到了构造函数进行初始化。构造方法进栈,初始化完成后,构造方法出栈。

除了堆栈。还有静态区(方法区)、本地方法区、寄存器




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