Java内存分析(栈、堆、方法区的联系和特点)

Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。

栈的特点如下:

  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  2. JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)。
  3. 栈的存储特性是“先进后出,后进先出”。
  4. 栈是有系统自动分配、速度快!栈是一个连续的内存空间。

堆的特点如下:

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

方法区(也叫静态区)特点如下:

  • JVM只有一个方法区,被所有线程共享!
  • 方法区实际也是堆,只是用于存储类、常量相关的信息!
  • 用来存放程序中永远不变或唯一的内容。例如:类信息、静态变量、字符串常量等。

下面举例一个程序运行过程中,内存的变化:
代码如下:

public class SxtStu{
	//属性dields
	int id;
	String sname;
	int age;
	Computer comp;//计算机
	
	void study(){
		System.out.println("我再认真学习!使用电脑:"+comp.brand);
	}
	
	void play(){
		System.out.println("我再玩游戏!王者荣耀!");
	}
	
	//构造方法
	void SetStu(){
	}
	
	public static void main(String[] args){
		SxtStu stu = new SxtStu();
		stu.id = 1001;
		stu.sname = "高琪";
		stu.age = 18;
		
		Computer c1 = new Computer();
		c1.brand = "联想";
		
		stu.comp = c1;
		
		stu.play();
		stu.study();
	}
}

class Computer{
	String brand;
}

当程序开始执行时,会首先加载SxtStu类的信息:代码,静态变量,静态方法,字符串常量(双引号引起来的)等。如下图:
在这里插入图片描述

然后开始从main方法开始执行,会在栈中开辟一个main方法的栈帧,每执行一个方法时都会在栈中开辟一个栈帧,按照先进后出的原则进行开辟和删除;方法执行完后就会删除栈帧。执行main方法就会执行SxtStu类的构造方法;这时会在堆中建立一个SxtStu类的对象。
在这里插入图片描述

当main函数中创建Computer对象时,堆中会开辟一个Computer对象的内存。
在这里插入图片描述

最终stu.play(),stu.study()和main函数依次执行完,依次删除栈中的栈帧;程序结束。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥自在”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值