内存管理

ucosii内存管理代码的分析

纵饮孤独 提交于 2019-11-27 20:44:14
1.ucosii内存管理的简易原理 ucosii的内存管理,采用的是如下方式,先分成若干个partitions,每个partitions再分成若干个blocks,每个blocks可以划分成若干大小的blksize(ucosii中,对blocksize的缩写)。使用时,通常在task中定义一个局部二维数组作为内存管理的“载体”,这个局部二维数组就是1个partitions,数组的行数是blocks,数组的列数是blksize,局部二维数组完美契合了ucosii中内存管理的特性。 2.ucosii内存管理的代码分析 ucosii的内存管理中使用了二维指针来进行链表的构建,与“正常”的链表有点区别,本文对ucosii中的易混淆的点和重点进行分析。 (1)OSMemFreeList在内存管理的代码中用了“两次”? 在ucosii.h中,有如下定义: OS_EXT OS_MEM *OSMemFreeList; /* Pointer to free list of memory partitions */ 有如下声明 typedef struct os_mem { /* MEMORY CONTROL BLOCK */ void *OSMemAddr; /* Pointer to beginning of memory partition */ void *OSMemFreeList; /*

Java内存管理

霸气de小男生 提交于 2019-11-27 19:23:08
Java内存管理 Java运行时内存区 其中,对于这各个部分有一些是线程私有的,其他则是线程共享的。 线程私有的如下: 程序计数器当前线程所执行的字节码的行号指示器 Java虚拟机栈Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧,存储局部变量表、操作栈、动态链接、方法出口等信息。 每个线程都有自己独立的栈空间 线程栈只存基本类型和对象地址 方法中局部变量在线程空间中 本地方法栈Native方法服务。在HotSpot虚拟机中和Java虚拟机栈合二为一。 线程共享的如下: Java堆存放对象实例,几乎所有的对象实例以及其属性都在这里分配内存。 方法区存储已经被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。 运行时常量池方法区的一部分。用于存放编译期生成的各种字面量和符号引用。 直接内存NIO、Native函数直接分配的堆外内存。DirectBuffer引用也会使用此部分内存。 对象访问 Java是面向对象的一种编程语言,那么如何通过引用来访问对象呢?一般有两种方式: 1.通过句柄访问 2.直接指针(此种方式也是HotSpot虚拟机采用的方式) 内存溢出 在JVM申请内存的过程中,会遇到无法申请到足够内存,从而导致内存溢出的情况。一般有以下几种情况: 虚拟机栈和本地方法栈溢出 StackOverflowError: 线程请求的栈深度大于虚拟机所允许的最大深度

Java内存管理机制

时间秒杀一切 提交于 2019-11-27 16:56:12
对于从事 C/C++ 程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的帝皇,又是从事最基础工作的劳动人民——既拥有每一个对象的“所有权”,又担负着每一个对象生命从开始到终结的维护责任。 对于 Java 程序员来说,在虚拟机的自动内存管理机制的帮助下,不在需要为每一个 new 操作去写配对的 delete/free 代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过也正是因为 Java 程序员把内存控制权交给了 Java 虚拟机,一旦出现内存泄漏和溢出的问题,如果不了解虚拟机怎样使用内存的,那排查错误将会成为一项异常艰难的工作。 1. 什么是 JVM? JVM(Java 虚拟机)是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM 有自己的硬件架构,如处理器、堆栈、寄存器等,还有对应分指令系统。 假如一个程序使用的内存区域是一个货架,那 JVM 就相当于是一个淘宝店铺,它不是真实存在的货架,但它和真实货架一样可以上架和下架商品,而且上架的商品数量也是有限的。 假如货架是在深圳,那 JVM 的平台无关性就相当于是客人可以在各个地方购买你在淘宝上发布的商品,不是只有在深圳才能购买货架上的商品。 2. 什么是 Java 内存模型? Java

内存管理学习(三)【转载】

喜欢而已 提交于 2019-11-27 16:11:55
Vulkan STL的内存管理 SGI STL 的内存管理 http://www.cnblogs.com/sld666666/archive/2010/07/01/1769448.html 1. 好多废话 在分析完nginx的内存池之后,也想了解一下C++的内存管理,于是就很自然得想到STL。 STL是一个重量级的作品,据说当时的出现,完全可以说得上是一个划时代意义的作品。 泛型、数据结构和算法的分离、底耦合、高复用… 啊,废话不多说了,再说下去让人感觉像 王婆卖瓜了。 啊,还忘了得加上两位STL大师的名字来聊表我的敬意了。泛型大牛Alexander Stepanov 和 Meng Lee(李梦--让人浮想的名字啊)。 2. SLT 内存的分配 以一个简单的例子开始。 #include <vector> #include <algorithm> using namespace std; void print( int elem) { cout << elem << ' '; } int main() { vector<int> vec; for (int i = 0; i != 10; ++i) vec.push_back(i); for_each(vec.begin(), vec.end(), print); //请允许我卖弄一点点小特性 cout << endl; return

虚拟内存

扶醉桌前 提交于 2019-11-27 16:08:28
首先先了解下计算机的存储结构: 虚拟内存是借助二级存储空间来扩大一级存储空间的机制。 DRAM是VM系统(虚拟存储器系统)在主存中的缓存,他在主存中用在缓存虚拟页。 SRAM是CPU和主存之间的高速缓冲,CPU从主存中取指。 CPU先在SRAM中查找,如果不命中,则在DRAM中查找,如果再次查找失败,则通过页面置换,从磁盘中读取数据。由于IO操作开销很大,所以DRAM命中失败的开销更大。当CPU需要从磁盘中查找DRAM未命中的数据时,需要借助MMU(内存管理单元)来获取数据在磁盘中的位置,MMU完成物理地址到虚拟地址的转换,数据在磁盘中的地址就是虚拟地址。 数据一般按页存储,一个页面一般是4~8KB。 虚拟地址(VA),假设其范围是[0,1,2......N-1],N=2^n,N的单位为字节,那么这个虚拟地址就叫做一个n位地址空间。32/64位操作系统具有的虚拟内存空间大小分别是2^32和2^64。 虚拟存储器(VM)就是一个存储在磁盘上的N个连续字节大小的单元。每个字节都是一个唯一的虚拟内存地址。操作系统将VM分割成虚拟页大小的块。 物理存储器被分割成物理页(PP),大小也为字节。 虚拟页(VP)有三种状态: 1)未分配虚拟页:在页表中不存在对该虚拟页的记录; 2)已缓存虚拟页:在页表中有记录,且在物理存储器中已经分配了页面; 3)未缓存虚拟页:在页表中有记录

Python中的内存管理机制

♀尐吖头ヾ 提交于 2019-11-27 14:36:52
Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自动的内存管理。它使用引用计数机制检测为对象分配的内存是否可以被释放。然后,在Python中内存永远不会返还给操作系统,Python会持有这些内存并在需要时重新使用它们。在很多场景下,这个特性可以减少内存申请和释放所带来的性能损耗;但对于需要长时间运行的Python进程来讲,Python将会占用大量的内存。如果进程使用内存的峰值远大于平均值,这将会造成内存的浪费从而影响本进程甚至是系统中其他进程的性能。 2.Pymalloc Python使用pymalloc管理内存。在Python中,会频繁的创建和删除很多小对象,如果这些对象的内存申请和释放都使用malloc()和free(),将会带来严重的性能问题。因此,pymalloc分配一系列256KB内存块,称之为arena。每个arena分割为4KB大小的内存池Pool,每个Pool在切分为固定大小的Block。在内存分配时,分配给进程的就是这些Blocks。 3.内存分配 上图中展示了一个usedpool数组,此数组按内存大小组织,每个大小对应一个pool链表,每个pool链表中有多个空闲的Block。在分配内存时

Python内存管理机制

試著忘記壹切 提交于 2019-11-27 14:36:07
Python的内存管理机制 : 引入计数 、 垃圾回收 、 内存池机制 一、变量与对象 关系图如下: 1、变量 ,通过变量指针引用对象   变量指针指向具体对象的内存空间,取对象的值。 2、对象 ,类型已知,每个对象都包含一个头部信息( 头部信息:类型标识符和引用计数器) 注意:    变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。 In [32]: var1=object In [33]: var2=var1 In [34]: id(var1) Out[34]: 139697863383968 In [35]: id(var2) Out[35]: 139697863383968 PS:id()是python的内置函数,用于返回对象的身份,即对象的内存地址。 In [39]: a=123 In [40]: b=a In [41]: id(a) Out[41]: 23242832 In [42]: id(b) Out[42]: 23242832 In [43]: a=456 In [44]: id(a) Out[44]: 33166408 In [45]: id(b) Out[45]: 23242832 3、引用所指判断   通过is进行引用所指判断,is是用来判断两个引用所指的对象是否相同。 整数 In [46]: a

python的内存管理机制

前提是你 提交于 2019-11-27 14:35:46
先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一、垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为 动态类型 的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。 二、引用计数: Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对对象的引用的计数。如图所示(图片来自Python核心编程) 、 x = 3.14 y = x 我们首先创建了一个对象3.14, 然后将这个浮点数对象的引用赋值给x,因为x是第一个引用,因此,这个浮点数对象的引用计数为1. 语句y = x创建了一个指向同一个对象的引用别名y,我们发现,并没有为Y创建一个新的对象,而是将Y也指向了x指向的浮点数对象,使其引用计数为2. 我们可以很容易就证明上述的观点: 变量a 和 变量b的id一致(我们可以将id值想象为C中变量的指针). 我们援引另一个网址的图片来说明问题:对于C语言来讲,我们创建一个变量A时就会为为该变量申请一个内存空间,并将变量值 放入该空间中

C——内存管理1

空扰寡人 提交于 2019-11-27 14:15:48
array limitations: the size of the array must be known beforehand the size of the array cannot be changed in the duration of your program So there comes Dynamic memory allocation : Dynamic memory allocation in C is a way of circumventing these problems. The standard C function malloc function 定义在 stdlib.h or malloc.h 中,取决于你使用的操作系统。 Malloc.h contains only the definitions for the memory allocation functions and not the rest of the other functions defined in stdlib.h.Usually you will not need to be so specific in your program, and if both are supported, you should use <stdlib.h>, since that is

unity内存管理(转)

℡╲_俬逩灬. 提交于 2019-11-27 12:54:44
转自: https://www.cnblogs.com/zsb517/p/5724908.html Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。 Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的。 其实场景里所有静态的对象也有这么一个加载过程,只是Unity3D后台替你自动完成了。 详细说一下细节概念: AssetBundle运行时加载: 来自文件就用CreateFromFile(注意这种方法只能用于standalone程序)这是最快的加载方法 也可以来自Memory,用CreateFromMemory(byte[]),这个byte[]可以来自文件读取的缓冲,www的下载或者其他可能的方式。 其实WWW的assetBundle就是内部数据读取完后自动创建了一个assetBundle而已 Create完以后,等于把硬盘或者网络的一个文件读到内存一个区域,这时候只是个AssetBundle内存镜像数据块,还没有Assets的概念。 Assets加载: 用AssetBundle.Load(同Resources.Load)