收藏 分享(赏)

内存细化、解决方案说明.ppt

上传人:无敌 文档编号:1403472 上传时间:2018-07-12 格式:PPT 页数:21 大小:386KB
下载 相关 举报
内存细化、解决方案说明.ppt_第1页
第1页 / 共21页
内存细化、解决方案说明.ppt_第2页
第2页 / 共21页
内存细化、解决方案说明.ppt_第3页
第3页 / 共21页
内存细化、解决方案说明.ppt_第4页
第4页 / 共21页
内存细化、解决方案说明.ppt_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、内存,by mous2011-03-09,空指针分配区,进程临界区,进程私有空间,Win32下 每个进程有4GB的地址空间,系统保留 2GB(各进程共享),$FFFFFFFF,$80000000,$7FFFFFFF,$7FFF0000,$7FEFFFFF,$00010000,$0000FFFF,$00000000,内存的分类,PageSize 是系统管理内存的基本单位VirtualAlloc 函数分配的内存就是以 PageSize(4K) 为最小单位VirtualAlloc 给一个整数(4个字节)分配内存, 将会浪费 4092 个字节”堆“需要手工管理分配”栈“是程序自动管理每个程序都保留一块

2、内存作为”栈“Project - Options - Linker - Min stack size 和 Max stack size”栈“用来暂存局部变量和函数参数, 需要时自动申请, 用完就释放,堆 HEAP、栈 STACK,堆允许程序在运行时动态地申请某个大小的内存空间使用堆内存自己动手做喜欢吃的菜比较麻烦符合自己的口味自由度大用栈内存去饭馆里吃饭只管点菜(发出申请)、付钱和吃(使用),吃饱了就走不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作快捷自由度小,堆 栈 对比示意图,STACK,HEAP,栈,堆,堆 栈 地址示意图,高,低,全局量,自由空间,堆起始,栈起始,栈向低地址增长,堆

3、往高地址增长,私有堆,每一个程序都有一个默认建立的 堆程序会给每个线程分配一个 栈区而 默认堆 是进程中的所有线程公用的某线程使用某个堆时,其他线程需要挂起等待MyHeap := HeapCreate(HEAP_ZERO_MEMORY, 1024*1024*2, 0); p := HeapAlloc(MyHeap, 0, 7);p := HeapAlloc(MyHeap, 0, 7); HeapDestroy(MyHeap);,堆的使用: 拆东墙,补西墙,初始状态,最后状态,字符指针内存分配,StrAlloc 调用 GetMem,但会在前面添加Delphi需要的4个管理字节(长度)用StrDi

4、spose释放,用 StrBufSize 获取大小var p: PChar;begin p := 直接给常量赋值,则系统自动分配内存;end,New、Dispose 和 GetMem、FreeMem,New 用于分配已知大小的指针GetMem 用于分配无类型指针GetMemory 功同 GetMem,仅参数与返回值不同GetMem、GetMemory、ReallocMem、ReallocMemory不初始化内存 AllocMem 会初始化内存为空FreeMemory 会检查是否为 nil 再 FreeMem尽量使用 FreeMemory 来释放 GetMem、GetMemory、AllocMe

5、m、ReallocMem、ReallocMemory 分配的内存.New 对应的 Dispose 也可以用 FreeMem 或 FreeMemory 代替,内存的初始化,FillMemory、ZeroMemory 都是调用 FillCharFillMemory、ZeroMemory 的操作对象是指针, 而 FillChar 的操作对象则是实体,内存复制,MoveMemory、CopyMemory 都是调用 Move 过程前二者操作指针,后者操作实体例子var buf1,buf2: array0.9 of AnsiChar;begin buf1 := 0123456789; buf2 := ab

6、cdefghij;Move(buf22, buf14, 5);CopyMemory(buf22, buf14, 5);,内存监测,内存泄漏 定义,内存泄漏是指堆内存的泄漏分配的一片内存不再需要使用或无法访问时,但是却并没有释放它一段例子procedure test;var p: PString;beginnew(p);p := hello;end;,内存泄漏 分类,常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷

7、,导致总会有一块且仅一块内存发生泄漏。(Singleton模式)隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。(服务程序在此种情况下会导致Crash),自动垃圾回收,即使是提供自动内存管理的编程语言,如Java、VB、.NET、LISP,都不能避免内存泄漏内存管理器不能判断项目是否将再被存取,除非程式作出一些指示表明不会再被存取。虽然内存管理器可以回复不能存取的内存,但它不可以释放可存取的内存,因为仍有可能需要使用。,内存泄漏检测,检测内存泄漏的关键是要能截获住对分配内存和释放内存的函数的调用MS C-Runtime LibraryPurifyBoundsChec

8、kerPerformance Monitor (能检测出隐式的内存泄漏)FastMM,SizeOf 和 Length,var ary: array0.99 of integer;Length(ary) is 100SizeOf(ary) is 400,内存对齐,type TMyRec = record i : Integer; c : AnsiChar; end; TMyPack = packed record i : Integer; c : AnsiChar; end;SizeOf(TMyRec) 是 8SizeOf(TMyPack) 是 5,fastmm4.pas,program DeviceCA;$APPTYPE CONSOLEuses FastMM4,此单元内存管理效率比系统自带的高,Thanks,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 解决方案

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报