Java工程师 数据结构与算法 堆与栈面试题(Day42)

1 请你解释一下,内存中的栈(stack)、堆(heap) 和静态区(static area) 的用法。 考察点:堆栈 参考回答: 堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身. 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 栈区:对象实例在Heap 中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例。 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等. 静态区/方法区: 方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域

2 说一说,heap和stack有什么区别。 考察点:堆与栈 参考回答: 1.heap是堆,stack是栈。 2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。 3.stack空间有限,heap的空间是很大的自由区。在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。 4.举例:数据类型 变量名;这样定义的东西在栈区。如:Object a =null; 只在栈内存中分配空间new 数据类型();或者malloc(长度); 这样定义的东西就在堆区如:Object b =new Object(); 则在堆内存中分配空间

3 介绍一下,堆与栈的不同是什么? 考察点:堆,栈 参考回答: (1)Java的堆是一个运行时数据区,类的对象从中分配空间。通过比如:new等指令建立,不需要代码显式的释放,由垃圾回收来负责。 优点:可以动态地分配内存大小,垃圾收集器会自动回收垃圾数据。 缺点:由于其优点,所以存取速度较慢。 (2)栈: 其数据项的插入和删除都只能在称为栈顶的一端完成,后进先出。栈中存放一些基本类型的 变量 和 对象句柄。 优点:读取数度比堆要快,仅次于寄存器,栈数据可以共享。 缺点:比堆缺乏灵活性,存在栈中的数据大小与生存期必须是确定的。 举例: String是一个特殊的包装类数据。可以用: String str = new String(“”); String str = “”; 两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"",如果没有,则将""存放进栈,并令str指向”abc”,如果已经有”” 则直接令str指向“”。

经验分享 程序员 微信小程序 职场和发展