精华内容
下载资源
问答
  • 内存分配方式内存分配算法

    千次阅读 2018-03-14 20:24:56
    内存分配方式有两种,连续内存分配方式和离散内存分配方式。不同的分配方式又有不同的分配算法。 内存分配算法,其实就是:有一大块空闲的资源,如何合理地分配资源?内存分配的思想可以用到很多其他的领域。比如...

    内存分配方式有两种,连续内存分配方式和离散内存分配方式。不同的分配方式又有不同的分配算法。

    内存分配算法,其实就是:有一大块空闲的资源,如何合理地分配资源?内存分配的思想可以用到很多其他的领域。比如Java虚拟机是如何将内存分配与回收的?再比如文件系统是如何将磁盘块分配与回收的?其本质就是如何把空闲的资源分配出去,分配之后又如何回收?目标就是分配快,回收也快,而且还不浪费。那么,就需要根据资源的特点、以及应用场景做权衡从而选择何种方式进行分配与回收。

    ①连续内存分配方式

    1)固定分区分配

    将内存划分成若干个固定大小的块。将程序装入块中即可。内存划分成各个块之后,块大小不再改变。当然,划分块的方式有:所有的块大小相等;划分的块大小不相等。

    这种方式,在实际的内存分配之前,就已经知道了所有的内存块大小了。

    2)动态分区分配

    需要一个空闲表 或者 空闲链 来记录目前系统中空间的内存区域。在内存分配时,需要查找空间表或空闲链找到一块内存分配给当前进程。

    动态分区分配算法:

    a)首次适应法

    b)循环首次适应法

    c)最佳适应法

    d)最坏适应法

    e)快速适应法

    3)可重定位分区分配

    说白了,就是增加了内存移动的功能。由于若干次内存分配与回收之后,各个空闲的内存块不连续了。通过“重定位”,将已经分配的内存“紧凑”在一块(就类似于JVM垃圾回收中的复制算法)从而空出一大块空闲的内存出来。

    ”紧凑“是需要开销的,比如需要重新计算 地址,这也为什么JVM垃圾回收会导致STW的原因。

    而离散分配方式–不管是分页还是分段,都是直接将程序放到各个离散的页中。从而就不存在“紧凑”一说了。

    连续内存分配方式涉及两种操作:内存分配操作 和 内存回收操作

    ②离散内存分配方式

    内存资源是有限的,程序要运行,必须得加载到内存。如果内存已经满了,而现在又有新的程序要运行,怎么办?—SWAP

    把当前不用的程序(数据)先换出内存,从而就有空间 加载当前需要运行的程序的一部分数据进入内存,这样大大提高了内存的利用率。

    由于牵涉到换入与换出,前面的连续内存分配方式就有点不适用了。因为,最明显的一个问题:对于连续内存分配方式,究竟换出哪部分数据呢?

    而这种只装入部分”数据”就可以使程序运行的机制,就是虚拟存储器的本质。

    1)分页存储管理

    将进程的逻辑地址空间分成若干大小相等的页面;同时,也将物理内存分成相等大小的页面(称为块或frame)。在为进程分配内存时,以块为单位将进程的若干页 可以 装入到内存中多个不邻接的物理块中。

    从上可以看出:“离散” 体现在:进程在内存中分配的空间(物理块)是不连续的。而对于连续分配方式,进程在内存的分配的空间是连续的。

    现在考虑32位系统,每个物理块的大小为4KB。如何把逻辑地址 转换成 物理地址?

    对每个进程而言,都有着自己的页表。页表的本质就是逻辑地址到物理地址的映射。

    分页存储中的逻辑地址的结构如下:

    这里写图片描述

    1)由于进程的逻辑页面大小与物理块(页帧)大小相同,故都为4K,因此需要12个位表示4K的大小(2^12=4K),即图中的【0-11】

    2)【12-31】表示的是页号。一共有20个位表示页号,也即:对于一个进程而言,一共可以有1M(2^20=1M)个页。

    3)每个进程的逻辑地址空间范围为0-2^32-1,因为:每个页大小为4K,一共有1M个页。故进程可用的逻辑空间为2^32B

    逻辑地址到物理地址的转换需要用到页表。具体细节是有一个“地址变换机构”,它有一个寄存器保存页表在内存的起始地址 以及 页表的长度。

    上面提到,一个进程最多可以有1M个页,故页表就有1M个页表项。假设每个页表项只有1B,那页表的大小也有1MB,所以:一般而言,页表也是很大的,不能全放在寄存器中,故页表也是存储在内存中的。(有些机器有“快表”,快表就是一个寄存器,它保存了页表中的部分表项);其次,也可以使用多级页表以解决单个页表太大的问题。

    那现在给定一个逻辑地址,怎么知道其物理地址呢?

    ①将【12-31】位的页号与 页表的长度比较。页号不能大于页表长度,否则越界。

    ②根据页号 找到 该页号所在的页表项,即该页号对应着哪个页表项。因为,页表项里面就存放着物理地址。

    那如何查找页表项呢?将页号乘以页表项的长度(每个页表项,其实就是一个逻辑的页 到 物理页 的映射信息),就知道了该逻辑页对应着哪个页表项(根据页号匹配页表项一般是由硬件完成的)

    然后,正如前面提到,页表也是保存在内存中的,故需要页表的内存始址(这是也为什么地址变换机构 保存 页表在内存的起始地址的原因),将页表始址 与 上面的乘积相加,就得到了该逻辑页对应的页表项的物理地址。读这个页表项的物理地址中的内容,就知道了该逻辑页对应的物理块地址(物理地址)。从而,就完成了逻辑地址到物理地址的转换。

    从上面可以看出,CPU每存取一个数据时,需要两次访问主存。一次是访问页表项的物理地址,得到了数据的物理块地址。第二次拿着物理块地址去取数据。

    在分页存储管理方式下:由于取一个数据,需要二次访存,CPU处理速度降低了一半,正由于这个原因:引入了“快表”(又称TLB(Translation Lookaside Buffer)),快表是个寄存器,用来保存那些当前访问过的页表项。从而,读页表项时,不需要再访存了,而是直接从寄存器中读取。

    虚拟存储器

    谈到虚拟存储器,总是说它从逻辑上扩充了内存的容量,why?

    内存是有限的,作业初始时保存在磁盘上的,如果要运行,必须得将相应的程序(数据)加载到内存中。那如果要运行的作业特别多,无法一下子装入内存,怎么办?

    一种方式是加内存条,这是从物理上扩充内存的容量。

    另一种方式是:先把作业的一部分程序(数据)装入内存,先让它运行着,运行过程中发现: 咦,我还需要其他的数据,而这些数据还未装入内存,因此就产生中断(缺页中断)再将数据加载到内存。

    采用这种方式,系统一次就可以将很多作业装入内存运行了。这时,从物理上看,内存还是原来的大小,但是它能运行的作业多了,因此说从逻辑上扩充了内存。

    将虚拟存储器这种思想与分页存储管理结合,一次只将作业的部分页面加载到内存中,形成了一个强大的内存分配与管理系统了。引入了虚拟存储器,同样需要有页表,记录逻辑地址到物理地址的映射,只不过此时的页表更复杂了,因为,有些页可能还在磁盘上。;还需要有缺页中断处理机构,因为毕竟只将一部分数据装入内存,会引起缺页中断嘛,就需要处理中断嘛;还需要地址变换机构,这里的地址变换机构功能更多,因为需要处理中断情况下的地址变换。

    转载自:https://www.cnblogs.com/hapjin/p/5689049.html

    展开全文
  • 上面可以看到bean1和bean4对象不同但是他们的hash值和equals所以没有储存进去,他的删除方式也是一样,先根据hash值去找相应的区域,再比较equals 1.3内存的泄露问题 当我们已经把对象储存到...

    1.HashSet

    单链表集合框架中,有两大体系,一个是Set,一个是List,简单来说一个是线性的一个是非线性的

    1.1 LinkedList,ArrayList,HashSet

    ArrayList:集合的升级版(顺序表)

    从上面可以看到我们初始化一个ArrayList对象就会包装一个长度为10的Object的数组
    LinkedList :链式表
    这上面我们可以看出来这个是通过内部类封装Node,以及通过泛型来实现保存对象
    ArrayList我们去查找已经保存的对象根据索引查找会特别快,而LinkedList由于是链式结构,只能保存下一个和上一个的信息,所以查找会相对比较慢,但是ArrayList的删除和增加会特别慢,由于删除或则增加一个对象会影响后面所有对象的位置,而LinkedList进行删除或者增加只会影响他前面和后面的对象
    HashSet:简单来说就是顺表表(数组)加上链式表

    而它的具体功能的实现是靠着HashMap的实现

    1.2HashSet到底怎么储存

    HashSet它进行储存对象时,先根据对象的hash值来确定它的位置区域,然后通过equals去和相同hash值的对象去比较,如果为true则不进行储存,如果是false,则进行链式储存,为什么要这样来进行储存呢?由于HashSet储存的是不同的对象,假设已经有了1000个对象,再添加一个对象,我们需要比较一千次,极为麻烦,我们可以直接的通过hash值和equals来比较是否对象满足我们相同的条件


    上面可以看到bean1和bean4对象不同但是他们的hash值和equals所以没有储存进去,他的删除方式也是一样,先根据hash值去找相应的区域,再比较equals

    1.3内存的泄露问题


    当我们已经把对象储存到hashSet对象后,如果我们改变属性值(这个属性值影响hash值),导致我们在hashSet对象找不到相应的对象最后导致内存溢出,因为对象无法被清理(有对应的指针)。
    因为改变了属性找不到对应的hash值,而确定不了对象的位置

    展开全文
  • c语言的内存读取方式

    千次阅读 2019-09-20 17:09:20
    大部分设备(除了军用等对时间控制要求极高的设备)是高位(位越高,数越大)高阶码(数据在内存中地址)存储。计算机读取方式是从右往...1000 0000 0000 0000 0000 0000 0000 0000(内存保存的值,从右往左读) 按照一...

    大部分设备(除了军用等对时间控制要求极高的设备)是高位(位越高,数越大)高阶码(数据在内存中地址)存储。计算机读取方式是从右往左。(暂时不加入补码的知识)
    例:int a = 1;(十进制)
    二进制数据 0000 0000 0000 0000 0000 0000 0000 0001
    1000 0000 0000 0000 0000 0000 0000 0000(内存中保存的值,从右往左读)
    按照一个字节从右往左读取,所以为(16进制) 00 00 00 01。

    展开全文
  • C语言内存分配方式

    千次阅读 2011-01-27 21:59:00
    C语言内存分配方式 C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等

    C语言内存分配方式
      (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
      (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
      (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多
      C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等.
      其中alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.
      calloc则将初始化这部分的内存,设置为0. 而realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放. 而sbrk则是增加数据段的大小;
      malloc/calloc/free基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存.如果程序 malloc的大小超出了库里所留存的空间,那么将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不立即返回给os, 而是保留在内部结构中. 可以打个比方: brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求.这套机制类似于缓冲.
      使用这套机制的原因: 系统调用不能支持任意大小的内存分配(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对于小内存的分配会造成浪费; 系统调用申请内存代价昂贵,涉及到用户态和核心态的转换. 函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。
      malloc()函数有一个参数,即要分配的内存空间的大小:
      Void *malloc(size_t size);
      calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小:
      void*calloc(size_t numElements,size_t sizeOfElement);来源:考的美女编辑们
      如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。
      malloc() 函数和calloc()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。
      calloc() 函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。来源:
      malloc() 函数和calloc()函数的另一点区别是calloc()函数会返回一个由某种对象组成的数组,但malloc()函数只返回一个对象。为了明确是为一个数组分配内存空间,有些程序员会选用calloc()函数。但是,除了是否初始化所分配的内存空间这一点之外,绝大多数程序员认为以下两种函数调用方式没有区别:
      calloc(numElements ,sizeOfElement);
      malloc(numElements *sizeOfElement) ;
      需要解释的一点是,理论上(按照ANSIC标准)指针的算术运算只能在一个指定的数组中进行,但是在实践中,即使C编译程序或翻译器遵循这种规定,许多C 程序还是冲破了这种限制。因此,尽管malloc()函数并不能返回一个数组,它所分配的内存空间仍然能供一个数组使用(对realloc()函数来说同样如此,尽管它也不能返回一个数组)。来源:www.examda.com
      总之,当你在calloc()函数和malloc()函数之间作选择时,你只需考虑是否要初始化所分配的内存空间,而不用考虑函数是否能返回一个数组。
      当程序运行过程中malloc了,但是没有free的话,会造成内存泄漏.一部分的内存没有被使用,但是由于没有free,因此系统认为这部分内存还在使用,造成不断的向系统申请内存,是的系统可用内存不断减少.但是,内存泄漏仅仅指程序在运行时,程序退出时,OS将回收所有的资源.因此,适当的重起一下程序,有时候还是有点作用.

    展开全文
  • Android 查看进程内存方式

    千次阅读 2018-02-06 22:28:27
    查看Android系统,单个进程、多个进程内存的使用情况,通常有那些方法: 1,通过Android API函数 使用ActivityManager查看可用内存,具体是其内部类MemoryInfo。 ActivityManager.MemoryInfo memInfo = new ...
  • 我们要想了解基本数据类型在内存中的储存方式就必须先要知道这些数据类型在内存在所占的字节数,但c的标准中并没有对此具体规定。而且这个也与操作系统和编译器有关,比如同样是int类型的数据在不同的编译器中有4和2...
  • c++内存分配方式

    万次阅读 2012-09-07 15:41:02
    内存的堆分配和栈分配 堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。...
  • 日常调试时发现一个问题,感觉与浮点数在内存中的存储方式有关,但又不知道其中的规律,还请大牛进行讲解。 简单的验证代码如下: int main(int argc, const char * argv[]) { // insert code here... double x_1 ...
  • BMP位图格式的内存存储方式

    千次阅读 2017-05-15 14:52:56
    最近在捣鼓Kinect 存储的 raw data,使用 kinect输出并保存红外数据流 ColorImageFormat.InfraredResolution640x480Fps30。其红外数据流的像素格式指定为 PixelFormats.Gray16,但使用C#图像保存接口后,保存的BMP...
  • 操作系统内存管理内存空间的连续分配方式1.概述、分类内存空间的连续分配方式,是指为一个用户程序(作业)分配一个连续的内存空间。 按照内存空间划分方式的不同可将连续分配方式划分为以下四种方式: 1. 单一...
  • 内存管理方式:页存储、段存储、段页存储非连续分配管理方式允许一个程序分散地装入到不相邻的内存分区,根据分区的大小是否固定分为分页式存储管理方式和分段式存储管理方式。分页存储管理方式中,又根据运行作业时...
  • 数据在内存中存储方式

    千次阅读 2017-04-01 17:04:43
    不同操作系统对内存的使用方式不同,linux系统,程序执行是从硬盘动态加载到内存执行,执行完成后给硬盘保存。 嵌入式vxWorks系统属于静态加载方式,程序直接全部装载在内存去运行,对于这种处理方法,理论上运行...
  • 数据在内存中的存储方式

    千次阅读 2018-09-18 15:15:16
    32位系统中char,int型数据在内存中的存储方式 计算机中存储整型类数据采用的是补码。 正数的补码与原码相同,负数的补码=反码+1 。 反码:符号位不动,数值位按位取反。 符号位:1表示负数,0表示正数 char也是一...
  • double数据的内存存储方式

    万次阅读 2017-04-12 18:41:32
     任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 111
  • JS的内存泄露及处理方式

    千次阅读 多人点赞 2019-04-23 09:14:17
        应用程序不再需要占用内存的时候,由于某些原因,内存没有被操作系统或可用内存池回收,就叫做内存泄漏(memory leak) 内存的生命周期 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们...
  • 窥探opencv中的内存管理方式(之一)

    千次阅读 2013-08-18 08:33:17
    本文通过阅读../module/core/alloc.cpp源文件(opencv 2.4.4版本),来一探opencv中的内存管理方式。需要说明的是,上述源文件中包含了两种管理方式,而opencv目前只使用了其中一种最简单的方式,本文只对这种简单的...
  • Tomcat 内存溢出对应解决方式

    万次阅读 2018-06-21 11:18:11
    1.Tomcat内存溢出的原因 ...造成内存溢出是不一样的,当然处理方式也不一样。  这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况: OutOfMemoryError: Java heap sp...
  • JavaScript内存泄露的4种方式及如何避免

    万次阅读 多人点赞 2018-05-16 15:33:17
    简介 内存泄露是每个开发者最终都要面对的...编程语言管理内存方式各不相 同。只有开发者最清楚哪些内存不需要了,操作系统可以回收。一些编程语言提供了语言特性,可以帮助开发者做此类事情。另一些则寄希望于...
  • JVM内存溢出的方式

    千次阅读 2012-08-29 16:18:48
    了解了Java虚拟机五个内存区域的作用后,下面我们来继续学习下在什么情况下 这些区域会发生溢出。 1.虚拟机参数配置 -Xms:初始堆大小,默认为物理内存的1/64( -Xmx:最大堆大小,默认...
  • 内存的管理方式有哪些

    千次阅读 2016-03-14 16:27:11
    内存是操作系统的重要部分。操作系统中的内存管理指的是操作系统中管理内存使用的功能。主要包括向用户程序提供内存逻辑地址,并完成逻辑地址到物理地址的转换,完成用户...1.无管理方式是指内存不划分为系统区和用户
  • 全面理解Java内存模型

    万次阅读 多人点赞 2016-09-21 18:39:21
    JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量...
  • java 获取内存dump 的几种方式

    万次阅读 2017-09-19 19:19:32
    1、获取内存详情:jmap -dump:format=b,file=e.bin pid 这种方式可以用 jvisualvm.exe 进行内存分析,或者采用 Eclipse Memory Analysis Tools (MAT)这个工具 2. 获取内存dump: jmap -histo:live pid 这种方式...
  • 首先必须得明白,在计算机中,任何文件、图片、视频等都是以二进制格式储存储存介质中的一串编码,对于二进制数的每一位称作1bit(比特)。这里必须得再说一下,byte(字节)和bit(比特)不是同一个东西,1byte=...
  • 原来的处理方案是,C++处理图片后,保存图片到磁盘上,VB.NET再从磁盘上进行读取。 现在想对这个方案进行优化。vb端先新建内存映射文件,再调用C++对图片进行处理,处理后的结果写入vb建好的内存映射文件,然后vb端...
  • C语言 内存分配方式 malloc() 与 alloc()

    千次阅读 2016-08-12 22:25:23
    内存分配方式一般有以下几种: (1) 从静态存储区域分配。 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2) 在栈上创建。 在执行函数时,函数内...
  • (1)十进制负数是以其补码储存内存上。 验证:求-8在内存上以二进制形式1的个数 思路是:拿变量,令值为1,与-8的二进制码的每一位做与运算,若与运算结果为1,则该位为1。 代码: int NumberOf1(int n) { ...
  • 一、什么是内存泄漏(memory leak)? 参考阮一峰老师博客:http://www.ruanyifeng.com/blog/2017/04/memory-leak.html 不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。 程序的运行需要内存。只要...
  • 对于一个程序要运行,涉及到的内存分配是一个首要问题,这里简单说一下一个简单的程序运行所涉及到的内存分配方式。另外,在数据结构中存在堆和栈的概念,栈是一种先进后出的数据结构,堆则是一种排序方式,而在内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 968,271
精华内容 387,308
关键字:

内存的储存方式