内存分析

1. 栈与堆:生存空间
    1.1  在java中,程序员会在乎内存中的两种区域:对象的生存空间堆(heap)和方法调用及变量的生存空间(stack)。
    1.2  我们知道所有的对象都存活于可垃圾回收的堆上,但是我么还没看过变量的生存空间。而变量存在于哪一个空间要看它是哪一种变量而定。
           这里说的“哪一种”不是它的类型,而是实例变量或局部变量。后者这种区域变量又被称为栈变量,该名称已经说明了它所存在的区域。
    1.3  栈与堆-----图
 内存分析 - 呆呆的坐、 - Jamkong的博客

  

2. 实例变量与局部变量
    2.1 实例变量:
                          实例变量是被声明在类而不是方法里面。它们代表每个独立对象的“字段”(每个实例都能有不同的值)。实例变量存在于所属的对象中。
                           public class Duck( ){
                                       int size ;         //每个Duck对象都会有独立的size;
                           }
   2.2 局部变量:
                          局部变量和方法的参数都是被声明在方法中。它们是暂时的,且生命周期只限于方法被放在栈上的这段期间(也就是方法调用至执行完毕为止)。
                            public void foo( int x ){
                                       int  i = x + 3 ;    //参数 x 和变量 i ,b 都是局部变量。
                                       boolean  b = true ;
                            }      
3. 如果局部变量生存在栈上,那么实例变量呢?
    当你新建一个Student()对象时,java必须在堆上帮Student对象找一个位置,这会需要多少空间呢?足以存放该对象所有实例变量的空间。没错,实例变量存在于对象所属的堆空间上。如果对象的实例变量为对象,Student对象只会留下实例引用对象的地址。也就是说,该实例变量将保存一个地址,而不是一个对象。
4. 内存分析图:
    首先来段代码:
   
class Student(){
   String name;//学生姓名
   int age; //学生年龄
   static int id;//学生id
   public void study(){
       ....
   }
   public void sayHello(){
       ....
   }
}
public class Demo{
    public static void main(String[] args){
        Student st1=new Student(); 
        st1.name="陈大爷";
        st1.age=20;
        Student.id=6;
        st1.study();
        st1.sayHello();
    }
}
以上面代码为例的内存分析图:
内存分析 - 呆呆的坐、 - Jamkong的博客
解释:(结合上面的知识点)
         s1 是在main方法里面的局部变量。所以它是放在Main方法的栈里头。
         new Student();创建了一个对象。因为是对象,所以它被放到了堆中。---->也就是图中的s1对象。
原文地址:https://www.cnblogs.com/JamKong/p/4447030.html