看J2SE的视频,老师分析在代码在内存中的分布,而且一直说只要掌握了这些所有的语言都是一样的,所以我们就一起来看看我们经常敲的一些代码对应到内存中是怎样的。
首先我们编写的程序是放在硬盘中的,当我们启动它是程序会被加载到内存中去,在操作系统中存在对内从的管理,大概的分为4块,分别为code、data、stack、heap,每个区块的内存有自己的特点,分别用来存放不同的内容。
在code区存放代码例如代码中的方法就是存放在这里的,data区存放的时静态变量和字符串常量,在stack区存放的是局部变量、在heap区存放的时我们New出来的对象。
code区比较好理解就是存的程序代码,包括方法都是存在code区的。
data区存放两种,其中的静态成员变量是程序在初始化的时候就分配的的,程序的初始化就是在程序运行前将程序运行必须的资源加载到内存中
stack区存放的是局部变量,局部变量就是在具体的方法内声明的变量,包括方法的参数也是局部变量。只要是局部变量不论是什么类型都存放在stack中,当方法执行完毕局部变量占用空间就被释放。
heap区存放的是引用类型的数据,数据的分类如下:
其中在类内部方法外部声明的是类的成员变量,它也是和对象一起存放在heap中的以便重复利用,heap中的对象不会随着方法的结束而销毁,因为即使方法结束,这个对象还有可能被其他的引用变量所引用,所以不会被销毁(java垃圾回收机制,学习为什么被引用的不会被销毁)。
下面通过一个实例来一步步具体的看一下
Cat是一个类,包括了自己的成员变量、构造函数,方法等。在main方法中使用是内存的变化如下:
1、 第一句:Cat.sid=100
——因为sid是静态成员变量在程序初始化时就存在,所以可以直接给在data中的sid赋值为100;
2、 第二句:Catmimi=new Cat(“mimi”)
① Cat mimi 因为实在main方法内定义的是局部变量,所以会在stack中占用一块空间名字叫做“mimi”类型为Cat,
② new Cat(“mimi”) 这时调用Cat的构造方法,首先在heap中占用一块空间,
③ stack中的mimi通过引用可找到这块heap中的空间,
④ 构造方法的实参为”mimi”,由于是String类型的所以会在data区占用一块控件
⑤ 那么在调用构造方法是形参为“String name”,所以会在stack中有一块空间名字叫做name类型为String,
⑥ 将实参赋给形参
⑦ 然后执行this.name=name这时stack中的name指向data中的字符串“mimi”,id=sid++,其中id就为100,sid变为101
⑧ 在构造方法执行完毕之后,其中的变量释放
小结
基本类型的数据值占用一块内存,引用的占用两块,如其中的id和sid都是int类型的就只占用一块,而name是string类型的就占用两块,一个存放引用,一个存放值。
我们所学的语言虽然形式多变,但是本质在计算机内存中的分配都是这样子的,所以掌握这些和有助于对语言和代码的理解!