虚拟机内存分为栈(stack)、堆(heap)、方法区(method)三个部分
虚拟机栈、堆、方法区存储类型及其特征:
虚拟机栈(stack)
每调用一次方法,在栈中加载一次,栈属于线程私有,是不能共享的,遵循先进后出,后进先出的原则。栈是由系统自动分配的,运行速度快,是一个连续的内存空间;堆(heap)
堆在JVM中只有一个,所有的线程共享一个堆,堆主要存储创建好的对象和数组,堆在JVM中是不连续的,具有分配灵活 ,速度慢的特点;方法区(method):
方法区是JVM机中的规范,在不同虚拟机版本有不同的实现,在JDK7以前,方法区的实现方式是“永久代”,在JDK7版本,部分去除“永久代”,静态常量,字符串常量池也挪到了堆内存中,在JDK版本则是堆和“元数据”相结合起来,在JVM中,只有一个方法区,被所有线程共享,方法区的特性跟堆相同,也是不连续的。示例:执行时,内存是怎样变化的
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();
}
}