前言

在了解堆和栈之前,我们得了解JVM内存的划分,要了解JVM内存我们得先来聊聊Java程序的执行过程,Java程序在运行时都要开辟空间,Java程序的运行离不开JVM(Java虚拟机),好像鱼儿离不开水一样,所以JVM运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。

一、Java程序执行过程

首先我们先说一说Java的执行过程,图文安排上。

上图所示,我们理一理执行过程的顺序:

  1. 首先Java源代码文件(.java)会被Java编译器编译为字节码文件(.class)
  2. 由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行
  3. 在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们说的JVM内存

二、JVM的内存划分

话不多话,抽象的东西,图文给你安排上。

从上图我们看出,JVM的内存主要分为五块:程序计算器、本地方法区、方法区、栈内存、堆内存

三、什么是栈内存?

栈内存用来存储局部变量和方法调用。局部变量(内部变量):变量在方法的内部(随着方法进栈而诞生,随着方法出栈而消失),如:

public class Student{static int id = 1;    // 类变量String str="hello";  // 实例变量public void method(){int i = 0;       // 局部变量}
}

比如for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

四、什么是堆内存?

堆内存用来存储 Java 中的对象(比如数组等等Java对象),凡是new对象,建立的都是在堆中,堆中存放的都是对象(实体),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

五、两者间区别

所以堆与栈的区别很明显:

1、最主要的区别就是栈内存用来存储局部变量和方法调用。而堆内存用来存储 Java 中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

4、栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

最后

如果你觉得DT_小白文章写的还不错,请微信搜索并关注「 Java云社 」微信公众号,和DT_小白一起学习Java、分布式、微服务、大数据技术,并且「 Java云社 」收集了大量的大厂面试题目集,等你来挖掘,为了提升自己的能力,实现技术能力的飞跃,每天定时更新超硬核技术干货,我在「 Java云社 」等您的加入,让我们共同学习吧!

面试:一文搞懂堆和栈的区别相关推荐

  1. 一文读懂堆与栈的区别

    FBI WARNING:鄙人首个开源电子书 <Go 编码建议>已经上线拉,欢迎各位大佬斧正指导,协同共建. 文章目录 0.前言 1.程序内存分区中的堆与栈 1.1 栈简介 1.2 堆简介 ...

  2. 面试:说说Java 中堆和栈的区别?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | nnngu 来源 | cnblogs.com/ ...

  3. 面试:一文搞懂重载和重写的区别

    前言 方法的重写和重载是 Java 多态性的不同表现.重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现. 一.重载 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不 ...

  4. jmeter进程和线程的区别_一文搞懂进程和线程的区别

    计算机系统是由硬件和软件组成的,它们共同协作以运行应用程序.先来看下面这张一个典型的计算机系统的硬件组成图 从上图中看出一个系统由 CPU.ALU(算术逻辑单元).PC(程序计数器).总线(贯穿整个系 ...

  5. tcp udp区别优缺点_一文搞懂TCP与UDP的区别

    一.TCP协议: 位于传输层, 提供可靠的字节流服务.所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行 ...

  6. udp 使用connect优点_一文搞懂TCP和UDP的区别

    TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol ,用户数据报协议)都属于TCP/IP协议簇.TCP/IP协议集包括了超 ...

  7. 一文搞懂ETL和ELT的区别

    在过去的十年,我们对存储和管理数据的方式发生了很大的变化,并从ETL模式逐渐转向ELT,然而,小编认为这并不会是终点:未来极有可能会向EL(T)发展,也就是EL和T进行完全解耦.当然这只是一种猜想.本 ...

  8. 堆与栈的区别(数据结构角度)

    数据结构中的堆与栈 数据结构中,堆与栈是两个常见的数据结构,理解二者的定义.用法与区别,能够利用堆与栈解决很多实际问题. 1.栈的简介 栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和 ...

  9. 堆与栈的区别详细总结

    1.堆与栈的区别详细总结_Fighting++++的博客-CSDN博客_堆和栈的区别 2.堆和栈的区别 - 江雨牧 - 博客园 3.堆和栈的区别_内外皆秀的博客-CSDN博客_堆和栈的区别 4.一文读 ...

最新文章

  1. [JavaEE笔记]Cookie
  2. 人类大脑神经如何进化?寄生虫充当了隐形设计师
  3. [原创]Javascript类成员的作用域
  4. 关于linux 内存碎片指数
  5. lsit集合去重复 顶级表达式
  6. 验证码不显示,如何进入phpcms管理后台
  7. python中strip(),lstrip(),rstrip()函数的讲解
  8. 基于Boost::beast模块的快速WebSocket服务器
  9. SpringMVC—对Ajax的处理(含 JSON 类型)(2)
  10. CanFestival字典生成
  11. 改变图像的对比度和亮度
  12. 创建sprite 组
  13. c++整理程序 dev_【C++】用Dev-C++写的C++程序老是报错,请问为什么?如何解决?...
  14. linux多线程调度设置
  15. 计算机控制技术第二版答案于微波,微波技术习题答案 2.doc
  16. DMS - 简介 Driver Monitor System
  17. 立创eda学习笔记二十九:原理图转PCB
  18. 度数换算_视力表、近视度数换算方法(实用珍藏版)
  19. matlab验证角谷猜想问题,角谷猜想1.5编程基础之循环控制21
  20. 用代码绘制简单的图形

热门文章

  1. centos装java配件_CentOS安装JAVA
  2. 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题
  3. 信息学奥赛一本通(1196:踩方格)
  4. 信息学奥赛一本通(1314:【例3.6】过河卒(Noip2002))
  5. 信息学奥赛一本通(1411:区间内的真素数)
  6. 信息奥赛一本通(1099:第n小的质数)
  7. 家谱(信息学奥赛一本通-T1388)
  8. 分数求和(信息学奥赛一本通-T1209)
  9. 火柴棒等式(洛谷-P1149)
  10. 51 FI配置-财务会计-固定资产-折旧-维护期间控制方法