Java中堆和栈的理解要求特别深刻,所以我们重点写了一个堆和栈的区别的文章,方便大家理解和应用。

JAVA,内存模型中堆和栈的区别

在了解Java堆和栈的区别之前,我们先了解一下内存分配策略。

JAVA内存模型中堆和栈的区别——内存分配策略

程序运行时有三种内存分配策略——静态,栈式,堆式

静态存储:在编译时就能确定每个数据目标,在运行时的存储空间需求,因而在编译时就可以给他们分配固定的内存空间,这种分配策略要求程序代码中不允许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算程序的存储空间。

栈式分配该分配可称为动态的存储分配,是由一个类似于堆栈的运行栈来实现的,和静态存储的分配方式相反,在栈式存储方案中,程序对数据区的要求在编译时是完全未知的,只有到了程序运行时才能知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需数据区的大小才能分配其内存和我们在数据结构中所熟知的栈一样,栈式存储按照先进后出的原则进行分配。

堆式存储:专门负责在编译时或运行时模块入口处都无法确定的内存分配,比如可变长度串和对象实例堆有大片的可利用空间或空闲块组成,堆中内存可按照任意顺序分配和释放。

JAVA内存模型中,堆和栈的区别和联系

联系:创建好的数组和对象实例都会保存在堆中,想要引用堆中的某个对象或者数组,我们可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中这个变量就成了数组或对象的引用变量,就可以用栈中引用变量访问堆中的数组或对象,引用变量就相当于为数组或对象起的一个名称,引用变量是普通的变量定义,是在栈中分配引用变量,在程序运行到其他作用域外时,就会被释放掉,而数组和对象本身在堆中分配及时程序运行到使用new产生数组或对象的语句所在的代码块之外,数组本身和对象所占据的内存不会被释放,他们在没有引用变量指向时,才会变为垃圾,需要等待随后一个不确定的时间被GC释放掉。

调用new Person()时会在堆中创建相关对象实例,同时将其首地址赋值给p,并保存在了当前线程虚拟机栈内存中,栈通过获取变量p已保存的对象实例的地址,便能轻松调用到保存在堆中Person对象的实例。

主要区别体现在以下五个方面

①管理方式:JVM自己可以根据针对内存栈进行管理操作,而且该内存空间的释放是编译器就可以操作的内容,而堆内存在JAVA中,JVM本身执行不会对其进行释放操作,而是让GC进行自动回收。

②空间大小:一般情况下栈空间相对于堆空间较小,这是由栈空间里存储的数据,以及本身需要的数据特性决定的,而堆空间在JVM堆实例进行分配时,一般大小都比较大。因为堆空间在JAVA程序中需要存储较多的JAVA对象数据。

③碎片相关:针对堆空间而言,即使GC能够进行自动堆内存回收,但堆空间活动量相对栈空间而言比较大,很有可能存在长期堆空间分配和释放操作,而且GC不是实时的,它有可能使堆中内存碎片逐渐积累起来,针对栈空间而言,它本身就是堆栈的数据结构,它的操作都是一一对应的,而且每一个最小单位的结构栈帧和堆空间内复杂的内存结构不一样,所以它在使用过程中很少出现内存碎片。

分配方式:一般栈空间有两种分配方式,静态分配和动态分配,静态分配是本身由编译器分配好了,而动态分配可能根据情况有所不同,而堆空间却是完全的动态分配的,是一个运行时级别的内存,而栈空间分配的内存,不需要我们考虑释放的问题,对空间即使在有GC的前提下,还是要考虑其释放问题。

效率:因为内存本身快的排列就是一个典型的堆栈结构,所以栈比堆效率高很多,而且计算机底层基本内存结构使用堆栈结构,使得栈空间和底层结构更加符合,操作也简单,只涉及到了最简单操作,入栈和出栈,栈针对堆的弱点是灵活程度不够,特别在动态管理时。堆最大优点在于动态分配,因为他在计算机底层实现可能是一个双向链表结构,所以在管理内存时操作比栈空间复杂很多,自然灵活度就高了,但这样的设计使得堆空间不如栈空间,而且要低很多。

总结:Java堆和栈结构在面试过程中也是常考点之一,也是工作中经常遇到问题的地方,所以我们应该重点去掌握如何去深入理解这些知识,更好的去使用它。

大家有什么问题也可以一起留言探讨。欢迎转发和关注~

定义入栈java_Java堆和栈你敢说了解吗?看完这个文章再有底气说吧相关推荐

  1. mysql中堆和栈_堆和栈 - 矮油~ - 博客园

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  2. java string 栈_Java堆和栈的区别(String类)

    堆与栈 Java的堆是一个运行时数据区,对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放.堆是由垃圾回 ...

  3. mysql中堆和栈_堆和栈的区别

    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的.JVM运行时在内存中开辟一片内存 ...

  4. java的堆和栈_Java 堆和栈的区别

    1.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 2.堆内存 1.什么是堆内存? 1 堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对 ...

  5. java 堆 栈 ===_Java堆,栈,堆栈

    栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器 在java中,所有基本类型和引用类型都在栈中存储. ...

  6. 什么是堆、栈?堆和栈的区别

    栈区(stack):由编译器自动分配释放,存放函数的参数值.局部变量值等. 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 例程 //main.cpp int a = ...

  7. Java虚拟机中的栈和堆

    Java虚拟机中的栈和堆 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,J ...

  8. 语言堆栈入门——堆和栈的区别

    原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 格式和部分内容稍作修改 ...

  9. 内存、数据结构之栈和堆的区别?

    网上有一篇很好的文章,我差不多直接搬运过来了. 来源:http://www.cleey.com/blog/single/id/776.html 原文如下: 可能很多同学在这个概念上有些模糊,其实堆栈分 ...

最新文章

  1. java跨域权重_爱站权重查询 API 接口请求调用
  2. 用jstat摸清JVM线上系统情况
  3. 《算法帝国》——华尔街,第一张多米诺骨牌
  4. 算法 求子数组的最大和 C
  5. python模拟c的struct
  6. 改了一行代码,MySQL查询效率提升了80%,老板奖了我50万
  7. JAVA中toString方法的作用(转)
  8. 链路状态路由协议与OSPF
  9. GitHub使用指南——如何删除存储库
  10. ceph rbd resize之后文件系统的调节
  11. 阿里布局无人驾驶;滴滴成立汽车服务;“京东 AI 天团”首亮相| CSDN极客头条
  12. zabbix运维:[Z3001] connection to database ‘zabbix‘ failed: [1045]
  13. win8下IE10停止工作解决办法
  14. opencv车牌分割_OpenVINO车牌识别网络详解
  15. thinkphp学习总结
  16. 国内各大安卓市场有ASO优化吗?安卓应用市场aso优化
  17. nyoj 小明的存钱计划
  18. ChatGPT飙升苹果商店榜首,每周订阅需7.99美元,结果是个假的???
  19. 从FutureTask内部类WaitNode深入浅出分析FutureTask实现原理
  20. NoSQL(MongoDB) + GraphQL 快速入门环境和资料

热门文章

  1. 从源码分析DEARGUI之菜单
  2. MySQL安装失败问题汇总
  3. Foreach与Random
  4. DRP问题集结(一)-Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory...
  5. 第十四周项目2-带姓名的成绩单
  6. BS-GX-016基于SSM实现教材管理系统
  7. jdk1.8api中文版下载(帮助文档)
  8. .NET Framework 4.7 安装
  9. [BZOJ 2756] 奇怪的游戏
  10. 远震波形射线计算的局限性