专题:Linux内存管理专题 关键词:内核内存布局图.lowmem线性映射区.kernel image.ZONE_NORMAL.ZONE_HIGHMEM.swapper_pg_dir.fixmap.vector.pkmap. 内核内存布局图对于理解内存管理至关重要,有了布局图对于理解内存管理初始化,以及虚拟内存,各种内存分配都有辅助作用. 所以可以用一张图来总领,然后逐个介绍每一段的来历,作用等等. 内核内存布局图和内存管理框架图是不同视角的内存管理框图,还包括后面介绍的用户空间内存布局图. 1…
Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches   Slab内存管理机制 SLUB内存管理机制 http://wenku.baidu.com/view/dd677d2fcfc789eb172dc868.html http://bbs.chinaunix.net/thread-3759086-1-1.html http://bbs.chinaunix.net/forum.php?mod=viewthread&ti…
Win3内存管理之私有内存跟共享内存的申请与释放 一丶内存简介私有内存申请 通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存. 私有内存的意思就是这块内存申请只在本进程的物理页当中. 共享内存就是这个物理页 A B两个进程都可以使用. 私有内存申请API VirtualAlloc / virtualAllocEx LPVOID VirtualAlloc( LPVOID lpAddress, 你要申请的地址.可以指定地址.…
垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(三)终结器 前言 .Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态.然而,你也许想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述. 同一时候,还将讨论GC的内存清理流程及什么时清理.怎么样强制清理.…
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a)下面是一些简单的使用参数 其中最后一个是一个运行时参数设置的简单实例.一般-XX是系统级别的配置(日志信息,或者是配置使用什么样的垃圾回收器等等),后面跟上+表示启用.不是-XX基本上是对于应用层面的配置信息 下面是一个简单的实例:表示设置初始堆大小为5M,最大堆大小为20M,并将虚拟机的参数设置打印出来,后…
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(三)终结器 前言 .Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述.同一时候.还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 内…
转自:http://blog.chinaunix.net/uid-25909619-id-4491362.html 1,linux内存管理中几个重要的结构体和数组 page unsigned long flags 一组标志,也对页框所在的管理区进行编号 atomic_t _count 该页被引用的次数 atomic_t _mapcount 页框中页表项数目,如果没有则为-1 struct list_head lru 管理page忙碌/空闲链表(inactive_list/active_list)…
专题:Linux内存管理专题 关键词:mm.vaddr.VMA.page.pfn.pte.paddr.pg_data.zone.mem_map[]. 1. 内存管理数据结构的关系图 在大部分Linux系统中,内存设备的初始化一般是在BIOS或bootloader中,然后把DDR的大小传递给Linux内核.因此从Linux内核角度来看DDR,其实就是一段物理内存空间. 1.1 由mm数据结构和虚拟地址vaddr找到对应的VMA extern struct vm_area_struct * find…
3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _count;//该页框的引用计数,该引用计数为-1时表示该页框是个空闲页框 atomic_t _mapcount;//页框在页表项中的数目,即该页框在多少个页表中被引用为页表 项 unsigned long private;//可用于多种内核成分,若该页为缓冲区所组成的页,其用来组 织缓冲区首部链表 str…
专题:Linux内存管理专题 关键词:DataAbort.fsr.pte.backtrace.stack.   在内存相关实际应用中,内存异常访问是一种常见的问题. 本文结合异常T32栈回溯.Oops打印以及代码,分析打印log,加深对Oops的理解,有助于快速定位问题解决问题. 1. 不同类型异常处理 当内存访问异常时,触发__dabt_svc异常向量处理,进入do_DataAbort进行处理. 从_dabt_svc到do_DataAbort流程,可以参考do_DataAbort. 从do_D…
最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L…
1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本文将主要以X86架构为例来介绍物理地址空间的管理. 请页机制可以为进程请求物理内存,如下将讲述物理内存在内核中如何管理和分配的 2.内核虚拟空间的划分 图 内核空间的划分图示 在IA-32体系结构上,内核空间的地址范围是PAGE_OFFSET~4G 内核空间的第一部分试图将物理内存的全部空间线性映射…
http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料.此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同.…
自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存包括以下几个运行时数据区域[虚拟机内存模型]: 1.程序计数器: 可以看作是当前线程所执行的字节码的行号指示器.在虚拟机中,字节码解释器工作时就是通过程序计数器的值来选择下一条需要执行的字节码指令.Java虚拟机中多线程是通过线程轮流切换并分配处理机执行时间的方式实现的,在任何一个确定的时刻,一个处…
参考自:http://blog.csdn.net/wpf_ml/article/details/7759911 1. 内存,Cache,寄存器内存:通常计算机将数据存放在物理内存,cache及寄存器中.与其它两个数据存储方式相比,内存是比较大的.每个内存单元是通过内存地址来访问的并且内存单元是必须是联系的.不同的体系架构内存管理方式不同,在一些系统架构中部分内存用业访问物理设备(这种方式叫做内存映射I/O).Cache: 是一个小型的内存,一级Cache直接存放在CPU中,或是二级Cache存放…
说明   要学习Java或者任意一门技术,我觉得最好的是从官网的资料开始学习.官网所给出的资料总是最权威最知道来龙去脉的.而Java中间,垃圾回收与内存管理是Java中非常重要的一部分.<Hotspot内存管理白皮书>是了解Java垃圾收集器最权威的文档.相比于其他的一些所谓翻译文章,本文的翻译更加准确,通顺和全面.在翻译的过程中如果出现一些问题,如果出现问题或者表述不清楚的地方,可以直接在评论区评论. 1.简介    JavaTM 2 Platform, Standard Edition (…
一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄漏和内存溢出的问题.显然,这里的不容易只是相对而言的,如果我们想要降低这种代码隐患的发生,就需要对Java虚拟机怎样使用内存有了解,这样的话就算产生错误,排查起来也会相对容易.下面我们来说一说JVM运行时数据区域 1.程序计数器(PC寄存器): 被看作是当前线程所执行的字节码的行号指示器,字节码解析…
基本概念 基本硬件 CPU可以直接访问的通用存储只有内存和处理器的内置的寄存器.机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数.所以执行指令以及指令使用的数据,应在这些可执行访问的存储设备上,如果数据不在内存中,那么在CPU使用他们之前应把数据移到内存上. CPU内置寄存器通常可以在一个CPU时钟周期内完成访问,但是对于内存,完成内存的访问可能需要多个CPU时钟周期,这种结果造成的影响就是如果没有数据用于完成正在执行的指令,那么CPU可能将会多次中断(暂停).所以需要在CPU和内存之间…
建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fno-objc-arc 刚开始学习Objective-c编程的朋友都希望学习内存管理,但Xcode4.6.3以后的版本就没有了Automatic Reference Counting  (ARC)选项,自动内存管理怎样关闭成为新手学习内存管理之前一定要做的事,本文就讲解一下怎样关闭自动内存管理(ARC…
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些,然后分别介绍它们的特点,并指出给出一些HotSpot虚拟机实现的不同点和调整参数. 1.Java内存区域概述 1-2.Java内存区域与JVM运行时数据区 如上图, Java虚拟机规范定义了字节码执行期间使用的各种运行时数据区,即JVM在执行Java程序的过程中,会把它管理的内存划分为若干个不同的数…
一.基本简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切 ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器.因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化 二.基本原理 1.规则 ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存…
一.基本原理 1.什么是内存管理 内存管理的重要性: 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量等 管理范围:任何继承了NSObject的对象,对其他基本数据类型(int.char.float.double.struct.enum等)无效 2.什么是引用计数器 每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,即有多少人正在使用这个OC对…
分段 基本方法 分段就是基于用户视图的内存管理方案.逻辑地址空间是由一组段构成的,每个段都有名称和长度.地址指定了段名称和段内偏移.因此用户通过两个量来指定地址:段名称和段偏移. 为了简单,进行对段的编号,是通过段号而不是段名称来引用的,所以逻辑地址由有序对组成:<段号,偏移>. 分段硬件 用户是通过二位地址来引用程序内的对象的,但是实际物理内存仍然是一维的字节序列.所以我们需要定义一个实现方式,用来映射用户定义的二维地址到一维的物理地址.这个地址是通过段表来实现的.段表的每个条目都有段基地址…
通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. //先建一个node Node * node = Node::create(); //创建完之后打印node的引用计数 schedule([node](float f){ //获得node的引用计数 int count = node->getReferenceCount(); //打印node的引用计…
目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restrict关键字 @ 存储类说明符 C中存储类说明符共有5个,为auto register static extern typeddef,最后一个关键字typedef与内存存储无关. 规定:不可以在一个声明中使用一个以上存储类说明符. 存储类说明符用来确定变量的存储类型. 存储类和函数 函数的存储类有两…
什么是内存池? 在上一篇 C++内存管理:new / delete 和 cookie中谈到,频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存,当有内存申请需求时,从内存池中取出一块内存分配给目标对象. 它的实现过程为: 预先申请 chunk 大小的内存池, 将内存池划按照对象大小划分成多个内存块. 以链表的形式,即通过指针将内存块相连,头指针指向第一个空闲块. 当有内存申请需求时,首先检查头指针是否指向空闲块,如果是则将头指针指向的第一个…
我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存.这种划分比较粗粒度,这种划分是着眼于我们最关注的.与对象内存分配密切相关的两类内存域.其中栈内存指的是虚拟机栈,堆内存指的是java堆. 1.栈内存,即虚拟机栈.每个方法被执行的时候都会同时创建一个栈帧,用来存储局部变量,操作栈,动态链接,方法出口等信息.局部变量包括各种基本类型的变量和对象的引用变量都是在方法的栈内存中分配.其中,64位长度的long和double类型的数据占用2个局部变量的空间,其他数据类型只占用1个.局部变量…
内核版本:linux-2.6.11 伙伴系统 伙伴系统是linux用于满足对不同大小块物理内存分配和释放请求的解决方案. 内存管理区 linux将物理内存分成三个内存管理区,分别为ZONE_DMA ZONE_NORMAL ZONE_HIGHMEM,并使用三个管理区描述符管理这三个ZONE. 管理区描述符里,有一个元素数为11的free_area数组,分别对应1.2.4.8.16.....不同块的大小,其中的每个元素的类型都是一个名为free_area的结构体,代码位置mm/mmzone.h st…
转自:http://blog.csdn.net/zhangxinrun/article/details/5873148 当某个程序映象开始运行时,可执行映象必须装入进程的虚拟地址空间.如果该程序用到了任何一个共享库,则共享库也必须装入进程的虚拟地址空间.实际上,Linux 并不将映象装入物理内存,相反,可执行文件只是被链接到进程的虚拟地址空间中(磁盘空间中).随着程序的运行,被引用的程序部分会由操作系统装入物理内存.这种将映象链接到进程地址空间的方法称为“内存映射”.可执行映像.每个进程的虚拟内…
查看内存 命令 free  默认是k为单位 也可以指定 m为单位 或者G为单位,这个不精准 total 总容量 used  使用了多少 free  剩余多少 看第二行.第一行是物理内存,加上虚拟内存buffers和cached 等于free第二行实际的剩余内存 buffers 数据将要写入到磁盘里去的 cached 数据从磁盘里取出来,放到内存里存. /////////////////////////////////////////////////////////////////////////…