我发现用DELPHI写的程序即使是仅建立一个窗体,别的什么控件没有,什么代码也没有过,运行时用进程管理器查看内存占用也要有1.5M-2M之间。
问题一:我去掉所有窗体,仅在工程文件 Project1.DPR中写入很简单的代码;
uses windows;
{$R *.res}
begin
 while true do;
end.
但结果这样的程序运行时仍占用1M多的内存?但我在进程管理器中看别的程序,有占用只有几百K的。
为什么这样简单的程序也占用这么多内存呢?问题二:上述有一个简单窗体的程序,虽然占用有1M多内存,但若是我点一下最小化,这时内存占用立即变成300多K,小了很多,即使再还原窗口,内存占用也不过400多K左右。
最小化一次,为什么就可以减少内存占用呢?还有我发现若是自己在代码中使用Form1.Hide或设置窗体最小化,却不能减少内存占用。只有用application最小化才有用。问题三:一个程序包括窗体,我以前用即用即建立窗体,用完立即Free或destroy,但观察内存,发现并没有什么明显变化,一般就是只增加,即不见减少。
如果我用delphi写程序,想尽量减少内存占用有何方法?

解决方案 »

  1.   

    uses中的东西可以适当减少
      

  2.   

    1、用Delphi写程序,即使你一个窗体不建,也有一个联系Application的隐藏窗口(其实不是隐藏,只是Width、Height设为0)用于消息循环,这一窗口要占用一定内存。
    2、任何Delphi程序都至少必须调用Vcl70.bpl(1.32M),如果是动态编译还至少要装载rtl70.bpl(760K)。
    3、建议使用LoadPackage、GetProcAddress和UnloadPackage等函数动态加载包的方式开发大、中型程序。
      

  3.   

    看一下,李维的VCL 和周爱民的  源代码 你就会明白。
      

  4.   

    uses中少加入单元文件,这样不仅可以减少编译后的EXE文件的大小,而且可以减少程序占用的内存
      

  5.   

    给你一段代码 ,5S整理一下内存 const
      Frequency = 5000;//每隔五秒钟整理一次内存,速度很快的 :)
    var
      TimerID: Integer;
      InProc: Boolean;procedure SaveMemory;
    begin
      if Win32Platform = VER_PLATFORM_WIN32_NT then
      begin //整理内存
        SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
      end;
    end;//定时器要执行的回调函数
    procedure HearBeatProc(Wnd: HWnd; Msg, Event, dwTime: Integer); stdcall;
    begin
      if (InProc = False) then
      begin
        InProc := True;
        try
          SaveMemory;
        finally
          InProc := False;
        end;
      end;
    end;initialization
      SetTimer(0, 0, Frequency, @HearBeatProc); //创建一个定时器
    finalization
      KillTimer(0, TimerID);
      

  6.   

    {
       2004.11.30
       wr960204 武稀松(王锐)
    }
    这个是原作者,
    我现在在程序里面加了这一段,原来占几十M 的现在都在 5M 以下了 ^_^
      

  7.   

    给你一段代码 ,5S整理一下内存 const
      Frequency = 5000;//每隔五秒钟整理一次内存,速度很快的 :)
    var
      TimerID: Integer;
      InProc: Boolean;procedure SaveMemory;
    begin
      if Win32Platform = VER_PLATFORM_WIN32_NT then
      begin //整理内存
        SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
      end;
    end;//定时器要执行的回调函数
    procedure HearBeatProc(Wnd: HWnd; Msg, Event, dwTime: Integer); stdcall;
    begin
      if (InProc = False) then
      begin
        InProc := True;
        try
          SaveMemory;
        finally
          InProc := False;
        end;
      end;
    end;initialization
      SetTimer(0, 0, Frequency, @HearBeatProc); //创建一个定时器
    finalization
      KillTimer(0, TimerID);
    ================================================================
    谢谢了~~
      

  8.   

    说的对呀,你可以不用VCL的,用纯API写程序就会很好了!
      

  9.   

    任务管理器显示的是物理内存占用量,不包括交换到PF的内存,理解了所有问题都不是问题了SetProcessWorkingSetSize的用途怎么会是整理内存?这个查查MSDN啊,字面上都能理解啊。看到任务管理器里的数据变小,只是把占用的物理内存转为虚拟内存,也就是转到PF上。你想通过它减少内存占用是不可能的。这里用它毫无意义。$FFFFFFFF等于有符号数的-1。只要该程序处于活动状态,占用的物理内存量就会迅速恢复。>>上述有一个简单窗体的程序,虽然占用有1M多内存,但若是我点一下最小化,这时内存占用立即变成300多K,小了很多,即使再还原窗口,内存占用也不过400多K左右。这和上面其实也是一个意思,当程序切换到非活动状态,操作系统会自动减少其占用的物理内存。总的内存占用量是不会减少的。一般程序根本很少涉及到自己管理内存,避免内存泄露就问题不大。去掉你程序里的{$R *.res},内存占用量就会变小了。去掉uses Windows没有任何效果,因为Delphi对没有使用的单元本来就不会编译。不过如果你以为这样就是什么代码都没有就大错特错了,因为它还默认编译了一个System单元。需要点技巧可以将其替换掉。还可以减少点文件大小。不过这么做毫无意义。大量的堆内存占用才是内存管理时要考虑的。别转牛角尖了。
      

  10.   

    我的代码是在盒子上找的,连接是 http://www.2ccc.com/article.asp?articleid=1650我自己把他分离出来用到自己的程序里面
      

  11.   

    真正占用内存的是当前程序要访问的内存量,这部分内存会被提交到物理内存,在就是在一定时间内访问的内存地址跨越的大小如果太大,就是当你连续访问几个对象时,这几个对象在内存中的位置距离过远,会引起系统不停的从页面文件装载到物理内存. 而现在的面象对象编程方式让我们会一个个的分散的创建对象,这些对象就会分散在内存中,如果我们要创建100个对象,先创建一个100的数组,这样这些对象就连续的,访问速度也会快,也容易管理.  至于DELPH自己占用的这一点内存不用在意,要从我们的程序的实现方式上来减少内存的占用.比如一个树,有500个节点,一是我们没有必要一次将500个都创建,可以在展开的时候创建子节点.我们只创建一个100个节点的数组,只保存基本的信息,如果树节点收起了,则可以以一定的算法将很久没有显示的释放掉.  对于大的文件操作用内存映射文件也是减少内存占用的方法.每次占载入显示的页等的方法.我觉得程序重要的是内存占用要稳定,不要一直在增长或都突然内存占用量大增,这些都会造成系统的不稳定,引起自己或别的程序错误.
      

  12.   

    恩~~
    在DELPHI中类都是从TOBJECT继承下来的~
    想要一个干净的类都难啊~
    一个窗体,DELPHI帮你实现了很多东西了,所以要占那样的内存啊~