操作系统中 heap 和 stack 的区别

操作系统中 heap 和 stack 的区别 操作系统中 heap 和 stack 的区别(2016年腾讯校招笔试)概念:   堆栈是两种数据结构,是一种数据项按序排列的数据结构,只能在一端进行插入和删除操作。堆为队列优先,先进先出(FIFO)。栈为先进后出(FILO)。区别:一、空间区别:    1.堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。PS:java中都是…

大家好,又见面了,我是你们的朋友全栈君。

 

操作系统中 heap 和 stack 的区别(2016年腾讯校招笔试)

概念:   堆栈是两种数据结构,是一种数据项按序排列的数据结构,只能在一端进行插入和删除操作。堆为队列优先,先进先出(FIFO)。栈为先进后出(FILO)。

区别:

一、空间区别:

    1.堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。PS:java中都是系统GC,程序员无法进行GC。

    2.栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量值等。操作方式与数据结构中的栈相类似。

二、缓存方式

    1.堆:使用二级缓存,生命周期与虚拟机的GC算法有关(并不是引用为空就立即被GC),调用速度相对较低。

    2.栈:使用一级缓存,被调用时通常处于存储空间中,调用后被立即释放。

三、数据结构

   1、堆(数据结构):类似于树结构,可以类比于堆排序

    2、栈(数据结构):先进后出(FILO)

java中堆栈的区别:

栈(stack)与堆(heap)都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 
  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 
  堆内存用来存放由new创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 
Java中变量在内存中的分配: 
  1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期–一直持续到整个”系统”关闭。 
  2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”。 实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存。 
  3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放。 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147262.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Mysql04

    Mysql04

    2022年3月5日
  • 股票历史数据库(腾讯股票历史数据接口)

    歪枣网财经数据下载接口集合,百度搜索歪枣网官网序号 名称 接口描述 数据字段 更新日期 操作0 A股列表 沪深京A股基本信息 code股票代码name股票名称stype股票类型,1:深证股票,2:上证股票,3:北证股票,4:港股hsgt沪深港通,1:沪股通:2:深股通、3:港股通(沪)、4:港股通(深)、5:港股通(沪+深)bk所属板块,个股包括主板、创业板、科创板cfg成分股,该板块的成分股roeROEzgb总股本(股)ltgb流通股本(股)ltsz流通市值(元)

    2022年4月10日
  • ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]

    ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]比较目前,针对于ARM平台的主流编译器主要有以下三者:比较ARMCCIARGCCforARM命令行工具IDE中,独立提供仅随其IDE发布,不独立提供独立提供开发商ARMIARGNU(目前由ARM维护)支持的平台Windows、LinuxWindowsWindows、Linux、Mac配套IDEKeilMDK、Develo…

    2022年6月10日
  • PCIe 1. PCI与PCIe学习一——硬件篇

    PCIe 1. PCI与PCIe学习一——硬件篇最近在学习驱动开发过程中涉及到PCI相关知识,在网上看了很多文章,良莠不齐,我总结一下比较好的文章分享给大家,那就从源头开始说起。PCI总线和设备树是X86硬件体系内很重要的组成部分,几乎所有的外围硬件都以这样或那样的形式连接到PCI设备树上。虽然Intel为了方便各种IP的接入而提出IOSF总线,但是其主体接口(primaryinterface)还依然是PCIe形式。我们下面分成两部分介绍PCI和他的继承者PCIe(PCIexpress):第一部分是历史沿革和硬件架构;第二部分是软件界面和U

    2022年6月20日
  • 设计模式(一)工厂模式Factory(创建类型)

    设计模式(一)工厂模式Factory(创建类型)

    2021年12月31日
  • 关于cpu流水线的各阶段周期,吞吐率计算问题

    关于cpu流水线的各阶段周期,吞吐率计算问题本人在复习计组流水线时,遇到了一些问题,再次记录,以备不时之需。首先要弄明白一点,那就是cpu的各阶段是否具有相同的时钟周期,也就是说,每个阶段所花费的时间是否都是相同的?为什么会想到这个问题,先看一下408统考真题的这一题:刚开始那是想都没想,这他么这么简单的题,肯定选A啊,虽然的确做对了,但分析这道题所考的知识点时,想的就多了,为什么时钟周期不能小一点,比如为50ns,让每个阶段所占用两个时钟周期不就得了,但是这时候脑子突然想到,cpu流水线的每个阶段是不是必须是一个时钟周期啊?这时候,

    2022年8月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号