黑马程序员技术交流社区

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

作者: 黑马--马超    时间: 2012-8-5 10:17
标题: 关于栈内存和堆内存的问题



作者: 杨文宇    时间: 2012-8-5 10:24
http://bbs.itheima.com/forum.php?mod=viewthread&tid=8405
论坛好多堆和栈问题,建议楼主去找一下。
作者: 刘润辰    时间: 2012-8-5 11:50
1 栈区 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。比如说,java中的基本数据类型就存在于栈区,int。。。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.
堆区亦称动态内存分配.程序在运行的时候new出来的对象,程序员自己负责在适当的时候释放内存。new出来得对象,动态内存的生存期可以由我们决定,如果我们不释放内存,java的自动回收机制将在最后才释放掉动态内存.但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象
Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也 就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。


2 栈的优势是,存取速度比堆快,缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,java垃圾回收器会自动收走这些不再使用的数据。缺点是,由于要在运行时动态分配内存,存取速度较慢。
理解这个对于为什么要分堆和栈就应该知道了吧。

3,A   a   =   new   A();中的new   A()是用来创建对象的,所创建的对象存在栈中;而a是引用,放在堆中,a中存放的是指向对象地址的值

4,垃圾收集算法的核心思想是:对虚拟机(jvm)可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间。

5,池的概念就是将某种资源缓存起来,不必要每次使用都初始化,使用完释放。使程序的效率得到提高。




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