黑马程序员技术交流社区

标题: 堆和栈的问题 [打印本页]

作者: 蔡鹏飞    时间: 2012-7-5 15:38
标题: 堆和栈的问题
本帖最后由 蔡鹏飞 于 2012-7-10 10:09 编辑

看完了面向对象,觉得对堆和栈的概念还不是很理解。什么时候存在堆里,什么时候存在栈里?
作者: 赵方明    时间: 2012-7-5 15:48
本帖最后由 赵方明 于 2012-7-5 15:50 编辑

这是我的总结,通过自我提问的方式
9,内存的结构式什么样的?
内存分为5个部分,栈内存,堆内存,方法区,本地方法区,寄存器。
10,栈内存的作用和特点时什么?
栈内存存储局部变量,当数据使用完,所占空间会自动释放。
11,什么是局部变量?什么是成员变量?
定义在方法或者说函数里的变量,方法的参数里的变量,定义在for循环里的变量是局部变量。
定义在类里的变量是成员变量,定义在类里的函数叫做成员函数。
12,堆内存作用是什么?特点是什么?
通过new关键字建立的实体都存放在堆内存中,实体包括数组和对象。
特点:每一个实体都有内存地址值。
实体中的变量都有默认初始化值。
实体不再被使用,会在不确定的时间内被垃圾回收器回收。
Int [] x=new int[3];//这是一个赋值动作,赋的值不是数组,而是数组在内存中的地址。
New在堆内存中开了一个空间存放数组。X中存放的是这个空间的地址值。
作者: 孙飞    时间: 2012-7-5 15:49
new出来的对象都是存放在堆中,变量是存放在栈中,可以方便JVM调用,提高速度,把堆中new出来的对象的地址以十六进制的方式指向栈中的引用变量。常量和函数还有静态变量是存放在常量区,由全部对象共享,生命周期也是随类加载开始到类消失结束。
作者: 孙飞    时间: 2012-7-5 15:54
本帖最后由 feigecal 于 2012-7-5 15:58 编辑
赵方明 发表于 2012-7-5 15:48
这是我的总结,通过自我提问的方式
9,内存的结构式什么样的?
内存分为5个部分,栈内存,堆内存,方法区, ...


我感觉栈内存不仅存储局部变量还存储类成员变量的,还有定义在类里的变量是成员变量,定义在函数里的变量才是局部变量,
作者: 李志广    时间: 2012-7-5 15:54
       Java把内存划分为两种:一种是栈内存,一种是堆内存。
       栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
       栈的优势是,存取速度比堆要快,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
       堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
        在函数中定义的一些基本数据类型的变量和对象的引用变量都在函数的栈内存中分配,当在一段代码定义一个变量时,java就在栈内存中为这个变量分配内存空间,但变量超过作用域后,java会自动释放掉该变量所分配的内存空间。
       堆内存用来存放由2new创建的对象和数组。
      结合老师的视频,好好理解!不会的话,就多看几遍!不要着急、要慢慢来!{:soso_e100:}
      
作者: 蔡鹏飞    时间: 2012-7-5 16:12
嗯,让我消化消化,谢谢
作者: 黄昆    时间: 2012-7-5 16:14
java程序在运行时,在内存中分配了五个区域:
栈内存:用于存储局部变量,当数据使用其所占空间会自动释放。
堆内存:用于存储数组和对象,通过new我建立的实体都存放在堆内存中。其中实体包括数组和对象。而数组和实体的引用数据类型变量却存在与栈内存中,它里面存放的是数组和对象的内存地址值。
方法区:用于存放类中的方法,类中的共享数据也就是被static修饰的成员。
本地方法区:
寄存器:
举个例子综合说明一下吧:
class Demo
{
      static int number=10;
      int sum=0;
      public static void main(String[] args)
      {
          for(int i=0;i<number;i++)
          {
              sum+=i;
          }
       }
}
其中i 就是局部变量 number是类变量也称静态变量,sum是成员变量也称实例变量,局部变量一般定义在函数或者语句中存放于栈内存中,数组和实体的引用数据类型变量也存在与栈内存中,它里面存放的是数组和对象的内存地址值。成员变量定义在类中;没有被static修饰符修饰的成员变量存放于堆内存中,被static修饰的成员变量也就是类变量存放于方法区中。






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