| 栈内存 | 堆内存 |
---|
分配与回收 | 系统自动分配和管理的内存空间(分配和释放遵循后进先出(LIFO)的原则,由编译器自动完成,通常在函数调用的过程中自动分配栈内存,并在函数执行完毕后自动释放。) | 手动分配的内存空间(通过特定的语法和API(如malloc、new等)来申请内存空间,并在不再需要时显式地释放(如free、delete等)) |
存储数据 | 主要用于存储基本数据类型(如int、float、char等) 和函数调用的上下文(如局部变量、参数、返回地址等) 。 | 主要用于存储复杂数据结构和动态分配的对象,如对象、数组 等。 |
大小 | 空间大小相对较小且固定,由编译器在编译时确定 | 空间大小相对较大,且可以根据程序的需求动态扩展 |
访问速度 | 快(因为栈内存的分配和释放由硬件直接支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行。) | 慢 (因为堆内存的数据存储方式是离散的,需要通过内存地址进行寻址和访问,需要经过多次指针跳转才能完成操作。) |
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person person = new Person("张三", 18);
- 首先,当执行创建对象时,编译器会在栈内存中分配一个名为person的变量,用于存储对象的引用
- new关键是的使用,会在堆内存中分配一块内存空间,用于存储Person对象
- 接下来person类会调用它的构造方法来初始化这个对象 成员变量name和age
- 最后,将对象的堆内存地址赋值给person变量,这样person就指向了新创建的Person对象。
- 在程序执行完毕或person的作用域结束之后,栈内存会被回收利用。
public class Calculator {
public static int add(int a, int b) {
int result = a + b;
return result;
}
}
int a = 10;
int b = 20;
int sum = Calculator.add(a, b);
- 这里没有涉及到对象的创建和使用,所以所有的变量和方法都存储在栈内存中;
- 整型变量a和b以及result都是存储在栈内存中的,它们的值在声明时被直接存储在栈中。