黑马程序员技术交流社区

标题: 关于数组栈内存自动释放不太明白 [打印本页]

作者: cs8630323    时间: 2013-7-26 17:03
标题: 关于数组栈内存自动释放不太明白
看的老毕的视频,看到数组,说到栈内存自动释放,有些不明白
释放就是删除?
如果定义一个变量int x=1;   它不是一直在内存中吗?怎么会被释放?
作者: a2213502    时间: 2013-7-26 17:11
如果你定义了一个变量的话,如果没有引用指向它的话,就被java的回收机制当做垃圾直接回收了
作者: Joesph    时间: 2013-7-26 17:16
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

作者: xwf4348    时间: 2013-7-26 17:17
在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

作者: breaveheart    时间: 2013-7-26 17:57
并不是一直存在的,它随着对象的加载而加载,
当对象运行结束消失后,也随之消失。
作者: yangchao8907    时间: 2013-7-26 23:01
当然不可能一直都在内存中,所有的变量都有一个生命周期,例如:局部变量,当此局部变量所在方法开始执行时,它被创建,当其所在方法执行结束时,该局部变量被销毁,其内存也将被释放;再比如如果是全局变量,当程序从main入口开始逐句执行,当执行到定义该变量语句时,创建该变量,分配内存,当程序执行完毕,变量也会被销毁,其内存也将被释放。所以,没有变量能一直在内存中存在。
作者: 张亚军    时间: 2013-7-26 23:57
java中,在方法中定义一个
for(int x=1;x<10;x++){}x是存在栈内存中,在内存中的生命周期就是大括号内,出来大括号就结束了;数组是引用关系数据类型,例如:int arr [] = new int[8],在堆内存空间中开辟8个连续的内存空间,把首地址赋值给在栈内存arr,arr指向8块内存空间的首地址,当这种关系消失的话(即引用关系消失),int [8]就没有意义,JVM有垃圾回收机制,不定时回收垃圾,java就不会发生内存溢出(这是java比c++优秀的地方之一,c++需要程序员手动释放内存)
作者: 深圳在漂移    时间: 2013-7-27 00:45
局部变量在栈里,该段程序结束就被收回。
作者: 深圳在漂移    时间: 2013-7-27 00:46
局部变量在栈里,该段程序结束就被收回。
作者: の放下执著    时间: 2013-7-27 01:28
在定义一个局部变量的时候,就会在栈内存中给这个变量分配一个地址空间。如:在一个方法中定义了int x =1;
那么当JVM调用这个方法结束时,就会自动释放x这个变量的地址空间,不是一直存在的;方法都有一个大括号{}括起来的,也就是说int x = 1的生命周期就在这个大括号{}之间;出了这个{}就释放 x的栈内存。
作者: toShareBeauty    时间: 2013-7-27 01:37
本帖最后由 toShareBeauty 于 2013-7-27 01:39 编辑

数据结构中的栈了解么,栈内存释放,是指 java 中的局部变量,这些局部变量的内存是在 java 栈中分配的,java 栈中有好多栈帧,一个函数对应一个栈帧,当执行到这个函数的时候给这个函数创建一个栈帧,并把这个栈帧压入 java 栈,当函数执行完了就把这个栈帧弹出 java 栈,然后释放栈帧占用的内存。函数的局部变量是在栈帧中 local 域中分配的。



作者: 手心里的温柔    时间: 2013-7-27 09:37
定义一个数组是在堆内存中开辟存储空间,而内存地址赋到了栈内存中;
当定义的数组变量生命周期结束是,jvm会自动释放栈内存空间
希望能帮到你、共同学习哈




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