java栈内存和堆内存的区别

栈内存 堆内存
分配 系统自动分配和管理的内存空间 手动分配的内存空间
回收 当一个函数被调用时,就会在栈中分配一段内存,当函数执行完毕时,这段内存就会自动释放 手动回收
存储数据 存储程序的方法和变量 存储对象
大小 栈内存的大小是固定的,由操作系统决定 堆内存的大小可以通过JVM参数进行配置,因此堆内存的大小可以根据应用程序的需求进行调整。
访问速度
存储生命周期

堆内存的特点:

  1. 堆内存是用于存储对象的内存空间,由垃圾回收器自动管理,无需程序员手动释放。
  2. 堆内存的大小可以动态调整,可以根据需要分配和释放内存空间。
  3. 堆内存的生命周期比较长,通常会持续到程序结束。
  4. 堆内存中的对象可以被多个线程共享,需要考虑线程安全性问题。
  5. 堆内存的访问速度比栈内存慢,但是可以存储大量的数据,适用于需要动态分配内存的场景。

栈内存的特点:

  1. 栈内存是线程私有的内存空间,用于存储线程执行方法的内部变量、方法参数和方法返回值等信息。
  2. 栈内存的大小固定,不支持动态扩容。
  3. 栈内存中的数据生命周期比较短,随着方法的执行结束就会被自动释放。
  4. 栈内存的访问速度比堆内存快,适用于需要快速访问局部变量和方法参数的场景。
  5. 栈内存不需要考虑线程安全性问题,因为每个线程都有自己的栈内存空间。
//创建对象
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都是存储在栈内存中的,它们的值在声明时被直接存储在栈中。

你可能感兴趣的:(java,jvm,开发语言)