Java虚拟机的内存可以简单的分为三个区域:虚拟机栈(stack)、堆(heap)、方法区(method area)。
虚拟机栈的特点:
1. 栈描述的是方法执行的内部模型。每调用一个方法执行之后,就会在栈中加载一次。
2.JVM虚拟机为每一个线程都创建栈,用于存储该线程执行方法的信息。
3 . 栈属于线程私有,不能实现线程之间的共享。
4 . 栈的存储方式是"先进后出,后进先出"。
5 . 栈是由系统自动分配的,速度快,且是一个连续的内存空间。
堆的特点:
1. 堆适用于存储创建好的对象和数组(数组也是对象)。
2 . JVM中只有一个堆,被所有线程共享。
3 . 堆是一个不连续的内存空间,分配灵活,速度慢。
方法区(静态区)的特点:
1. 方法区是JAVA虚拟机规范,可以有不同的实现方式。
JDK7之前,存在永久代.
JDK7时,将永久代中的静态变量和字符串常量池移入到堆内存中。
JDK8以及之后,元数据空间和堆内存相结合。
2 . JVM中只有一个方法区,被所有线程共享。
3. 方法区实际上也是堆,只是用于存储类、常量相关的信息。
4. 用来存放程序中永远不变或者唯一的内容(类信息、静态变量、字符串常量等)。
public class Person {
String name;
int age;
public void show(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
//创建Person类对象并使用
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();
}
}