Java虚拟机内存分为三个区域:栈stack、堆heap、方法区method area

栈
-
栈是方法执行的内存模型,每个方法被调用都会创建一个栈帧,存储局部变量,操作数,方法出口等。
-
JVM为每个线程创建一个栈,用于存放该线程的执行方法的信息,实际参数,局部变量等。
-
栈属于线程私有,不可以线程共享
-
栈的存储特性是 "先进后出,后进先出"
-
栈由系统自主分配,速度快,栈是一个连续的内存空间
堆
-
堆用于存储建好的对象或者数组;
-
JVM只有一个堆,被所有线程共享
-
堆是一个不连续的内存空间,分配灵活,速度慢
-
堆被所有线程共享,在堆上的区域,会被垃圾回收器进一步划分,例如新生代、老生代的划分
方法区
- 方法区是JAVA虚拟机规范,可以由不同的实现:

- JVM只有一个方法区,被所有线程共享
- 方法区实际也是堆,用与存储类、常量等信息
- 用于存放程序中不变的内容,例如类信息,静态变量,字符串常量
- 常量池主要存放常量,如文本字符串、final常量值
ini
public class Person {
String name;
int age;
public void show() {
System.out.println(name);
}
public static void main(String[] args) {
Person p1 = new Person();
p1.age = 24;
p1.name = "张三";
p1.show();
Person p2 = new Person();
p2.age = 35;
p2.name = "李四";
p2.show();
Person p4 = p1;
p4.age = 80;
System.out.println(p4.age);
}
}

参数的传值机制
Java中,所有的参数传递都是"值传递",也就是传递的是值的副本。
基本数据类型的参数传递:传递的是副本,副本改变不会影响原件。
引用类型参数传递:传递的是值的副本,但是引用类型指的是"对象的地址",所以原参数指向的对象也会跟着发生改变。