面试题:Java内存分配策略之栈与堆的区别

98 阅读2分钟

题目

请阐述Java中栈内存和堆内存的主要区别,并且说明在这两种内存区域分别存储哪些类型的数据,举例说明。

知识考点

详细请见 面试题:Java内存分配策略之栈与堆的区别 - 星途面试题网

image.png

栈内存和堆内存主要区别

管理方式: 栈内存:由编译器自动管理,生命周期与函数调用相关,函数结束时,栈上变量自动释放。 堆内存:由程序员手动管理(Java 中通过垃圾回收机制自动回收),对象的创建和销毁由程序控制,对象不再被引用时,垃圾回收器会在合适时机回收。

内存分配: 栈内存:分配效率高,是连续的内存空间,按照后进先出(LIFO)的原则进行数据存储和访问。 堆内存:分配效率相对较低,内存空间不连续,通过内存分配算法来分配内存块。

内存大小: 栈内存:每个线程的栈大小有限,一般较小,通常为几 MB。 堆内存:可使用的内存大小相对较大,取决于系统可用内存。

存储数据类型及举例 栈内存存储数据类型: 基本数据类型:如 byte、short、int、long、float、double、char、boolean。

例如: int num = 10; 这里的 num 变量存储在栈内存中,值为 10。 - 对象引用:当创建一个对象时,对象的引用存储在栈内存中。例如:

String str = "Hello"; 这里的 str 是 String 对象的引用,存储在栈内存中,而实际的字符串对象存储在堆内存中。 2. 堆内存存储数据类型: - 对象实例:所有通过 new 关键字创建的对象都存储在堆内存中。例如:

Dog dog = new Dog(); 这里通过 new 创建的 Dog 对象实例存储在堆内存中,dog 引用指向堆内存中的该对象。 - 数组:数组也是对象,所以数组对象存储在堆内存中。例如:

int[] arr = new int[5]; arr 是数组的引用在栈内存,实际的数组对象在堆内存。