黑马程序员技术交流社区

标题: 内存问题 [打印本页]

作者: 何羡玉    时间: 2013-4-22 08:30
标题: 内存问题
本帖最后由 何羡玉 于 2013-4-22 10:39 编辑

栈内存和堆内存以及方法区的最大区别,求他们各自在虚拟机里的作用
作者: 丘凤光    时间: 2013-4-22 08:50
本帖最后由 丘凤光 于 2013-4-22 08:58 编辑

区别就是存储的东西不同,释放资源的形式不同。在虚拟机的作用主要是存储资源。
一般记住他们存储的内容就行了

栈内存:基本类型的变量和对象的引用变量————资源会被java自动释放掉
堆:存放new出来的对象和数组————资源会被垃圾回收器释放
方法:每个Class字节码,常量池、字段描述、方法描述等
静态区:存放静态变量,字符串常量
作者: 何羡玉    时间: 2013-4-22 08:55
还有一个问题啊  就是为什么对象一般用完就会消失,如果对象消失了,那之前调用的方法或者对象所做的事情还会存在内存中吗
作者: 丘凤光    时间: 2013-4-22 09:02
何羡玉 发表于 2013-4-22 08:55
还有一个问题啊  就是为什么对象一般用完就会消失,如果对象消失了,那之前调用的方法或者对象所做的事情还 ...

堆内存中的对象超过了他的作用域范围了(一般也就是和这个对象有关的事件结束了),事件不存在了但是对象还存在,不像栈内存中的资源用完就自动释放,对象是由垃圾回收器在某个时间自动回收的
作者: Akm    时间: 2013-4-22 09:03


作者: 黄兴旺    时间: 2013-4-22 09:04
@刘胜寒
作者: 尹丽峰    时间: 2013-4-22 09:19
栈内存引用对象指向堆内存,栈内存在使用完成后自动释放资源
作者: 孤独的鸟人    时间: 2013-4-22 10:14
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类 型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
堆内存一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
作者: 孤独的鸟人    时间: 2013-4-22 10:24
何羡玉 发表于 2013-4-22 08:55
还有一个问题啊  就是为什么对象一般用完就会消失,如果对象消失了,那之前调用的方法或者对象所做的事情还 ...

新建的对象放在堆里,用完后java的垃圾收集器会自动收走这些不再使用的数据,之前调用的方法或者对象所做的事情在栈内存中会自动释放掉。




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