《数据结构》之栈和堆结构及JVM简析

本文详细介绍了程序在内存中的分布,重点关注JVM的内存模型,包括栈空间和堆空间的作用及其与对象的关系。JVM的垃圾收集机制(GC)包括标记清理、标记整理和分区复制三种策略。此外,文章还提到了Java逃逸分析机制,用于优化对象的内存分配。
摘要由CSDN通过智能技术生成

导言:

在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代?

一.程序在内存中的分布

作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码,是怎么跑起来的,操作系统怎么调用的,怎么划分的我们可以使用一个简单的图来了解一下:

在图片中,把我们的内存一共分为了两个部分,一个是操作系统的内核区,另外一个就是用户区

对于操作系统: 操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

操作系统内核要负责:程序调用,驱动调用,内存管理和分配,有兴趣可以学学操作系统,我们这里主要是看看用户内存区

用户内存区主要是用户对计算机发出的指令,计算机要做出相应的操作,用户区也是我们最大化操作计算机的地方,启动一个APP,打开网站,鼠标单击,Linux中的一次 dir指令等等,都是我们人,用户在进行操作和管理

我们写的程序或代码也是运行在用户空间上的

程序在用户空间上加载出来六个部分:

  • 代码段
  • 只读数据段
  • 初始化数据段
  • 未初始化数据段
  • heap堆
  • stack栈

代码段:就是我们写的源生的一些语言指令,在操作系统也可以叫做临界区,他在运行是不可改变的,又是纯的

只读数据段:就是我们在程序中写的一些常量,比如c或Java中使用const修饰的变量,它们是全局唯一且不可变的,包括语言本省有一些自定义的宏都是不可变的

初始化和未初始化的数据段:都是一些申请的全局变量,有些是未初始化的,有些是初始化的,在程序运行的时候就会被调用,都是数据段范围

heap堆:这就是我们的重点了,它的作用是动态申请空间的程序存放的地方,比如Java中我们new了一个对象,对象都存放在堆中的,还有c语言中malloc函数,它们所申请的东西都是存放在堆中的

stack栈:这是程序运行时被调用最频繁的了,它的结构很适合存储不长时间存在的变量,以及断点记录,每当一个函数执行完,它就会释放此次函数所产生的空间

补充:

我们仔细去看看图片就会发现,堆空间是向上扩张的,栈空间是向下扩张的,除了这两个空间,其它的空间都是静态资源,即在编译时分配的空间在执行的时候所需的空间还是那么大

栈空间是紧贴内核区的,因为栈在程序运行时本身就需要大量的操作,即使在内存中,把数据送到cpu或内核都是要开销的,所以为了使计算机可以快起来,栈作为操作多的结构就被选择紧贴内核

堆中存储的数据结构普遍都很大,包括对象这些操作集合,它们两者都向中间靠,会不会相遇呢?其实中间的数据区空间是很大的,绝大多数情况不会

栈中存储的都是值类型,指针也是值类型

二.JVM中的内存模型

内存模型分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icwx_7550592

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值