开一篇帖子将有关Delphi程序内存的需要了解的知识点记录下来,备查。
第一:内存常见问题描述:
1、access violation at address 00000000
常见的地址访问错误,譬如访问时对象没创建或者已被释放;
亦或是地址越界,没有访问权限导致的访问不到。
2、out of memory
一般win32程序在占用系统内存理论值为2G,实际上得看不同的管理程序和操作系统。我写过能用到1.9G的也遇到过1.1G就报内存溢出的。
这里的计算不仅仅是要考虑系统已经在资源管理器中能看到的,还需要考虑尚未加载的,譬如查询数据,数据量,数据集占用的内存等。
总之,内存大小的计算,一个是动态的,另外一个是不可能真正达到2G的,这2G中还需要包含系统对其管理所占用的部分内存。
第二,鸡零狗碎的说明:
1、Delphi不比.net、java等高级语言需要自己手动管理,Create之后需要Free;
2、Delphi有自带的内存管理功能,某些情况下如果不使用,在程序相互调用的情况下会出现内存错误,具体情况需要靠自己积累。曾经遇到过,没有去深入研究。
管理功能在单元:System.ShareMem、ShareMem(部分老版本需要自己另外安装)中实现;
在自己开发的程序中必须加在*.dpr文件uses 中的第一个;
eg:
library e3ui_HQDifFee;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
SysUtils,
Classes,
dm_funcU in 'dm_funcU.pas' {dm_func: TDataModule},
3、一个Delphi程序使用只要稍微频繁,或者数据库连接比较多。都可能出现内存逐步上升,直至出现out of memory错误。当然,如果在报错之前使用频率降下来,一段时间后占用内存会逐步降低。
即使再完善的代码,Delphi VCL中还是存在部分内存泄露的控件,所以这个问题必须处理。
我曾花时间研究服务端,做了如下处理方式:
1)、写一个守护程序,发现内存过大时或者心跳服务没响应时,将程序进行重启;(开贴另外说明)
2)、连接数据库这一块,尽量使用连接池;(具体实现会开帖子另外说明)
3)、在一些比较大的服务或者数据库查询之前使用内存回收Windows API :
引用单元:API单元:Winapi.Windows;系统平台单元:System.SysUtils;
GetCurrentProcess 获取当前进程;
SetProcessWorkingSetSize 设置进程工作空间大小;
procedure Tdm_func.ClearSysMemory;
begin
// 清理内存,减少内存占有量(移至缓存)
if Win32Platform = VER_PLATFORM_WIN32_NT then
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
end;
这个清理比较有效果,曾经测试一个大的数据库查询导出功能。使用前后系统占用内存差距达到800多M。比较大程度上能避免内存溢出问题。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: httprunner 4.x学习 -8.base_url 环境地址的使用
前言 config 中有个 base_url 关键字可以设置环境地址,这样其它接口就只需写相对地址了 base_url 环境地址 比如我要测试的API接口如下 http://httpbin.org/get 第一个是get请求 http://httpbin.or…