黑马程序员技术交流社区

标题: 关于栈内存和堆内存 [打印本页]

作者: 成吉思汗    时间: 2013-2-21 18:39
标题: 关于栈内存和堆内存
请教各位栈内存和堆内存的区别是什么?
求解,谢谢。
作者: 黑马刘杰    时间: 2013-2-21 19:19
本帖最后由 黑马刘杰 于 2013-2-21 19:23 编辑

Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

作者: 刘策    时间: 2013-2-21 20:37
栈内存:局部变量。
堆内存:数组,new 出来的实体。
作者: 罗正荣    时间: 2013-2-21 22:49
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
比如:Person p = new Person(); p存放在栈里面,而new Person存放在堆内存里
堆:存放所有new出来的对象。
引用变量是普通变量,定义时所在栈中分配内存,引用变量在程序运行到作用域外释放。而数组和对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象本身占用的堆内存也不会被释放。数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存, 在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。

作者: 赵家阳    时间: 2013-2-22 11:03
java变量存储
   1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
     2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
   3. 堆:存放所有new出来的对象。 (非对象引用)
   4. 静态域:存放静态成员(static定义的)
   5. 常量池:存放字符串常量和基本类型常量(public static final)。
   6,非ram: 存活在程序之外的数据
   对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。
   局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。成员变量存储在堆中的对象里面,由垃圾回收器负责回收。




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