JVM之内存模型分析图解

JVM内存分布

堆 heap

  • 堆用于存储创建好的对象和数组(数组也是对象)
  • JVM只有一个堆,被所有线程共享
  • 堆是一个不连续的内存空间,分配灵活,速度慢

栈 stack

  • 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口)
  • JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等)
  • 栈属于线程私有,不能实现线程间的共享
  • 栈由系统自动分配,速度快,栈是一个连续的内存空间

方法区 method area

  • JVM只有一个方法区,被所有线程共享
  • 方法区实际也是堆,只用于存储类,常量相关的信息
  • 用来存放程序中永远是不变或唯一的内容。(类信息【class对象】,静态变量,字符串常量)

以该程序为例进行内存分析


public class Student {
 
	int id;
	String name;
	int age;
	Computer computer;
	pubulic void study() {
		System.out.println("使用电脑" + computer.brand);
	}
	pubulic void play() {
		System.out.println("我在玩游戏");
	}
	public static void main(String[] args) {
		Student stu = new Student();
		stu.id = 1001;
		stu.name = "张三";
		stu.age = 18;
		Computer c1 = new Computer();
		c1.brand = "戴尔";
		stu.computer = c1;
		stu.play();
		stu.study();
	}
	
}
class Computer{
	String brand;
}

程序从main函数入口

javac 编译Student.java
java执行Student.java
java执行Student.java时加载Student类到方法区,静态成员,常量池等都在此时加载在这里插入图片描述

main方法先进栈
然后再堆中开辟一片区域给Student实例
然后在栈中压入引用stu,stu是一组四字节的地址(十六进制)地址,指向Student实例

Student stu = new Student();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3BR6PhI-1589516479906)(C:\Users\61608\AppData\Roaming\Typora\typora-user-images\image-20200515002700762.png)]

接着执行赋值代码

stu.id = 1001;
stu.name = "张三";
stu.age = 18;

找到栈中的stu,通过stu找到堆中的Student实例,进行赋值修改

  • 对于例如int这样的基本数据类型,直接赋值
  • 对于name的赋值,从方法区中的常量池里面找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b3QYIPeb-1589516479911)(C:\Users\61608\AppData\Roaming\Typora\typora-user-images\image-20200515003232306.png)]

接下来执行

Computer c1 = new Computer();
c1.brand = "戴尔";

和之前一样,不再赘述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQAerMxX-1589516479913)(C:\Users\61608\AppData\Roaming\Typora\typora-user-images\image-20200515003658422.png)]

接下来执行

stu.computer = c1;

c1即对Computer实例的引用,将他通过stu对象,将Student实例的computer属性指向了Computer实例,此时如果修改c1.brand的值,stu.computer.brand也会随之变换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CIECbXR8-1589516479917)(C:\Users\61608\AppData\Roaming\Typora\typora-user-images\image-20200515004222289.png)]

结下来执行两个方法

stu.play();
stu.study();

两个方法分别进栈出栈

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqdlgDOM-1589516479921)(C:\Users\61608\AppData\Roaming\Typora\typora-user-images\image-20200515004635339.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhp5Swi7-1589516479919)(C:\Users\61608\AppData\Roaming\Typora\typora-user-images\image-20200515004615570.png)]

之后c1、stu、main依次出栈

栈空之后内存自动释放,程序终止

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值