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

Java内存管理
本文详细解析了Java虚拟机(JVM)的内存分配机制,包括堆、栈和方法区的作用及存储内容,通过具体代码示例说明了对象如何在这些区域中进行分配。

在分析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类
的变量,并为变量赋新的值。

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值