当前位置: 首页 > news >正文

内存相关知识(新)

基本概念

  • 内存层次结构:内存层次结构是一种层次化的存储设备结构,它包括寄存器、缓存、主存和辅助存储器。每一层次的存储设备都有不同的速度、容量和成本。

  • 内存单元:内存被划分为一系列连续的内存单元,每个单元都有一个唯一的地址。每个内存单元通常存储一个字节的数据。

  • 地址空间:地址空间是由内存单元组成的线性地址范围,用于寻址和访问数据。地址空间可以分为物理地址和逻辑地址。

  • 物理地址:物理地址是内存中实际的硬件地址,用于访问和存储数据。物理地址是由内存控制器和内存映射电路生成的,并用于在内存中定位特定的数据单元。

  • 逻辑地址:逻辑地址是程序或进程使用的地址,它是相对于程序的地址空间而言的。逻辑地址是在程序执行时使用的,而不是实际存在于内存中的地址。

  • 虚拟内存:虚拟内存是一种将物理内存和辅助存储器(如硬盘)结合使用的技术。它允许程序使用比实际可用物理内存更大的地址空间,通过将不常用的数据存储在辅助存储器中,并在需要时进行交换。

  • 内存管理单元(MMU):内存管理单元是一种硬件设备,用于处理逻辑地址和物理地址之间的转换。MMU负责将逻辑地址转换为对应的物理地址,并进行访问控制和内存保护。

  • 内存访问时间:内存访问时间是指从发出内存读/写请求到完成该请求所需的时间。内存访问时间受到内存层次结构、内存技术和访问模式的影响。

内存的数据结构

  • 数组(Array):数组是一种线性数据结构,由相同类型的元素组成,这些元素在内存中连续存储。数组的访问是基于索引的,可以使用索引来快速访问数组中的元素。例如,int[] numbers = {1, 2, 3, 4, 5}。

  • 链表(Linked List):链表是一种动态数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的节点可以在内存中分散存储,通过指针链接在一起。例如,链表可以是单链表、双链表、循环链表等。

  • 栈(Stack):栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。栈的数据存储在内存中的连续区域,插入和删除操作通过调整栈顶指针来实现。例如,函数调用栈是一种常见的栈结构。

  • 队列(Queue):队列是一种先进先出(FIFO)的数据结构,只能在队尾插入元素,在队头删除元素。队列的数据在内存中以线性方式存储,插入和删除操作通过调整队列头尾指针来实现。例如,消息队列是一种常见的队列结构。

  • 树(Tree):树是一种层次结构的数据结构,由节点和边组成。每个节点可以有多个子节点,只有一个根节点。树的节点可以在内存中分散存储,并且通过指针链接在一起。例如,二叉搜索树、堆、红黑树等。

  • 图(Graph):图是一种由节点和边组成的非线性数据结构,每个节点可以与其他节点通过边相连。图的节点和边可以在内存中以不同的方式存储,如邻接矩阵、邻接链表等。

堆与栈

堆(Heap)和栈(Stack)都是内存中用于存储数据的区域

  • 堆(Heap): 堆是用于动态分配内存的一种数据区域。它的主要特点是内存的分配和释放是由程序员手动控制的,以满足程序的需要。在堆中分配的内存可以在程序的任何地方被访问,并且可以在程序的运行期间动态地分配和释放。
    • 生活中的例子:考虑一个公共图书馆,它有一些书架和一个可供读者自由借阅的书籍区域。 图书馆管理员负责管理和分配这些书籍。每个读者在需要时可以向管理员申请一本书,当读者不再需要一本书时,他们可以归还给管理员。在这个例子中,书架就类似于堆,它是一个公共资源,读者可以在任何时候访问它,并根据需要借阅和归还书籍。
  • 栈(Stack): 栈是一种具有后进先出(LIFO)特性的数据结构,用于存储函数调用和局部变量等信息。栈的主要特点是数据的存储和访问是有序的,每次只能在栈顶进行插入和删除操作。栈的内存分配和回收是由编译器和操作系统自动管理的。
    • 生活中的例子:考虑一个餐厅的盘子堆叠,每当服务员端来一份菜时,他们会将盘子放在堆叠的最顶部。当顾客吃完一份菜后,服务员会从最顶部开始依次拿走盘子。这个盘子堆叠就类似于栈,新的盘子只能在顶部添加,而拿走盘子也是从顶部开始。这种后进先出的结构使得盘子的存储和取出都很方便。

虚拟内存

虚拟内存是计算机系统中的一种内存管理技术,它通过将物理内存和磁盘空间结合起来,为程序提供一个似乎比实际可用内存更大的地址空间。虚拟内存的主要目的是提供比物理内存更大的内存空间,并允许多个进程同时运行。

虚拟内存的工作原理如下:

  1. 地址映射:每个进程在运行时都有自己的虚拟地址空间,该空间被划分为固定大小的页面(通常为4KB)。虚拟地址空间中的每个页面与物理内存中的页面相对应。

  2. 分页:虚拟内存将进程的虚拟地址空间划分为多个页面,并将这些页面映射到物理内存中的页面。这种划分和映射是按需进行的,只有当进程需要访问某个页面时,才将其加载到物理内存中。

  3. 页面置换:当物理内存不足时,虚拟内存使用页面置换算法将一部分不常用的页面从物理内存中置换到磁盘上,以便为正在运行的进程提供足够的空间。当进程再次需要访问被置换的页面时,系统会将其从磁盘加载回物理内存。

虚拟内存的优势包括:

  1. 扩展性:虚拟内存允许每个进程具有更大的地址空间,从而支持更大的程序和数据。

  2. 内存隔离:虚拟内存使得每个进程在运行时相互隔离,不会相互干扰。即使某个进程崩溃或出现错误,也不会影响其他进程的正常运行。

  3. 虚拟内存管理:虚拟内存管理系统负责管理内存的分配和释放,使得程序员无需手动管理内存。

  4. 资源共享:虚拟内存允许多个进程共享同一段物理内存,从而提高内存的利用率。

内存溢出与内存泄露

内存溢出

内存溢出是指程序在运行过程中试图使用超出其分配的内存范围的情况

  •  假设有一个程序需要处理一个非常大的数组,但程序为数组分配的内存空间不足以容纳所有的数据。当程序尝试写入超出内存空间边界的数据时,就会发生内存溢出。这可能导致程序崩溃或出现未定义的行为。
    • 一个程序试图将一个有1000个元素的数组写入一个长度为500的内存缓冲区。由于缓冲区大小不足以容纳整个数组,就会发生内存溢出。

内存泄露

内存泄露是指程序在运行过程中分配了内存但未正确释放,导致这些内存资源无法再被使用

  • 假设有一个程序在每次迭代时动态分配一块内存,并将指针存储在一个数据结构中。但在迭代结束后,程序忘记了释放这些动态分配的内存。这样,随着时间的推移,程序使用的内存会不断增加,最终导致内存泄露。
    • 一个程序在每次循环迭代时动态地分配一个对象,并将指针存储在一个链表中。但在链表中删除对象的操作中,程序忘记释放该对象的内存。随着循环的进行,链表中会有越来越多未被释放的对象,导致内存泄露。

堆区

堆区(Heap)是计算机内存中的一部分,用于动态分配和管理内存。在堆区中,程序可以自由地分配和释放内存,不受固定大小或作用域的限制,因此也被称为动态内存。堆区的大小通常比栈区更大。

堆区的特点包括:

  1. 动态分配:堆区允许程序在运行时动态地请求内存空间,这些内存空间在程序运行结束之前会一直保留。

  2. 无序存储:堆区内存中的数据存储是无序的,没有固定的数据结构。每次分配的内存块可能不连续,因此可以在堆区中分配和释放任意大小的内存块。

  3. 手动管理:在大多数编程语言中,堆区的内存需要手动管理,也就是分配内存时需要手动调用分配函数(如malloc、new等),并在使用完后手动释放内存(如free、delete等),否则可能会导致内存泄漏。

堆内存

堆内存(Heap Memory)是指在计算机中用于存储动态分配对象的一块内存区域。在Java虚拟机(JVM)中,堆内存是用于存储运行时创建的对象的地方。

堆内存的特点包括:

  1. 动态分配:堆内存可以在程序运行时动态地分配和释放内存,而不受固定大小或作用域的限制。在JVM中,通过new关键字创建的对象都存储在堆内存中。

  2. 垃圾回收:Java虚拟机通过垃圾回收机制自动管理堆内存中的对象的生命周期。当对象不再被引用时,垃圾回收器会自动回收这些无用的对象,释放其占用的堆内存空间。

  3. 线程共享:堆内存是所有线程共享的,所有线程都可以访问和操作堆内存中的对象。

YGC与FGC(垃圾回收)

YGC

YGC(Young Generation Garbage Collection):YGC是指针对年轻代(Young Generation)进行的垃圾回收操作。在JVM中,堆内存被划分为年轻代和老年代两个区域。年轻代主要包含新创建的对象,通常包括Eden区和两个Survivor区。当年轻代的空间不足时,会触发YGC。

YGC的过程通常包括以下步骤:

  • 对年轻代进行垃圾回收,标记和清除无用的对象。
  • 将存活的对象移动到Survivor区,同时根据对象的年龄进行晋升(Promotion)。
  • 清空年轻代的空间,为新的对象分配内存。

YGC通常是比较快速的,因为只需要处理年轻代的对象,而年轻代的对象生命周期较短。

FGC

FGC(Full Garbage Collection):FGC是指对整个堆内存进行的垃圾回收操作。当年轻代和老年代都没有足够的空间来分配新的对象时,会触发FGC。

FGC的过程通常包括以下步骤:

  • 对整个堆内存进行垃圾回收,标记和清除无用的对象。
  • 对存活的对象进行压缩和整理,以减少碎片化。

FGC通常比较耗时,因为需要处理整个堆内存的对象,并且可能涉及到对象的移动和内存的整理。

相关文章:

内存相关知识(新)

基本概念 内存层次结构:内存层次结构是一种层次化的存储设备结构,它包括寄存器、缓存、主存和辅助存储器。每一层次的存储设备都有不同的速度、容量和成本。 内存单元:内存被划分为一系列连续的内存单元,每个单元都有一个唯一的地…...

C++从入门到精通——static成员

static成员 前言一、static成员概念例题 二、 static成员的特性特性例题静态成员函数可以调用非静态成员函数吗非静态成员函数可以调用类的静态成员函数吗 前言 一、static成员 概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之…...

【K8S:初始化】:执行kubeadm显示:connection refused.

文章目录 [root10 kubernetes]# kubeadm init --kubernetes-versionv1.23.0 --image-repositoryregistry.aliyuncs.com/google_containers --apiserver-advertise-address192.168.56.104 [init] Using Kubernetes version: v1.23.0 [preflight] Running pre-flight checks [pre…...

msvcp140_1.dll是什么?找不到msvcp140_1.dll丢失解决方法

msvcp140_1.dll 文件是一个与 Microsoft Visual C 2015 Redistributable 相关的动态链接库(DLL),它在 Windows 系统中扮演着重要角色,尤其对于那些依赖于 Visual C 运行时环境的应用程序和游戏来说。以下是关于 msvcp140_1.dll 文…...

【Java探索之旅】掌握数组操作,轻松应对编程挑战

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、数组巩固练习1.1 数组转字符串1.2 数组拷贝1.3 求数组中的平均值1.4 查找数组中指…...

深入理解同步与异步编程及协程管理在Python中的应用

文章目录 1. 同步与异步函数的对比1.1 同步函数1.2 异步函数1.3 对比 2. 管理多个协程与异常处理2.1 并发执行多个协程2.2 错误处理2.3 任务取消 本文将探索Python中同步与异步编程的基本概念及其区别。还会详细介绍如何使用asyncio库来有效管理协程,包括任务的创建…...

Win10本地更新无法升级win11 的0x80080005解决方法

Win10本地更新无法升级win11 Visual Studio 2022 运行项目时,本文提供了错误“指定的程序需要较新版本的 Windows”的解决方法。 更新时提示:0x80080005 解决方法 1、下载Windows11InstallationAssistant.exe 【免费】Windows11InstallationAssista…...

互联网轻量级框架整合之MyBatis核心组件

在看本篇内容之前,最好先理解一下Hibernate和MyBatis的本质区别,这篇Hibernate和MyBatis使用对比实例做了实际的代码级对比,而MyBatis作为更适合互联网产品的持久层首选必定有必然的原因 MyBatis核心组件 MyBatis能够成为数据持久层首选框&a…...

springboot websocket 持续打印 pod 日志

springboot 整合 websocket 和 连接 k8s 集群的方式参考历史 Java 专栏文章 修改前端页面 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Java后端WebSocket的Tomcat实现</title><script type"text/javasc…...

C代码编译过程与进程内存分布

C代码编译过程 在这篇文章中&#xff0c;我们将探讨C语言代码的编译流程以及进程在运行时的内存布局。编译过程通常包括几个关键步骤&#xff1a;预处理、编译、汇编和链接。 预处理阶段主要是处理源代码文件中的宏定义、头文件包含和条件编译指令。在此阶段&#xff0c;编译…...

Windows 部署ChatGLM3大语言模型

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 硬盘&#xff1a;60G 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部…...

JS相关八股之什么是事件循环

在JavaScript中&#xff0c;“事件循环”&#xff08;Event Loop&#xff09;是一个非常重要的概念&#xff0c;它是指JavaScript引擎如何在单线程中处理异步操作的机制。单线程意味着在任意时刻&#xff0c;JavaScript代码只能执行一个任务。 一.事件循环的工作流程大致如下&…...

SpringCloud集成Skywalking链路追踪和日志收集

1. 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 2. 上传到服务器解压 在Spring Cloud项目中&#xff0c;每部署一个服务时&#xff0c;就拷贝一份skywalking的agent文件到该服务器上并解压。不管是部署…...

HTTP 域名和主机是一回事吗?有了主机和域名,如何建站?

域名不等于主机名&#xff0c;例如baidu.com是一个权威域的域名&#xff0c;但是根本没有一个主机的名字叫做baidu.com,但是dns.baidu.com就是一个主机名&#xff0c;它就是负责baidu.com的服务器的主机名&#xff0c;www.baidu.com也是一个主机名,它是百度web服务器的主机名。…...

运营干货:四个技巧掌握爆款选题方法

在运营工作中&#xff0c;选题是一项至关重要的工作&#xff0c;选对了一个热门话题&#xff0c;就能吸引大量用户的关注和互动&#xff0c;从而取得更好的运营成果。 今天&#xff0c;就给大家分享四个爆款选题方法&#xff0c;让大家的运营更上一层楼&#xff01; 第一种&a…...

柯桥商务口语之怎么样说英语更加礼貌?十个礼貌用语get起来!

当你在国外需要帮助的时候&#xff0c;这些礼貌用语真的是能够帮到你的哦 1.Would/Could you help me? 你可帮助我吗&#xff1f; 相信有些人想请求帮助的时候&#xff0c;一开口就用Can you&#xff0c;这个用在朋友或者熟人上面当然是没有问题的&#xff0c;但是如果是向…...

嵌入式工程师如何摸鱼?

有老铁问我&#xff0c;做嵌入式开发要加班吗&#xff1f; 也不知道搞什么鬼&#xff0c;现在的年轻人对加班这么抵触。 我刚做开发那会&#xff0c;啥也不懂&#xff0c;每天基本都要加班到晚上7-9点不等&#xff0c;我并不抵触加班&#xff0c;因为早早回家&#xff0c;也没什…...

C++语言题库(一)—— 基本知识类

目录 1. Hello World! 2. 据说一个人的标准体重应该是其身高&#xff08;单位&#xff1a;厘米&#xff09;减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高&#xff0c;请你计算其标准体重应该是多少&#xff1f; 3. 给定一个华氏温度F…...

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…...

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…...

手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题

在文章开始之前&#xff0c;先来看一张spring IOC加载过程的脑图吧 Spring IOC的加载过程 首先,当我们去new了一个applicationContext,它底层呢就会把我们配置的bean进行扫描,然后创建成一个一个的beanDefinition放在我们的beanDefinitionMap中,此时就有了一切创造bean的原料信…...

C++11 Thead线程和线程池

参考资料&#xff1a; 2、5.lock_guard 与 std::unique_lock-陈子青的编程学习课堂 (seestudy.cn) 3、C11 多线程编程-小白零基础到手撕线程池_哔哩哔哩_bilibili 一、 C11 Thead线程库的基本使用 # include <thread> std::thread t(function_name, args...); // 线…...

Windows版Apache 2.4.59解压直用(免安装-绿色-项目打包直接使用)

windows下Apache分类 Apache分为 安装版和解压版 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦 解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#x…...

刀具表面上的微结构

刀具表面微结构通常指在刀具表面对特定功能设计的微观纹理&#xff0c;这些纹理可以是沟槽、凹坑、凸起或任何其他形式的微观图案。这些微结构的设计和应用是为了改善刀具的切削性能&#xff0c;减少切削力和切削温度&#xff0c;提高切削效率和精度&#xff0c;同时降低切削液…...

css3实现微信扫码登陆动画

在做微信扫码登陆时&#xff0c;出现一个背景光图上下扫码动画&#xff0c;用css3图片实现。 实现原理&#xff1a; 1.准备一个渐变的背景.png图 2.css动画帧实现动画 看效果&#xff1a; css代码&#xff1a; #wx-scan{position: absolute;top:0px;left: 50%;z-index: 3;ma…...

vue3 导入excel数据

所需包 "xlsx": "^0.18.5"页面导入包 import * as XLSX from xlsx; import {genFileId, UploadProps, UploadRawFile,ElTable } from element-plus;页面 <el-upload accept".xlsx" :on-change"changeExcel" :on-exceed"ha…...

C# linq 根据多字段动态Group by

实现类&#xff1a; public static class LinqHepler {/// <summary>/// 根据单个字段动态Group/// </summary>/// <typeparam name"T"></typeparam>/// <param name"source"></param>/// <param name"prop…...

C语言学习/复习22----阶段测评编程题

一、阶段测评练习 题1&#xff1a; 题2&#xff1a;...

LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】

LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】 题目描述&#xff1a;解题思路一&#xff1a;DFS 中记录节点值的深度和编号&#xff0c;回溯写法。关键点是1 < nums[i] < 50解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1…...

“数据安全服务能力”评定资格认证!不容错过

数据安全服务能力评定是指对数据安全服务提供商从事数据安全服务综合能力的评定&#xff0c;包括技术能力、服务能力、质量保证能力、人员构成与素质、经营业绩、资产状况等要素。 一、能力评定类型与等级 数据安全服务能力分为二个类型&#xff1a;数据安全评估、数据安全建…...

网站建设会员管理系统方案/解析域名网站

SVN中Branch的创建与合并 在使用源代码版本控制工具时&#xff0c;最佳实践是一直保持一个主干版本。但是为了应付实际开发中的各种情况&#xff0c;适时的开辟一些分支也是很有必要的。比如在持续开发新功能的同时&#xff0c;需要发布一个新版本&#xff0c;那么就需要从开发…...

wordpress后台密码忘记/营销宝

优化之路&#xff1a;精简VB程序的代码Java教程    1.标志符名称  2.注释  3.空行  其他元素&#xff0c;如变量、窗体和过程&#xff0c;确实要占用内存的一部分空间&#xff0c;最好将它们精简以使效率更高。当应用程序作为一个.exe文件运行时&#xff0c;有几项技术…...

做外贸网站需要注意些什么手续/搜外友链平台

<?php /*** 创建多进程*/ $worker_num 30; // 默认进程数 $workers []; // 进程保存 $redirect_stdout false; // 重定向输出 ; 这个参数用途等会我们看效果 for($i 0; $i < $worker_num; $i){$process new swoole_proce…...

怎么做自己的优惠券网站/谷歌浏览器直接打开

下面是 SAP 中国的教育培训首页&#xff0c;里面有 SAP 最新最完整的培训教育计划。 http://www30.sap.com/china/services/education/index.epx 从中可以看出&#xff0c;随着 SAP 的发展&#xff0c;BC4xx 系列课程已经发生了很大改变&#xff0c;取消了 BC404、BC406&#x…...

个人申请小程序收费吗/商丘seo外包

12345678#include <stdio.h>#define SOR(x) (x*x)main(){int a,b3; aSOR(b2); printf("%d",a); }出处&#xff1a;http://www.cnblogs.com/zhangdongsheng/ 作者&#xff1a;张东升...

网站做用户记录表/上海seo优化外包公司

对led中所涉及到的几个地址的说明&#xff1a;#define CS1BASE (0x11000000)#define SEGP ((0x100000000x248))#define DIGIP ((CS1BASE0x0800))#define LEDP ((CS1BASE0x0C00)) 上述几个值都是由硬件设计人员给出的。其中&#xff0c; DIGIP 为位寄存器地址&#xff08;总共有…...