面向对象的内存机制分析-1

来源:互联网 发布:淘宝网灯具城 编辑:程序博客网 时间:2024/06/13 01:45

在分析java程序执行过程JVM(Java虚拟机)的内存分配情况,我们需要先了解三个和内存相关的东西:堆、栈和方法区。而这个三个分别对应的功能如下:

  • 堆:空间并不连续,存放动态产生的数据,比如,new出来的对象、数组等。创建出来的对象只包含各自的属性(成员变量),并不包括方法。因为同一个类所实例化的对象,非晶体的成员变量,存储在每个对象各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就需要把方法复制一次。

  • 方法区:其实也是堆,也就是包含在对内部,只不过用来存放存放类的信息(代码)、static变量和常量池。

  • 栈:自动分配连续的空间,遵循后进先出的的原则。一般来说,基本数据类型直接在栈中分配空间,局部变量(在方法代码段中定义的变量)也在栈中直接分配空间,当局部变量所在方法执行完成之后该空间便立刻被JVM回收,还有一种是引用数据类型,即我们通常所说的需要用关键字new创建出来的对象所对应的引用也是在栈空间中,此时,JVM在栈空间中给对象引用分配了一个地址空间(相当于一个门牌号,通过这个门牌号就可以找到你家),在堆空间中给该引用的对象分配一个空间,栈空间中的地址引用指向了堆空间中的对象区(通过门牌号找住址)。

下面通过程序来具体描述:

public class Student{    String name;    Int Id;    Int age;    String gender;    Int weight;    public void study(){        System.out.print(name+“”)    }}public static void main(String[] args){    //通过类加载器CLASS  LOADER加载Student类     Student S1= new student();    S1.name = “nima”;    S1.study();}

如上面的程序:上面的程序在刚调用对象的时候,基本属性还没有赋值,编译器会自动生成默认的值。除了八种基本数据类型(数值:0、char:\u0000、Boolean:false),其他的一律默认为NULL。调用对象后的内存图如下所示:

首先,Student S1= new student();这时候,JVM在堆空间中分配一块内存给Student对象,并为其分配一个内存地址,也就是图中1步骤,栈中存放局部变量S1,而堆中存放这个new出来的对象(也就是虚线框),S1的地址指向的堆中的对象;注意如果是基本数据类型的话,直接在对象里面赋值就行,如S1.Age=19;那么在堆中的对象age直接变成了19。然后,S1.name =“nima”;和S1.study();因为常量和代码的方法存放在方法区中,所以执行的时候根据student所指向的地址在方法区中寻找Student类的变量,并为变量赋新的值。

这里写图片描述

原创粉丝点击