内存管理

Memcache内存管理原理

天大地大妈咪最大 提交于 2019-12-02 05:27:15
内存的碎片化 C语言中,直接malloc,free 来向操作系统申请和释放内存时,不断的申请和释放过程中,形成了一些很小的内存片段,无法再利用。这种无法利用内存的现象—称之为内存的碎片化。 Memacache如何克服内存碎片化 memcached 用slab allocator 机制来管理内存。 原理:预先把申请到的内存划分成数个slab class仓库(即不同尺寸的小块) 如下图所示 需要内存时,判断内容大小,为器选择合理的块。 备注:如果选到的块为100byte,而内容为80byte,那么20byte,是无法利用的(即浪费了) , 如果100byte已经满了,不会寻找更大的120byte的仓库存储,会把相应的100byte的仓库中的旧数据剔除掉。 Memcached 增长因子 memcached在启动时,可以通过-f选项指定Growth Factor因子,并在某种程度上控制slab之间的差异。(默认值:1.25) Memcache的删除机制 当某个值过期后,并没有从内存删除,因此,stats统计时,curr_item有其信息 当某个新支去占用他的位置时,当成空chunk来占用 当get值时,判断是否过期,如果过期,返回空,并且清空,curr_item就减少了。 备注:过期,只是用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除。这个称为lazy expiration

python内存管理

僤鯓⒐⒋嵵緔 提交于 2019-12-02 05:00:14
python内存管理 python3.6.9 内存管理的官方文档 https://docs.python.org/zh-cn/3.6/c-api/memory.html 一、变量存哪了? x = 10 当我们在p1.py中定义一个变量 x = 10 ,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU、内存和硬盘。一定不是CPU,那是存放在内存还是硬盘中了呢?我们再回顾变量运行的三个过程,如果我们没有使用python解释器运行p1.py这个文件,那么 x=10 很明显只是很普通的四个字符x、=、1、0。而只有Python解释器运行了这个文件,那字符进入了内存,才会有变量这个概念。也就是说变量是存放在内存当中的。 变量存放在内存中这句话太宽泛了,我们把它具体化。现在想象我们在学校(电脑内存)里上课,学校每开一个班,学校都会开辟一个教室给这个班级上课用(存放变量值10),而班级的门牌号则是(变量名x)。也就是说,对于电脑内存这个大内存,每定义一个变量就会在这个大内存中开辟一个小空间,小空间内存放变量值10,然后内存给这个小空间一个变量名x(门牌号),x指向10。 二、Python垃圾回收机制 对于p1.py,如果我们再加上一段代码 x = 11 ,大内存会开辟另一个小空间存储变量值11,把变量值绑定另一个门牌号x,但是由于之前有x

linux vmstat命令详解

北城以北 提交于 2019-12-02 03:41:47
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat 本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat 输出结果。在学习vmstat命令前,我们先了解一下Linux系统中关于物理内存和虚拟内存相关信息。 物理内存和虚拟内存区别: 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在 linux 下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间( Swap Space )。 作为物理内存的扩展, linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时

聊聊python的内存管理

烈酒焚心 提交于 2019-12-02 01:53:02
对象的内存使用 赋值语句是语言最常见的功能了。但即使是最简单的赋值语句,也可以很有内涵。Python的赋值语句就很值得研究。 <ignore_js_op> 整数1为一个对象。而a是一个引用。利用赋值语句,引用a指向对象1。Python是动态类型的语言(参考动态类型),对象与引用分离。 引用和对象 为了探索对象在内存的存储,我们可以求助于Python的内置函数id()。它用于返回对象的身份(identity)。其实,这里所谓的身份,就是该对象的内存地址。 <ignore_js_op> 在我的计算机上,它们返回的是: 11246696 '0xab9c68' 分别为内存地址的十进制和十六进制表示。 在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。 <ignore_js_op> 上面程序返回 11246696 11246696 可见a和b实际上是指向同一个对象的两个引用。 为了检验两个引用指向同一个对象,我们可以用is关键字。is用于判断两个引用所指的对象是否相同。 <ignore_js_op> 上面的注释为相应的运行结果。可以看到,由于Python缓存了整数和短字符串,因此每个对象只存有一份。比如,所有整数1的引用都指向同一对象。即使使用赋值语句,也只是创造了新的引用,而不是对象本身

Linux内存管理-预备篇(寄存器)

烂漫一生 提交于 2019-12-01 23:33:13
前言(wxy): 说到寄存器,迷迷茫茫好多年,一方面记不住每个寄存器的名称以及作用,另一方面迷惑于寄存器的名称,常常会有一个疑惑就是说道寄存器的种类,怎么各种版本,他们到底什么关系,基本上所有的博客都是直接拷贝别人的,而且也不 说明他们到底什么关系,指示罗列概念,我百度了一下午也没查出个所以然,真TM生气......今天终于解开了这个谜团,原来CPU寄存器分为两类: 用户可见寄存器 ,用户可以对这些寄存器进行编程,还可以通过优化使CPU因使用这类寄存器而减少对主存的访问次数,也就是说我们使用汇编语言可以直接对其操作; 控制和状态寄存器 ,用户不可对其进行编程,他们被控制部件使用,以控制CPU的操作,也可以被带有特权的操作系统程序使用,从而控制程序的执行。 一:控制和状态寄存器 : 参见: https://blog.csdn.net/kwame211/article/details/77773621 CPU中至少要有六类寄存器:指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、数据寄存器(DR)、累加寄存器(AC)、程序状态字寄存器(PSW)。这些寄存器用来暂存一个计算机字,其数目可以根据需要进行扩充。 1. 数据寄存器(Data Register,DR/MDR) 又称 数据/ 指令 缓冲寄存器 数据寄存器用来暂时存放由主存储器读出的一条指令或一个数据字;反之

python的内存管理机制

旧时模样 提交于 2019-12-01 21:48:14
python的内存管理机制分为:引用计数,垃圾回收,内存池。 1.引用计数 python中的对象在被引用时,它的引用计数会增加1,当它不再引用的时候,引用技术会减去1,当对象的引用计数变为0的时候,这个对象就会被删除掉。 2.垃圾回收 当对象的引用计数为0的时候,对象被删掉,对象就成为要被回收的垃圾,对象就可以被垃圾回收。 如果两个对象循环引用,即两个对象的引用计数为一,但只是在两个之间循环引用,这时会进行标记清除,先将循环引用的计数去掉,再得到两个对象的有效计数,再进行垃圾回收。 从前面标记清除这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾回收带来的额外操作就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额外操作。举个例子:当某些内存块 M 经过了 3 次垃圾收集的清洗之后还存活时,我们就将内存块 M 划到一个集合A 中去,而新分配的内存都划分到集合 B 中去。当垃圾收集开始工作时,大多数情况都只对集合 B 进行垃圾回收,而对集合 A 进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。在这个过程中,集合 B 中的某些内存块由于存活时间长而会被转移到集合 A 中,当然,集合 A 中实际上也存在一些垃圾

IOS内存管理

荒凉一梦 提交于 2019-12-01 20:04:17
简介 iOS下内存管理的基本思想就是引用计数,通过对象的引用计数来对内存对象的生命周期进行控制。具体到编程时间方面,主要有两种方式: 1:MRR(manual retain-release),人工引用计数,对象的生成、销毁、引用计数的变化都是由开发人员来完成。 2:ARC(Automatic Reference Counting),自动引用计数,只负责对象的生成,其他过程开发人员不再需要关心其销毁,使用方式类似于垃圾回收,但其实质还是引用计数。 面临的问题 根据苹果说明文档,面临的两个主要问题是: 释放或覆盖的数据仍然在使用。这将造成内存损坏,通常在应用程序崩溃,或者更糟,损坏用户数据。 不释放不再使用的数据会导致内存泄漏。分配的内存,内存泄漏不会释放,即使它从来没有再次使用。泄漏会导致应用程序的内存使用量日益增加,这反过来又可能会导致系统性能较差或死机。 内存管理规则 我们创建自己的对象,当他们不再需要的时候,释放他们。 保留需要使用的对象。如果没有必要必须释放这些对象。 不要释放我们没有拥有的对象。 使用内存管理工具 可以用Xcode工具仪器的帮助下分析内存的使用情况。它包括的工具有活动监视器,分配,泄漏,僵尸等 分析内存分配的步骤 1. 打开一个现有的应用程序。 2. 选择产品,配置文件如下所示 3.在以下界面中选择 Allocations 和 Profile。 4.

Linux内存管理(x86-32位系统)

北慕城南 提交于 2019-12-01 17:12:46
linux内存的管理主要分为两部分,地址管理和存储设备管理。下面针对这两部分介绍一下我对内存管理的理解。 硬件地址的基本概念 DRAM域地址:是DRAM控制器所能访问的地址空间集合。 PCI总线域地址:是PCI设备所能直接访问的地址空间集合。 存储器域地址:是CPU所能访问的地址空间集合。 结合下图对上面概念进行解释: CPU访问DRAM域或PCI总线域地址空间时,都需要进行地址转换(将存储器域地址转换为相应域的地址)。例如:CPU访问DRAM域时,需要进行存储器域地址空间到DRAM域地址空间的转换(由DRAM控制器完成);CPU访问PCI总线域时,需要进行存储器域地址空间到PCI总线域地址空间的转换(由HOST主桥完成)。 在x86处理器系统中,会将DRAM域和PCI总线域映射到存储器域空间中,并且其大多数DRAM域中的地址与存储器域中的地址一一对应而且相等,而存储器域的PCI地址与PCI总线域的地址也一一对应而且相等。它们在存储器域空间的映射彼此独立,互不冲突,映射关系由BIOS提供(e820地址映射表)。 PCI设备访问DRAM域地址空间时,首先要经过HOST主桥将PCI总线域地址转换为存储器域地址,然后再由DRAM控制器将存储器域地址转换为DRAM域地址。 软件地址的基本概念 逻辑地址 ,是一个32位长的地址。所有进程地址都使用逻辑地址。 线性地址(也称为虚拟地址)

操作系统内存管理

走远了吗. 提交于 2019-12-01 17:12:26
1. 引言 2. 内存管理的环境 3. 内存管理的目标 4. 虚拟内存 5. 单道编程的内存管理 5.1 静态地址翻译 在单道编程环境下,整个内存里面只有两个程序: 一个是用户程序和操作系统程序 。由于只有一个用户程序,而操作系统所占用的内存空间是恒定的,我们可以将用户程序总是加载到一个内存地址上。即用户永远从同一个地方开始执行。在这种管理方式下,操作系统永远跳转到同一个地方来启动用户程序。这样用户程序里面的地址都可以事先计算出所有的物理地址。这种在运行前就将物理地址计算好的方式叫做 静态地址翻译。 5.2 内存管理的目的 为了弄清楚是否达到的内存管理的目的,需要从下面几个方面考虑: 首先,地址是否独立 ,即固定地址的内存管理达到地址独立了吗?衡量地址是否独立的判断标准就是看看用户编写程序时是否需要知道该程序将要运行的物理内存的知识,而用户在编写程序时所用的物理内存无须考虑具体的物理内存,即该管理模式下达到了的地址的独立性。那它是如何达到的呢?办法就是将用户程序加载到同一物理地址上。通过静态编译即可完成虚拟地址到物理地址的映射,而这个映射翻译工作可以由编译器或加载器来实现。 其次,物理地址是否得到保护 ,即要看进程是否访问到了其它用户进程的空间,或都别的用户进程是否会访问该进程的地址(进程地址是否允许多用户进行访问)?其实在单道编程的情况下,肯定是不会的。因为

Java内存管理:Java内存区域 JVM运行时数据区

情到浓时终转凉″ 提交于 2019-12-01 15:28:41
Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程、Class文件结构、以及JVM字节码指令。 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些,然后分别介绍它们的特点,并指出给出一些HotSpot虚拟机实现的不同点和调整参数。 1、Java内存区域概述 1-2、C/C++与Java程序开发的内存管理 在内存管理领域,C/C++程序开发与Java程序开发有着完全不同的理念: 1、C/C++程序开发 自己管理内存是一项基础的工作; 自已分配内存,但也得自己来及时回收; 比较自由,但多了些工作量,且容易出现内存泄露和内存溢出等问题; 2、Java程序开发 JVM管理内存,不需要自己手动分配内存和释放内存; 不容易出现内存泄露和内存溢出; 一旦出现问题不容易排查,所以得了解JVM是怎么使用内存; 1-2、Java内存区域与JVM运行时数据区 如上图, Java虚拟机规范定义了字节码执行期间使用的各种 运行时数据区 ,即JVM在执行Java程序的过程中,会把它管理的内存划分为若干个不同的数据区域,包括: 程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池; 从线程共享角度来说,可以分为两类: 1、所有线程共享的数据区 方法区、运行时常量池、java堆;