java虚拟机(JVM)的内存可以划分为三个区域:栈stack、堆heap、方法区method area。
一、栈
- 1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
- 2.JVM为每个线程创建了一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
- 3.栈属于线程私有,不能实现线程间的共享!
- 4.栈的存储特性是“先进后出,后进先出”。举例:子弹夹,先放进的子弹后射,后放进的子弹先射。
- 5.栈是由系统自动分配,速度快!栈是一个连续的内存空间!
举例:
当调用方法1时,就在线程的栈空间里面创建一个栈帧(栈帧可以存储局部变量、操作数、方法出口等);当调用方法2时,就在方法1的栈帧上面创建一个新的栈帧;当调用方法3时,就在方法2的栈帧上面创建一个新的栈帧;
当方法3执行完之后,关闭方法3,然后弹出;当方法2执行完之后,关闭方法2,然后弹出;当方法1执行完之后,关闭方法1,然后弹出;
当线程执行完之后,整个栈空间就被干掉。
二、堆
- 1.堆用于存储创建好的对象(数组也是对象)
- 2.JVM只有一个堆,被所有线程共享
- 3.堆是一个不连续的内存空间,分配灵活,速度慢!
红色的小块指的是对象
三、方法区(静态区)
- 1.JVM只有一个方法区,被所有线程共享
- 2.方法区实际也是堆,只是用于存储类、常量相关的信息!
- 3.用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
四、案例
下面展示 实现类代码片
。
public class SxtSu {
int id;
String sname;
int age;
Computer comp;//计算机
void study(){
System.out.println("我在认真学习!使用电脑:"+comp.brand);
}
void play(){
System.out.println("我在玩游戏!");
}
//无参构造方法,用于创建这个类的对象
public SxtSu() {
}
public static void main(String[] args) {
SxtSu stu = new SxtSu();//创建了一个对象,相当于调用了SxtSu类的构造方法。
System.out.println(stu);
stu.id=1001;
stu.sname="饶帅";
stu.age=18;
Computer c1=new Computer();
System.out.println(c1);
c1.brand="联想";
stu.comp=c1;
stu.play();
stu.study();
}
}
class Computer{
String brand;//品牌
}
输出结果
五、内存变化过程
过程解释
- 1.程序先执行静态的属性、方法和字符串变量
- 2.然后调用静态的main方法并创建栈帧,存储局部变量stu=null和c1=null
- 3.然后调用SxtSu类的构造方法并创建栈帧,在堆中创建一个对象并赋值,使用完之后就弹出(1540e19d是SxtSu的地址值)
- 4.然后调用Computer类的构造方法并创建栈帧,在堆中创建一个对象并赋值,使用完之后就弹出(677327b6是Computer的地址值)
- 5.study()和paly()方法执行过程省略