不能错过的Java常见的面试题——堆和栈的区别
今天给大家讲一下java中堆和栈的区别,这也是之前我在面试过程当中遇到的一道面试题,当时没答出来,尬住哈哈
在学习算法的时候我们学到了堆和栈这两种数据结构,各有各的特点,但是面试中的这个问题其实问的不是这个,而是jvm当中的堆内存和栈内存。
众所周知,java程序是运行在虚拟机当中的,虚拟机占有一部分内存,java把这部分内存划分为了堆和栈。
堆内存
它是一个运行时数据区,作用是用来存放new的对象和数组,堆的优势就是可以动态的分配内存大小,java的垃圾收集器可以自动回收不再使用的数据,所以缺点就是由于是动态分配内存,所以存取速度慢。
栈内存
栈主要用于存放基本类型变量和引用变量,特点是存取速度快,并且栈里面的数据可以共享,缺点是栈中的数据大小与生存期必须是确定的,缺乏灵活性。
其次,栈是方法运行时的内存,比如main方法运行,进入方法栈中执行;每个方法在栈内存中都有独立的栈空间,方法结束后会弹栈。
栈内存数据共享举例
int a = 3; int b = 3;
第一步处理: 1.编译器先处理int a = 3; 2.创建变量a的引用 3.在栈中查找是否有3这个值 4.没有找到,将3存放,a指向3
第二步处理: 1.处理b=3 2.创建变量b的引用 3.找到,直接赋值
第三步改变: 接下来 a = 4; 同上方法 a的值改变,a指向4,b的值是不会发生改变的
它们的区别
1.栈用来存放局部变量和方法调用,而堆存放的是对象
2.栈内存是属于单个线程的,是线程的私有空间,线程之间数据不可见,而堆里面的对象是线程共享的,可见的。
3.如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
4.栈的空间远小于堆的空间大小,如果使用递归的话,栈很快就会满,如果没有及时跳出,那么就会出现栈溢出。
jvm中 -Xss选项可以设置栈内存的大小,-Xms可以设置堆的开始大小,-Xmx可以设置堆的最大值。
好了,这就是堆和栈的区别,今天的课上到这,下课!
#面试题目#