java栈内存和堆内存的区别

栈内存堆内存
分配与回收系统自动分配和管理的内存空间(分配和释放遵循后进先出(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 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;
}
}
// 调用add方法
int a = 10;
int b = 20;
int sum = Calculator.add(a, b);
  • 这里没有涉及到对象的创建和使用,所以所有的变量和方法都存储在栈内存中;
  • 整型变量a和b以及result都是存储在栈内存中的,它们的值在声明时被直接存储在栈中。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值