【Java 面试精选】:为何栈和堆在内存中有所区分?

内存中为什么要区分栈和堆

1. 概述

嗨,大家好Java 面试合集又来了,今天我们分享的主题很大众化以及普通。无论是Java 语言本身还是别的语言都会有所涉及,但是今天我们从Java角度来讲下

2. 分析

今天我们会从多个方向来分享这个话题

2.1 是运行时单位,是存储的单位

其实堆是存储的单位,我们一般都可以理解。因为我们会发现我们创建的对象,都会存放到堆中,而暴露出一个地址。

我们通过变量来保存这个地址,从而实现访问。

那我们如何理解栈是运行时单位呢。
就是我们在执行类中的方法,每个方法的上下文信息(局部变量,程序运行状态,以及返回值等)都会存放到栈中,以及什么时候存放到栈中,什么时候从栈中销毁。

当然栈中也是存放一些信息的,这个我们之后会详细的解释。

2.2 栈堆分离,有助于数据共享

在Java中一个线程就会有一个线程栈与之对应。因为不同线程执行不同的逻辑,因此需要一个独立的线程栈
而堆是所有线程共享的。使得堆中的内容被多个栈共享。

2.3 划分空间大小

栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可

2.4 为什么不把基本类型放到堆中

  • 基本类型占用空间比较小。
  • 基本类型的长度是固定的,不会出现动态增长
  • 所以其实放到栈中就足够了,堆中我们一般会存放一些对象,这种对象的大小不一定,这种情况栈中是无法满足的。
  • 所以:堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 【Java 面试精选】:为何栈和堆在内存中有所区分?

    发表回复