从上到下看内存

news2024/9/20 12:38:13

从上到下看内存

1. 本篇目录

  • 内存条,总线,DMAC

  • 内存管理内存分类

  • 内存相关的系统调用

  • java中的内存

2. 内存条,总线,DMAC

内存条

内存条:内存条其实是非常常见的一个组件。内存条是插在主板上的。

总线

内存条插好以后,计算机之间要进行交互。其它设备,比如显卡,U盘,鼠标,键盘,耳机等等,和CPU之间都需要进行交互。这个交互其实都是通过总线来进行交互的。总线是在主板上的,埋在PC板里面。总线的分类有:数据总线,地址总线,IO总线,控制总线,等等。CPU需要和内存进行频繁的交互,CPU和内存条之间是通过数据总线来进行交互的。为了找到数据在内存条中的地址,我们还需要地址总线。也即是cpu和内存条之间是有数据总线和地址总线的。IO总线,最常见的就是USB总线,全称是通用串行总线。还有就是PCIE总线,也是和CPU直接相连的。显卡就是通过PCIE总线和CPU直接进行交互。

DMAC

在这里插入图片描述

DMAC:直接内存访问控制器。在主板上有俩个芯片,一个是CPU芯片,一个是南桥芯片。DAMC 是嵌在南桥芯片上的。

以读文件为例。比如说 CPU 说我要读文件了,那么就发送一个指令到 DMAC。然后DAMC 开始干活。把磁盘上的文件内容读到内存。因为 DMAC 是可以直接访问内存的。DMAC 读取完以后,就会告诉 CPU,活我已经干完了,文件已经放在内存上的某个位置。要清楚的一点是:当CPU 通知完 DMAC以后,CPU 就可以干其它的活了。

在这里插入图片描述

DMAC为什么可以做到直接内存访问呢?

CPU 和内存条之间是数据总线和地址总线,所以 CPU 可以访问内存上的数据。当 CPU 把活交给 DMAC 以后,会顺带把总线的控制权完全交给DMAC。也就是在当前这个阶段,DMAC 是老大。DMAC 对所有的总线有绝对的控制权。CPU 这个时候和总线是一个隔绝的状态。

还有一个疑问是,如果一个文件特别大,读取的时间要半个小时。按道理来说,这个时候 CPU 把总线的控制权完全交给 DMAC。如果这个时候 CPU 没有和总线相连的话,这个时候 CPU 是收不到外设的消息的。比如说,我们的鼠标就应该失灵了。但其实并不是。这是因为DMAC在读取文件的过程中,并不是一直掌握着总线的控制权,而是和 CPU之间会有一个交接。比如说我读取这个文件需要1s,那么1ms的时候,我DMAC是控制这个总线的,下1ms,交给cpu控制这个总线。CPU 干一些活。再接下来1ms,交给DMAC。CPU 和 DMAC 会轮换的掌握着总线的控制权。

3. 内存管理内存分类

内存管理原理

OS内存管理 主要是使用到了虚拟内存和物理内存之间的映射。虚拟内存地址是连续的,但是映射到的物理内存地址可能不是连续的。虚拟内存地址可能要比物理内存地址要大。多出来的部分就是映射到磁盘上。

内存管理分类

Linux 下内存管理分析

在这里插入图片描述

可以使用 free -h 命令查看 Linux 系统的内存信息。

mem:代表的是内存;swap: 代表的是磁盘交换分区。

文件磁盘缓存(buff/cache):指的是我们读过的文件,会暂时帮我们缓存到内存中。我们下次再读的时候,就直接从内存中拿出来了。所以就能够加速我们对文件的一个读写操作。但是这一部分的内存并不是强制需要保留的。所以要看我们能用的内存有多大,就直接看available就可以了。

4. 内存相关的系统调用

系统调用是用户态切内核态的方式之一,申请内存就需要使用系统调用。因为用户是无法操作硬件的,内存就是硬件。必须由内核进行操作,然后返回。

malloc 是对 brk 和 mmap 的一个封装。在128k以内,默认是调用了brk这个系统调用。大于128k, 是调用 mmap 进行内存申请。

brk 系统调用

c 语言中有一个库函数封装了 brk, 这个库函数是 sbrk。

brk在申请内存的时候,是连续的,是在堆,栈申请内存。brk是提高了heap内存的上界,还有stack内存的下限。

brk 在申请内存的时候,申请的最小单位是1页,一般系统中页的大小是4k,4096 个字节。所以 brk(1),实际上申请了4k个字节。

mmap 系统调用

在这里插入图片描述

使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)。

mmap 还可以直接将文件映射到内存。

mmap 和 使用 read 这个系统函数读取文件究竟有什么区别呢?

通过调用 read 这个系统函数,程序由用户态进入到内核态,将文件的内容加载到内存(内核空间),然后内核将文件从内核空间拷贝到用户空间。拷贝到用户空间以后,再从内核态切换到用户态。然后用户的程序就可以读取到文件的内容了。这个过程是 文件 - 内核空间 - 用户空间 。

mmap 是直接将文件进行了一个映射。也就是将页映射到了磁盘。当真正需要读取的时候,才会触发缺页异常,将文件从磁盘加载到内存中 。

这几个页在页表中,其实有内核空间的一部分内存直接映射过来,也有用户空间的一部分内存直接映射过来。所以说内核空间和用户空间俩部分都映射到了相同的文件所对应的物理内存中。所以有的文章说,mmap创造了这样一段内存,这段内存是用户空间和内核空间共享的这样的一部分内存。这里的共享内存和进程间的共享内存是不一样的。这里的共享内存指的是内核空间的 key 对应的 value 和用户空间对应的 key 和 value 是同一个值,都映射到文件所在的物理内存。

我们可以看到,在缺页异常完成以后,文件的物理内容直接映射到了用户空间中。这部分文件的物理内存并不需要从内核空间拷贝到用户空间中,所以,mmap 也是实现零拷贝技术的一种手段。

mmap 这么牛逼,那为啥还要用 read 函数呢?

mmap 和 read 是有各自的优缺点的。mmap 减少了内核空间到用户空间的拷贝。但是mmap 无法利用 buff/cache 的文件缓存。而且 mmap 第一次触发的缺页异常和 read ,哪一个的系统函数耗时更长,是还不确定的。所以,mmap 相对而言,不是特别稳定的。mmap 并没有比 read 性能更优这样的一种说法。所以说,现在mmap 和 read 是同样存在的。mmap 是实现零拷贝的一种技术。

那么为什么要以128K为界限呢?

主要是为了解决内存碎片问题。 brk分配的内存需要等到高地址内存释放以后才能释,而mmap分配的内存可以单独释放。

5. Java中的内存

Java 内存之前讲过,主要是堆,栈,本地方法栈,程序计数器和方法区的作用进行了简述。这里主要是对metaspace 和指针压缩进行展开。

metaspace

在这里插入图片描述

我们知道一个Java 对象包含俩大部分。一个是Java对象头,还有一个是Java对象内容。Java 对象头中有一部分是 Kclass Word ,它指向 Metaspace 中的 C++ 中的 一个Kclass 对象。而且 Kclass 对象中有一个字段指向了Class 对象。

指针压缩

在这里插入图片描述

Java 中每个对象的引用的大小是 4个字节,那么Java中对象可以申请的最大内存是 4GB吗?显然不是的。在生产中,我们会用到8GB的JVM的大小,甚至16GB的内存大小。那是怎么做到在 16GB甚至更大的内存的情况下,还可以用4个字节表示一个对象的呢?主要是用到了指针压缩技术。

因为Java 对象是 8字节对齐的,所以可以用32bit的地址表示 2^32*8Byte=32GB的内存地址。

所以在堆内存32G以内都是默认开启指针压缩的,每个对象的地址用4个字节表示。但是堆超过了32G那么就无法开启压缩,每个对象地址必须用8字节表示。

Java中每个对象地址可以是4个字节,在32GB以内,通过8字节对齐,就可以实现用4个字节的地址就可以对32GB的内存进行寻址。那么这个技术就叫做普通对象指针压缩技术。

当然这个技术仅限于普通对象,也就是堆上的对象。只是对堆上的对象地址进行了压缩。但是并没有堆 Metaspace 中的 Klass 这个对象进行压缩。i那么这里为什么说 开启压缩以后,还可以用32bit 表示 Klass 这个对象的地址呢?这是因为如果开启了压缩,Metaspace 中的 Klass 对象是位于压缩类空间中的。压缩类空间必须是4GB的连续的空间。所以开启了指针压缩以后,Metaspace中的压缩类空间的内存就不能超过4GB了。

在开启了指针压缩技术以后,Metaspace 里面的空间会分为俩部分,一部分是压缩类空间,存储的是 Klass,vtable, itable 这样的比较小的元数据信息;还有一部分是除了压缩类空间以外的空间。一般来说,压缩类空间的大小会比非类空间的大小小得多。

鸣谢

从上到下看内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 中断子系统(四):GIC中断初始化

以我手中的 imx6ull开发板为例。 如果使用设备树的话就需要在设备树中设置好中断属性信息,Linux 内核通过读取设备树中的中断属性信息来配置中断。对于中断控制器而言,设备树绑定信息参考文档 Documentation/devicetree/bindings/arm/gic.txt。 打开 imx6ull.dtsi 文件,其…

UDS诊断系列介绍12-11服务

本文框架1. 系列介绍1.1 11服务概述2. 11服务请求与应答2.1 11服务请求2.2 11服务正响应2.3 11服务否定响应3. Autosar系列文章快速链接1. 系列介绍 UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是面向整车所有ECU的…

三种方法解决React类组件中this指向问题

从onClick事件不加括号说起 import React from react import ./App.css class TestComponent extends React.Component {clickHandler () {console.log(111)console.log(this指向&#xff1a;, this)}render () {return (<button onClick{this.clickHandler()}>点击我&l…

机器学习实战4:基于马尔科夫随机场的图像分割(附Python代码)

目录0 写在前面1 图像分割问题2 图像像素邻域3 观测场与标记场4 马尔科夫随机场建模5 Python实现5.1 计算能量函数5.2 退火优化5.3 效果展示0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…

分享6个对象数组去重的方法

大家好&#xff0c;关于对象数组去重的业务场景&#xff0c;想必大家都遇到过类似的需求吧&#xff0c;针对这样的需求&#xff0c;你是怎么做的呢。下面我就先和大家讨论下基于对象的某个属性如何去重。方法一&#xff1a;使用 .filter() 和 .findIndex() 相结合的方法使用 fi…

基于AD Event日志监测AdminSDHolder

01、简介 AdminSDHolder是一个特殊的AD容器&#xff0c;通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和组&#xff0c;以防止意外和无意的修改并确保对这些对象的访问是安全的。如果攻击者能完全…

## Leetcode刷题Day24-------------------回溯算法

Leetcode刷题Day24-------------------回溯算法 1. 理论基础 题目链接/文章讲解&#xff1a;https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html视频讲解&#xff1a;https://www.bilibili.com/video/BV1cy4y167mM …

Linux文件目录与路径、内容查找命令及文件颜色知识总结

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务需求Shiro也都能胜任. 二.项目环境 MyBatis-Plus版本: 3.1.0 SpringBoot版本:2.1.5 JDK版本:1.8 Shiro版本:1.4…

ASUS X415安装系统找不到硬盘解决办法

同事让我帮忙安装系统&#xff0c;笔记本电脑型号是ASUS X415。原本以为是手到擒来的事情&#xff0c;结果我在上面还是消耗了不少时间。 现象 老毛桃PE 无法识别到硬盘。微PE可以识别到硬盘&#xff0c;但是系统安装以后&#xff0c;无法正常启动。启动出现蓝屏。或者无限等…

codewars闯关玩耍1

codewars闯关玩耍1 codewars网址&#xff1a;https://www.codewars.com/dashboard 大一时在知乎上看到的网站&#xff0c;然后 点击、收藏、吃灰 一键三连&#xff0c;最近翻收藏夹的时候突然又看见了决定进来玩玩&#xff0c;练练英语&#xff0c;巩固下python 以后此系列&a…

javaweb10 JSP语法、JSTL、EL表达式、JSP标签、九大内置对象

文章目录一、JSP简介二、JSP原理三、JSP语法四、JSP指令五、九大内置对象六、EL表达式七、JSP标签八、JSTL标签一、JSP简介 JSP&#xff08;java sever pages&#xff09;&#xff1a;java服务器端页面&#xff0c;和servlet一样&#xff0c;用于动态web技术 写JSP就像在写HTM…

中国to B应用软件的突破之路

我曾经随手画过一个很简单的图&#xff1a;我就分为供需两端。&#xff08;1&#xff09;如何让生意越做越大&#xff1f;那就在需侧&#xff0c;增加尽量多的交互。有人理解在营销环节-客户关系触点经营&#xff0c;有人理解在销售环节-多渠道多业态销售&#xff08;如电话销售…

振弦采集模块配置工具VMTool生成寄存器值

振弦采集模块配置工具VMTool生成寄存器值 生成寄存器值 VMXXX 有很多按位使用的寄存器&#xff0c; 使用 VMTool 工具可进行方便的设置&#xff0c;当需要知道寄存器的实际值时&#xff0c;可通过以下两种方法获取。 &#xff08;保持【 自动读取】 复选框为非选中状态&#xf…

Unity 简易音乐播放系统

前言 众所周知, Unity自带音效播放没有回调,不能自动播放clip列表; 所以简单实现一个带自动播放功能的接口,用以实现音乐列表的逐个播放. 一. 功能分析 首先要求切换场景时音乐不停,只在需要时播放其次即传入音乐名和播放次数,即可将该音乐循环播放指定次数可以直接传入一个…

【OpenCV 例程 300篇】256. 特征检测之 CenSurE(StarDetector)算法

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】256. 特征检测之 CenSurE&#xff08;StarDetector&#xff09;算法 6.9.1 算法简介 中心环绕算法&#xff08;Center Surround Extremas, CenSurE&#xff09;是 Agrawal M 等于 2008年提出的关键…

K8S StatefulSet基本使用

K8S StatefulSet 清空K8S对象 为了避免之前学习的内容造成的影响&#xff0c;先手动把K8S集群中的所有对象清空&#xff0c;使用一个全新的环境来学习StatefulSet的基本使用。 查看对象 查看service对象 kubectl get services查看ReplicaSet对象 kubectl get rs查看Repli…

达梦数据库导入dmp文件

找到达梦数据库安装文件的bin目录按着Shift键&#xff0c;右键输入以下命令&#xff08;注意更改参数&#xff09;.\dimp DGYH(用户名)/DGYH(密码)127.0.0.1 FILEdmp所在文件夹路径\20230103.dmp fullY然后根据提示,写Y 或 N 回车即可注意&#xff1a;若导入成功&#xff0c;但…

Java9的新特性模块化(Module)

一、 模块化是什么&#xff1f; Java 9引入了模块化系统&#xff0c;称为"Java Platform Module System"&#xff08;JPMS&#xff09; 这个系统允许将Java程序分成模块&#xff0c;每个模块都有自己的规范&#xff0c;可以明确地声明它依赖于哪些其他模块&#xff…