MST

星途 面试题库

面试题:Java中堆内存和栈内存的主要区别是什么

请详细阐述Java中堆内存和栈内存的存储内容、生命周期、分配方式等方面的主要区别。
43.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

存储内容

  • 堆内存:主要存储对象实例(包括对象的成员变量)。例如,创建一个 new Person()Person 对象以及其所有成员变量的值都会存储在堆内存中。
  • 栈内存:存储局部变量(方法内定义的变量)、方法参数和方法的返回值等。比如在一个方法中定义 int num = 10;num 这个局部变量就存放在栈内存中。

生命周期

  • 堆内存:对象在堆内存中的生命周期取决于是否有引用指向它。当没有任何引用指向该对象时,在垃圾回收机制运行时,这个对象所占用的堆内存空间就可能被回收。例如,Person p = new Person(); p = null;p 被赋值为 null 后,new Person() 创建的对象就可能在未来的某个时间被垃圾回收。
  • 栈内存:栈内存随着方法的调用而分配,随着方法的结束而释放。当一个方法被调用时,会在栈中为该方法分配一块栈帧空间,方法执行完毕后,栈帧就从栈中弹出,其所占用的栈内存空间被释放。比如 void method() { int a = 10; } 方法执行完,a 占用的栈内存空间就会被释放。

分配方式

  • 堆内存:堆内存的分配是动态的,由 new 关键字或者反射机制等在运行时分配。例如 Object obj = new Object(); 就在堆内存中为 Object 对象分配空间。
  • 栈内存:栈内存的分配是自动的,在方法调用时,系统自动为方法内的局部变量等在栈中分配内存空间。比如方法执行开始,局部变量就会在栈中被分配内存。