我知道局部变量是存放在栈区的,但是实例变量(包括primitive主数据类型)存放在哪呢,栈区?还是堆区?,那引用变量呢?求大神指教一下!!

解决方案 »

  1.   

    推荐阅读《深入理解java虚拟机》周志明 
      

  2.   

    不建议新人在很多常用语法语义都不熟悉的时候深入这个话题。
    讨论这个问题之前,需要先想清楚另一个问题:栈和堆两种结构各有什么特点?
    在想明白这一点的基础上,java为何把一些数据放在栈里,而一些数据放在堆里的问题更容易理解。
      

  3.   

    栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
    但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
    另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的。
    堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
    但缺点是,由于要在运行时动态分配内存,存取速度较慢。
      

  4.   

    程序执行过程1.当程序开始运行的时候,将自己Load到内存区
    2.此时操作系统也有一些代码在内存中,所以操作系统代码会找到该程序代码区的main方法并开始执行。
    3.执行过程中的内存管理分为四部分:
    code segment:代码区,用于存放代码。程序运行时将代码load到该区域。
    datasegment:用于存放静态变量,字符串常量。
    stack:栈,用于存放局部变量。1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。
    heap:堆,用来动态生成内存,存放new出来的东西。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。