数据区、代码区、栈区、堆区

概念

  • 栈区(stack):由系统的编译器自动的释放,主要用来存放 方法中的参数,一些临时的局部变量 等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
  • 堆区(heap):由程序员决定,在Java中,如果程序员不释放的话,一般会由垃圾回收机制自动的清理掉。此区域主要存放: 创建的对象、动态申请的临时空间等
  • 数据区(data seg):也称 全局区或者静态区 ,存放 静态变量、全局变量等 都会存放到数据区,此区域上的东西都被全局所共享。比如我们通常采用 类名. 的方式就可以访问到方法,这就是所谓的静态方法,存放到数据区的。
  • 代码区:存放程序编译后可以执行代码的地方。比如执行代码时写的While语句、if语句等,都会存放到此。

    内存分析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Person类
    class Person {
    int id ;
    int age = 20 ;
    Person(int _id, int _age){
    id = _id ;
    age = _age ;
    }
    }

接下来对new一个对象进行分析

执行语句: Person tom = new Person(1,25) ;

第一步:

我们知道每一个类都有一个默认的构造函数,即Person(),因此上述会先调用默认的构造函数

第二步:

执行构造函数New Person(1,25)时,我们知道调用的是Person(int _id, int _age),所以此时栈空间会分配方法的参数的临时变量如下

第三步:

执行构造函数 Person(int _id, int _age),id = _id; age = _age;此时栈中的临时变量会改变默认构造函数创建的对象,赋值完后,栈中的临时变量会自动的销毁,然后创建的临时变量Tom会自动的指向创建的对象。

0%