(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)

java中的内存,分为两种,一为堆内存,二为栈内存。

栈内存

在函数中定义的基本类型的变量对象的引用变量都是在函数的栈内存中分配。

当在一段代码块中声明了一个变量时,java就会在栈内存中为这个变量分配内存空间,当超过变量的作用域之后,java也会自动释放为该变量分配的空间,而这个回收的空间可以即刻用作他用。

堆内存

堆内存用于存放由new创建的对象数组
在堆内存中分配的内存空间,由java虚拟机自动垃圾回收器来管理。

在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,变量的值就等于数组或对象在堆内存中的首地址,而这个栈中的特殊变量,也就成为数组或对象的引用变量。以后可以在程序中使用栈内存中的引用变量访问堆内存中的数组或对象了。引用变量相当于是为数组或对象起的一个别名,或者是代号。

数组和对象在没有引用变量指向它的时候,才变成垃圾,不能被继续使用,但是仍然会占用堆内存空间,而后在一个不确定的时间内,由java虚拟机自动垃圾回收器回收,这也是java程序为什么会占用很大内存的原因。

java中的内存分配策略及堆和栈的比较

1. 内存分配策略

根据编译原理的观点,程序运行时的内存分配,有三种策略,分别为静态的、堆式的、栈式的

(1)静态存储分配指的是在编译时就能确定每个数据目标在运行时的存储空间需求,因而在编译时就给它们分配了固定的内存空间。这种分配方式要求程序代码中不能有可变数据结构(例如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译时编译程序无法准确计算所需的存储空间大小。

(2)栈式存储分配也可以成为动态存储分配,是由一个类似于堆栈的运行栈来实现的。和静态存储分配相反,在栈式分配方案中,程序对于存储空间的需要在编译时是未知的,只有在运行的时候才能知道。但是规定在运行进入一个程序模块时,必须要知道该程序模块所需的数据区大小才能为其分配内存。同我们日常了解的栈一致,栈式存储分配遵照先进后出的原则进行分配。

(3)堆式存储分配专门负责在编译时或运行时程序模块入口处都无法确定存储要求的数据结构的分配,比如可变长度串和对象实例。堆内存由大片的可利用块或空闲块组成,堆中的内存也可以根据任意的顺序进行分配和释放。

堆和栈的比较

从通俗化的角度来说,堆是用来存放对象的,栈是用来存放执行程序的

栈:

在编程中(例如在C/C++中),所有的方法调用都是通过栈来进行的,所有的局部变量、形式参数也都是通过栈来分配内存的。

使用的时候,根据栈的工作原理,从栈顶向上用即可,Stack Pointer会自动指引程序到存储位置,程序只需要进行存储即可。退出函数的时候,修改栈指针即可将栈中存储的内容销毁。

这种模块速度最快,适合用户存储执行程序。但是应当注意的是,在进行内存分配是,比如为一个即将要调用的程序模块分配数据区时,应当实现知道这个所需数据区的大小,也就是说虽然分配工作是在运行程序的时候进行的,但是分配的大小是在运行程序之前就知道的,这个是编译时确定的,而不是运行时。

堆:

是应用程序在运行过程中请求操作系统给分配的内存,由于是操作系统管理的内存分配,所以在分配和销毁是都需要占用时间,因此堆的工作效率比较低。

但是堆的优点在于,编译器不需要知道从堆中分配了多少的内存空间,也不需要知道存储的数据要在堆中停留多长的时间,这也就使得用堆来保存数据有着更大的灵活性。

事实上,面向对象的多态性的实现,堆内存的分配必不可少,因为多态对象所需的数据区大小只有在运行时确定了对象以后才能知道。在java中,创建对象只需要使用new关键字即可,执行这些代码时,就会在堆中自动进行数据的保存。也就是因为这种灵活分配存储空间的特性,堆内存分配的工作效率不高。

JVM中的堆和栈

堆和栈都是java用来在内存中存放数据的地方,与C++不同的是,java自动管理堆和栈,程序员不能自行设置堆和栈。

java中的堆就是运行时存储数据的区域,类的实例对象可以通过new、new Array等指令建立从中分配空间,这些空间不需要程序代码来显式释放。堆是由jvm自动垃圾回收器负责的,堆的优势是可以动态的分配内存大小,生存周期也不用实现告诉编译器,因为空间是在运行时动态进行内存分配的。如果堆中的数据确认为垃圾,则jvm的自动垃圾回收器汇自动回收相应的空间。但是缺点是,由于实在运行时动态进行空间分配,存取速度较慢。

栈的优势是:存取的速度都比堆要快,仅次于寄存器。栈数据可以共享,但是缺点时,栈空间中的数据大小和生存期必须是确定的,缺乏灵活性。栈主要存放一些基本类型的变量int, short, long, byte, float, double, boolean, char和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

堆和栈在内存中的区别是什么?相关推荐

  1. C++__堆,栈与内存管理

    C++__堆,栈与内存管理 1.什么是栈,什么是堆 具体可以看这篇:转载[C]堆区和栈区的区别 2.静态变量,全局变量,堆,栈生命周期 3.new与delete的动作 4.动态分配的内存计算 参考:& ...

  2. 【转载】堆和栈的内存分配

    原文:堆和栈的内存分配 在这个练习中,你会在难度上做一个大的跳跃,并且创建出用于管理数据库的完整的小型系统.这个数据库并不实用也存储不了太多东西,然而它展示了大多数到目前为止你学到的东西.它也以更加正 ...

  3. 堆和栈的内存管理区别

    堆和栈的内存管理区别 数据结构的差异 C++中堆和栈的区别 三种内存对象的比较 内存分布上的堆和栈 一级缓存和二级缓存 数据结构的差异 堆:先进先出 栈:先进后出的.自顶向下 C++中堆和栈的区别 管 ...

  4. 堆,栈,内存泄露,内存溢出介绍

    简单的可以理解为: heap(堆):是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack(栈):是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 一. ...

  5. 什么是堆,栈,内存泄漏和内存溢出?

    heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 一.预备知识-程序的内存分配 一个由 ...

  6. Java堆、栈、内存分析

    在 JAVA 中,有六个不同的地方可以存储数据: 1. 寄存器( register ).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根 ...

  7. linux系统堆、栈及内存分配、CPU寄存器

    堆和栈: 栈主要用来存放局部变量, 传递参数, 存放函数的返回地址.esp 始终指向栈顶, 栈中的数据越多, esp的值越小. 堆用于存放动态分配的对象, 当你使用 malloc , new 等进行分 ...

  8. 堆和栈区别 java_JAVA中堆和栈的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...

  9. 堆和栈区别 java_Java中的堆和栈以及堆栈的区别

    在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈; 堆主要用来存放对象,栈用来执行程序.dnf自动收货工具的原理就是一个程序比如自动收货,先设置收的东 ...

最新文章

  1. 在交换机上,广播帧是如何发送的,
  2. ROS知识:分析和改写小乌龟代码【01】
  3. Commvault发布V11版数据管理平台 优化数据资源
  4. MFC中如何给对话框添加背景图片
  5. JAVA装mysql_已经安装了mysql,怎么能在java程序里使用SQL?
  6. 为什么老是把词语读反_关于语言表达 6岁儿童经常把词语顺序念反
  7. Java程序员必须掌握的Spring依赖管理原理
  8. OAuth 2.0授权框架详解
  9. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  10. 15款超好用的短链接在线生成器(新浪t.cn、腾讯url.cn)
  11. Java使用while循环计算调和数列的和并打印
  12. iPi Soft: Motion Capture for the Masses(大众化的运动捕捉软件)
  13. ftp服务器怎么删文件夹,删除ftp服务器文件夹
  14. URL中带特殊字符的处理方式
  15. 开发模式和软件系统开发
  16. 360悬浮加速小火箭,内存清理,加速缓存
  17. 互斥事件的概念和公式_2014-2015学年高二数学课件:《互斥事件的概率和加法公式》(湘教版必修五)...
  18. 微信Mac 3.0.0内测版上线!终于可以用电脑刷朋友圈了!!
  19. 2023年智能无人系统与人工智能国际会议(SIUSAI 2023)
  20. onnx->tensorRT模型转换错误集

热门文章

  1. 大半夜睡不着,聊一下在小外包公司工作一年后的感想吧
  2. SNS网站LinkedIn的Java架构技术
  3. 可视化BI模板分享:运营相关模板,知乎已获千赞
  4. Linux 定期清理内存脚本
  5. 会声会影2021软件下载如何制作视频剪辑制作教学
  6. matlab学生试用版,免费试用MATLAB
  7. centos7 卸载docker
  8. 一元函数的导数与微分概念及其计算
  9. 【SpringBoot】MultipartFile的transferTo()方法详解
  10. 武田公布2019财年第一季度强劲业绩并上调全年指引