Delphi 内存 叽歪

开一篇帖子将有关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。比较大程度上能避免内存溢出问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值