作者:墨启飞
环境:IDE2021. jdk2013
TestPerson 类执行时的内存变化图,及运行过程,虚拟机栈、堆、方法区的特点
虚拟机栈:
1.
栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变
量、操作数、方法出口等)
2.
JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变
量等)
3.
栈属于线程私有,不能实现线程间的共享!
4.
栈的存储特性是“先进后出,后进先出”
5.
栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆:
1.
堆用于存储创建好的对象和数组(数组也是对象)
2.
JVM 只有一个堆,被所有线程共享
3.
堆是一个不连续的内存空间,分配灵活,速度慢!
方法区(又叫静态区,也是堆)特点如下:
1.
方法区是 JAVA 虚拟机规范,可以有不同的实现。
i.
JDK7 以前是“永久代”
ii.
JDK7 部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
iii.
JDK8 是“元数据空间”和堆结合起来。
2.
JVM 只有一个方法区,被所有线程共享!
3.
方法区实际也是堆,只是用于存储类、常量相关的信息!
4.
用来存放程序中永远是不变或唯一的内容。
public class
Person
{ String
name
;
int
age
;
public void
show(){
System.out.println(
"姓名:"
+
name
+
",年龄:"
+
age
);
}
}
public class
TestPerson {
public static void
main(String[ ]
args
) {
// 创建p1对象
Person
p1
=
new
Person();
p1
.
age
= 24;
p1
.
name
=
"张三"
;
p1
.show();
// 创建p2对象
Person
p2
=
new
Person();
p2
.
age
= 35;
p2
.
name
=
"李四"
;
p2
.show();
}
}
变化图 虚拟机栈 推 方法区
![](https://img-blog.csdnimg.cn/2021080322123697.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81ODE0ODg0MA==,size_16,color_FFFFFF,t_70)
运行过程 :首先从main方法这里,分别画一个虚拟机栈,推,方法区的图,main方法被调用,创建一个栈帧,调用main方法的形参agre=null,然后到p1,在方法区那里加载类,获得地址设为01x,数组当做对象放在堆那里
进而p1获得地址01x,进而得到age=24,因为张三是常量所以应放在常量池,因放在方法区进而得到name=张三,接下来到show(),因其是方法所以要新建一个p1show()的栈帧,这里是自己调自己,然后得到打印的 age,name 同理得到p2