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函数依次执行完,依次删除栈中的栈帧;程序结束。

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/104986777