Java内存分析(栈、堆、方法区的联系和特点)
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。栈的特点如下:栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)。栈的存储特性是“先进后出,后进先出”。栈是有系统自动分配、速度快!栈是一个连续的内存空间。堆的特...
·
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。
栈的特点如下:
- 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
- JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)。
- 栈的存储特性是“先进后出,后进先出”。
- 栈是有系统自动分配、速度快!栈是一个连续的内存空间。
堆的特点如下:
- 堆用于存储创建好的对象和数组(数组也是对象)
- 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条内容
所有评论(0)