在JAVA中,内存的管理分为Stack—栈,Heap—堆,DataSegment—数据段,Code Segment—代码段。
首先,先明确每一块区域存放的是什么内容。
Stack:可以翻译为栈区域,存放一些基本数据类型,局部变量,常量,对象的引用地址。
基本的数据类型为最基本的四类八种类型。如下图所示
指令代码就是一些函数和方法。
常量和对象的引用地址可以理解为定义的变量。但是只是引用地址,真正new出来的存放在heap中,即堆内存中。
Heap:存放对象实例,即在代码中new出来的东西全部放在此处。
DataSegment:数据段,存放静态常量和字符串常量。
CodeSegment:代码段,存放代码。
简单的内存分析图形如下红色标识
栈和堆的一些特点我通过图形进行了一些简单的对比
下面就以一个简单的实例分析下内存的存取
class Person{
int id;
int age;
Person(int age, int id){
this.age=age;
this.id=id;
System.out.println("ID:"+id+"年龄"+age);
}
}
public class Test01 {
public static void main(String[] args) {
Person per=new Person(25,123);
}
}
函数首先从mian执行
先创建一个per的局部变量在栈中
通过new创建一个Perosn的动态内存,在堆中分配空间,
最后调用构造函数,通过this指针自身给id和age赋值,并将pe局部变量的引用指向对应的堆空间
通过内存分析,我们可以看出,创建对象,实质上在堆中动态的给变量分配一块内存空间,并将变量指向堆空间,也成为引用。