作者 : 小东东
标题 : Borland Delphi 7 FastMM RTL 补丁
关键字:
分类 : 个人专区
密级 : 公开
(评分: , 回复: 0, 阅读: 555) »»
Borland Delphi 7 FastMM RTL 补丁:
---------------------------------
发布者:
-------
Lsuper
1、任何问题,欢迎到 DelphiBBS 提出 ...
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3373649
2、感谢 deepblue2004、狂迷、liuchong 等等网友的反馈!!
版本:
-----
2006.03.18 v1.2
历史:
-----
2006.03.18 v1.2
1、提取网友的建议,恢复 1.0 对 RTL 的修改,用 Delphi 2006 的 SimpleShareMem.pas 替代 ShareMem.pas,这样做的好处:切换内存管理器不需要改动任何代码;而且可以和 FastShareMem、ShareMemRep 等第三方内存管理器兼容。
2、修改 GetMem.inc 在 98 下无法共享内存管理器一处严重的 BUG。
3、修改 98 下获取区域设置时预先分配内存,导致替换内存管理器失败的 BUG。
2006.03.12 v1.1
1、修正 Exe 和 Dll 之间没有共享内存管理器的问题(Delphi 2006 是通过第一个引用 SimpleShareMem.pas 单元实现的)。
2、测试例子中加入内存检测选项(注意,例子是只在 Delphi IDE 下提示内存泄漏,独立运行没有提示)
2006.03.06 v1.0
1、首次发布
说明:
-----
Delphi 2006 中一个重要的更新就是使用开源内存管理器 FastMM 替调了使用了 N 年的老内存管理器。
FastMM 在外国 Delphi 社区非常有名,其主要目的就是重新实现一个高效、安全、稳定的内存管理器(Borland 的内存管理器问题多多,如 Dll 和 Exe 间无法共享,多线程下效率底--一些情况下甚至于低一个数量级!),在代号为 Dexter 的 Delphi 2006 没 release 之前已经听李维大肆鼓吹说 Dexter 如何出色,还在 CSDN 上说他 Demo 证明 FastMM 在 Delphi 和 BCB 下能提高 NNN% 的效率!
FastMM 的主页:
http://fastmm.sourceforge.net
相对旧内存管理器,FastMM 有诸多的优点:
1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(“取代”就是第一个 uses FastMM4,that is all ...)
2、实现了内存管理器共享机制,Exe 和 Dll 间共享内存管理器不需要任何 Dll 支持
3、集成了内存泄漏检测功能
4、充分兼容现有的代码、Delphi 旧内存管理器模式
5、为了加速 Delphi IDE(如 Delphi 5/6/7、Delphi 2005)的启动速度、管理内存占用等,他提供了 BorlndMM.dll 的替代,直接替换 Bin 中的 Dll 即可!
如果想在 Delphi 7 下使用,最最简单的方法当然是在 dpr 中第一个 uses FastMM4
既然在 Delphi 2006 中的内存管理器如此之棒,一个非常自然的想法:能不能把 Delphi 2006 中的新内存管理器完全移植到 Delphi 7 下?
修改:
-----
通过 UltraEdit 和 WinMerge 等大量搜索、对比 Delphi 7(Version 7 Build 8.1) 和 Delphi 2006(Version 10.0.2166.28377),发现其实移植的工作量没有想象中的复杂 :>
主要有:修改 System.pas 中的内存管理函数;GetMem.inc 的完全替代!附带的,由于 Delphi 2006 中的 Move 和 FillChar 函数使用的是开源 FastCode 更具效率的实现,“顺手牵羊”了一把 n_n ...
1、使用 Delphi 7(Version 7 Build 8.1)的 System.pas 作为原本
2、使用的内存管理器完全替换为 Delphi 2006 的内存管理器(GetMem.inc/System.pas)
3、加入内存管理器共享
4、修改 Move、FillChar 为 Delphi 2006 的 System.pas 中的实现
5、所有操作在中文版 Windows XP sp2 + Delphi 7 下完全测试通过
使用:
-----
1、运行 RTL\Replace.bat,会编译出所有的 Dcu 文件,并复制到相应文件夹
2、如果想恢复原始文件,运行 BACKUP\Restore.bat
3、最后发布的 Dll 和 Exe 不需要附带额外的 borlandMM.dll
注意:如果你的 Delphi 没有安装在默认路径(C:\Program Files\Borland\Delphi7),请修改 bat 中相应的路径
文件:
-----
RTL 文件夹 Delphi 7 RTL 替换文件
BACKUP 文件夹 Delphi 7 RTL 备份文件
DEMO 文件夹 一个测试例子
注意:保留原始的操作方式,例子中在 Dll 和 Exe 之间传递 string 需要引用 ShareMem 单元!
来自:LSUPER, 时间:2006-3-18 16:02:12, ID:3373671
这是下载连接:
http://down1.tomore.com/source/20060318/200603180801372838.rar
原文件名:
Borland.Delphi.7.FastMM.RTL.Patch.v1.2.rar
来自:kinneng, 时间:2006-3-7 0:11:26, ID:3373678
李某大肆鼓吹的东西多着,在下不以为然,或者干脆说,没有效果,有也是偶尔的,特例的,纯白忙。
来自:LSUPER, 时间:2006-3-7 0:32:41, ID:3373684
=^0^= 我只相信自己项目的实测对比数据。
来自:EdwinYeah, 时间:2006-3-8 12:03:35, ID:3375306
GOOD。
能不能贴出测试对比数据?
来自:EdwinYeah, 时间:2006-3-8 12:11:22, ID:3375317
另外,请问您是如何通过测试保证修改不会引起其它问题的?
来自:吖诚, 时间:2006-3-8 16:42:54, ID:3375760
不知道该怎么办了
来自:MarkDean, 时间:2006-3-8 21:47:34, ID:3376031
支持你,像支持FastMM一样。
已使用,目前没有发现问题。
来自:特尔斐, 时间:2006-3-9 0:21:22, ID:3376136
如果使用运行时包,这个东东有用不?
来自:LSUPER, 时间:2006-3-9 1:45:38, ID:3376239
例子? 随手写一个:
procedure TForm1.Button1Click(Sender: TObject);
var
t: TDateTime;
I: Integer;
pData: Pointer;
begin
t := Now;
for I := 1 to 1000000 do
try
GetMem(pData, I);
finally
FreeMem(pData);
end;
ShowMessage(FormatFloat('0.00', 24 * 60 * 60 * (Now -t)));
end;
在我的机器上(AMD 1.8G 512M):
使用原来 RTL 大概 8.9-9.1S
使用 FastMM 替换的 RTL 大约 4.5-4.7S
更多的例子可以自己验证,我想李维说得 10-300% 绝对不是空口无凭的。
来自:LSUPER, 时间:2006-3-9 1:54:25, ID:3376242
附带的说一句:我确实无法“通过测试保证修改不会引起其它问题的”,至少在我现在的工程中没有任何的问题。
我只能说,这个 getmem.inc 就是 Delphi 2006 中的内存管理器核心,它增强了特别是常规内存分配、多线程应用等方面的性能,我所作的只是把它移植到 Delphi 7 的 RTL 中。附带的说,如果你仔细的对比 RTL 源码(如使用 WinMerge),你会发现,Delphi 2006 编译出来的程序相对 Delphi 7 编译的来得快是有其必然的道理的:
1、使用了全新的内存管理器
2、很多核心 RTL 函数使用的是开源的 FastCode 的实现,更具效率
3、很多核心 RTL 函数直接使用 inline 声明、编译!
来自:LSUPER, 时间:2006-3-9 1:56:37, ID:3376243
to 特尔斐:如果使用运行时包,这个东东“应该”有用。
理由:使用了全新的内存管理器了啊。;>
来自:WUSUBAR, 时间:2006-3-9 12:58:36, ID:3376707
不错 感觉很快
来自:EdwinYeah, 时间:2006-3-9 13:01:35, ID:3376710
再次感谢LSUPER的奉献精神!真的!
从你这个帖子才知道FastCode,他们在YAHHO有个新闻组挑战如何提升执行速度,真有意思。
惭愧!其实我上面主要是想问你移植的是否完整,是否会引起兼容问题,因为我自己暂没有时间去测试
另外请教楼主一个问题,FastMM和FastCode都是只需要在项目的源文件的最开始部分引用相关单元即可,他们是如何做到的?为什么不需要项目每个单元都引用?
来自:EdwinYeah, 时间:2006-3-9 13:21:19, ID:3376738
以后不再需要另外引用FastMM了
不过,不知道d2006是否使用了最瓣片的FastMM 4.62?
来自:liuchong, 时间:2006-3-10 9:30:51, ID:3377519
测试结果:
程序中不需要引用FastMM4
程序运行速度有所提高
错误如下:
把DEMO中MainFrm.pas的
Caption := Execute;
注释掉出错,出错原因不解。
来自:LSUPER, 时间:2006-3-10 15:14:30, ID:3378033
to EdwinYeah:
1、FastCode 是通过直接 Patch 掉 Delphi 的函数实现的,如你使用 Delphi RTL 中的 Pos 函数,引用 FastCode 相应的单元后在单元的初始节他会根据不同的 CPU 类型把 Delhpi 的函数替换成最优的函数进行调用,至于如何替换,这个你下他的源码看看就知道了(其实非常的简洁!);>
2、FastMM 也是单元的初始节把 Delphi 原来的内存管理器替掉了啊。
3、说到稳定性,我不敢打包票,至少我现在没遇到问题;权当自娱自乐吧 ...
=^0^=
来自:liuchong, 时间:2006-3-10 15:30:30, ID:3378064
LSUPER能帮看看吗?
错误如下:
把DEMO中MainFrm.pas的
Caption := Execute;
注释掉出错,出错原因不解。
来自:LSUPER, 时间:2006-3-12 0:20:40, ID:3379273
非常感谢 liuchong 的提醒,原来在 FastMM4 的说明中提到,需要在 Exe 和 Dll 之间共享内存管理器时需要引用 SimpleShareMem 这个单元的;在我的 Demo 中发现不引用这个好像也没问题(可能和我的“静态导入 DLL”的使用方式有关?),所以发布时去掉 SimpleShareMem 了,重新引入这个 pas 即可。
BTW:SimpleShareMem 的作用就是告诉 FastMM 需要“共享”内存管理器。其实代码非常的简单,这个 Delphi 2006 中带的:
{ *********************************************************************** }
{ }
{ Borland Delphi Memory Manager }
{ }
{ Copyright (c) 2005 Borland Software Corporation }
{ }
{ Portions created by Pierre le Riche are }
{ Copyright (c) Pierre le Riche / Professional Software Development }
{ }
{ Acknowledgement: With special thanks to the Fastcode community and }
{ supporters for their valuable input and feedback. }
{ }
{ }
{ *********************************************************************** }
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* This memory manager implementation is subject to the
* Mozilla Public License Version 1.1 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* ***** END LICENSE BLOCK ***** *)
unit SimpleShareMem;
interface
implementation
initialization
{Try to use a shared memory manager. If one is not available, start sharing
the current one.}
If not AttemptToUseSharedMemoryManager then
ShareMemoryManager
end.
来自:LSUPER, 时间:2006-3-12 1:44:09, ID:3379274
我已经重新发布了 1.1 的 patch,主要是在 System.pas 的初始节最后加入共享内存管理器功能。
使用:运行 RTL 中的 Replace.bat 即可
恢复:运行 BackUp 中的 Restore.bat
非常感谢大家的支持。
来自:LSUPER, 时间:2006-3-12 0:42:23, ID:3379278
嗯,感觉不爽,需要带上这个 SimpleShareMem.pas,其实代码就两句:
if not AttemptToUseSharedMemoryManager then
ShareMemoryManager
一个方法,可以直接放到 System.pas 的 initialization 过程的最后:
...
DefaultUserCodePage := LCIDToCodePage(GetThreadLocale);
{$ENDIF}
MainThreadID := GetCurrentThreadID;
{Try to use a shared memory manager. If one is not available, start sharing
the current one.}
if not AttemptToUseSharedMemoryManager then
ShareMemoryManager;
finalization
Close(Input);
...
然后运行 Replace.bat 重新编译所有 dcu,就可以不带 SimpleShareMem 而且发布的 Exe 和 Dll 不需要 BorlndMM.dll 啦。
来自:LSUPER, 时间:2006-3-12 2:11:00, ID:3379279
想想:既然 System.pas 已经被我们修改了,干脆改到底?(按照上面的修改 System.pas 彻底扔掉 ShareMem、FastShareMem 或者 FastMM4 等等) ...
这是 1.1 的主要修改。
来自:yxsoft, 时间:2006-3-12 3:09:33, ID:3379290
我直接用2006了,应该是有进步的,但我没感觉出来,呵呵
来自:LSUPER, 时间:2006-3-12 3:17:59, ID:3379294
=^0^=
在 2006 下试试这个例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
TButton.Create(nil);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
end;
end.
来自:lop, 时间:2006-3-12 17:45:40, ID:3379561
真有意思,坐下听课.
来自:sjm, 时间:2006-3-13 0:45:13, ID:3379790
to 楼主:
我还是有些不太明白。楼主提到需要在.dpr中首先加上 uses FastMM4,我加上后报错:File not found : FastMM4.dcu.没办法又去掉该语句,但不知FastMM是否还起作用?
另外,下载V1.1并解压后,我把RTL文件夹中的Replace.bat中的Delphi7路径按自身情况改了一下,然后就运行Replace.bat文件,请问FastMM的全部安装过程是否仅此而已?我在Delphi7的IDE中运行原先编好的软件好像体会不出有什么变化,速度差不多。楼主能否再详细介绍一下FastMM的强项?谢谢!
来自:LSUPER, 时间:2006-3-13 2:21:40, ID:3379802
to sjm:
1、不需要引用 FastMM4 啊,这个 RTL Patch 的目的就是移植 Delphi 2006 中的内存管理器(内核就是 FastMM4 的)到 Delphi 7;所以,执行 Replace.bat 后 Delphi 7 的 RTL 代码中已经集成 FastMM4 了;换句话说,你的源码不需要任何的改动!(当然,如果以前的项目引用了 ShareMem 此时应该去掉!)
2、FastMM 的特点具体的可以看他的说明文档啊;大体上:更高效(执行效率),更便捷(共享内存管理器而不需要额外的 dll),更易用(集成内存泄漏检测功能!)
来自:LSUPER, 时间:2006-3-13 2:27:36, ID:3379803
有个想法:如果 Delphi 7 使用 RTL Patch 享受 FastMM 的诸多有点而不需要改动现有项目的任何一行代码,岂不更好?(随时可以扔掉 Patch 或启用 Patch 而不需要修改任何代码!)
其实方法非常的简单,就是使用 1.0 的所有文件,然后用上面的 SimpleShareMem.pas 文件代替 Delphi 原来的 ShareMem 即可!
这个想法比较好,它甚至于有可能兼容 FastShareMem、ShareMemRep 等第三方的共享内存管理器!
嗯,有时间再看看(因为有人跟我说,最好就是“不需要任何的共享内存管理器单元”) ...
来自:sjm, 时间:2006-3-13 7:38:55, ID:3379813
原来是这样,谢谢LSUPER,也请将Readme.txt中的“1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(“取代”就是第一个 uses FastMM4,that is all ...)" 改为:1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(完全不需要加uses FastMM4,that is all ...),以免造成误会。
Thanks a lot!
来自:DoorKey, 时间:2006-3-13 9:37:19, ID:3379907
楼主好样的,省了我不少事情,我来帮忙测试。正郁闷D7的IDE经常出现内存Read FFFFFFFF错误呢,看看用上这个会不会比较好。我拿我负责的公司项目来测试一定够火力。
来自:daxu, 时间:2006-3-13 13:34:41, ID:3380234
试了
再运行Delphi 提示:[Fatal Error] File not found: 'System.pas'
现在 Delphi7
dcc32.exe 是 Delphi2006的
borlndmm.dll 是 FastMM4 的
lib路径,rtl source路径都试过了,
修了3个钟头了,还没好!
记得当年精简delphi5 时遇到过这问题,这会儿没办法
楼上各位帮看看。
来自:gz_runwe, 时间:2006-3-13 16:24:58, ID:3380529
楼主真的很有心啊,不过我感觉把SimpleShareMem合并到System单元文件中也不太好,因为毕竟不是什么时候都需要使用共享内存单元的.
另外,新发布的1.1Patch在使用FastMM4.62后,好象有问题,造成我的程序出现错误,我想就是因为SimpleShareMem合并到System单元文件的原因吧.
楼主开了个好头啊,我建议把getmem.inc单元文件改成直接引用FastMM.pas程序,可能这样更有通用性,以后如果FastMM升级了,直接更换FastMM单元文件就好了,如果能改成这样,D2006也可以做一个Patch了,楼主认为如何?
来自:狂迷, 时间:2006-3-13 17:51:43, ID:3380669
有没有试过:
NexusDB.Memory.Manager.v2.03.Delphi.BCB.Retail-CORE
据说这个内存管理做得非常好.我正为我的服务器软件内存泄漏头痛.
来自:LSUPER, 时间:2006-3-13 18:02:25, ID:3380673
to sjm:
正在犹豫中,感觉集成 sharemem 到 system 中确实不爽啊
to DoorKey:
公司 N 人已经被我怂恿者使用 borlndmm.dll 了;不过通常是安装过多的专家或控件导致 Delphi 的不稳定 ;>
to daxu:
到 Source\rtl\sys 和 lib、lib\Debug 下确认文件的日期啊,确定 system.dcu 在 lib、lib\Debug 下
to gz_runwe:
确实有点偏向于不把 SimpleShareMem 合并到 System 中;不过 FastMM4 本来就可以直接在 Delphi 7 和 Delphi 2006 下使用的啊(做这个 Patch 就是不想手工引用 FastMM4,或者说,想让 Delhpi 7 直接使用 Delphi 2006 的内存管理器的一个尝试:)
来自:LSUPER, 时间:2006-3-13 18:04:34, ID:3380674
to 狂迷:据说 NDB 的效率没有 FastMM 的好(FastCode 有测试的 :)。
来自:狂迷, 时间:2006-3-13 21:45:51, ID:3380782
没用过 D2006,也不打算用, D7以经足够用了,只想找个好一点的内存管理。
转个贴
# Delphi2006消耗内存那不是一般的大 2005-12-22 9:37 AM donghaixiaoxiao
Delphi2006消耗内存,我的一个近三万行的代码,在连续修改编译了三个小时后,居然吃掉140M内存,D7可是最多70多M呀
来自:狂迷, 时间:2006-3-13 22:11:15, ID:3380789
最新版是FastMM 4.62 [Notes] (2006-02-22 05:49)
你用的是哪一版?
来自:LSUPER, 时间:2006-3-13 22:38:41, ID:3380795
这个 Patch 使用的 FastMM 来自于 Delphi 2006 的 GetMem.inc。
还有,Delphi 编译器在编译一个工程时为了加快下次编译的速度,会缓存当前编译结果(估计是那些 dcu 信息?),所以如果“连续修改编译了”特别是打开一个 group 编译一堆的 dpr 会爆占内存,这个不仅仅是 Delphi 2006 的问题,至少在我用过的 Delphi 5/6/7 都这样子。
BTW:记得欧以前 Delphi 7 一个十几个 dpr 的 group 全编译后 Delphi 竟然占了 300 多 M 的内存!现在偶是:Delphi 打开 group 同时编译不超过两个 dpr,同时编译多个 dpr 时使用 finalbuilder 或者命令行。
来自:狂迷, 时间:2006-3-13 22:44:43, ID:3380799
这是 4.62 的文件,好像与 Patch 中有所不同,试试再决定用哪个。
2006-03-13 22:31 <DIR> CPP Builder Support
2006-03-13 22:31 <DIR> FullDebugMode DLL
2006-03-13 22:31 <DIR> Replacement BorlndMM DLL
2006-03-13 22:31 <DIR> Translations
2006-03-13 22:31 <DIR> Usage Tracker
2006-02-22 15:35 283,844 FastMM4.pas
2006-02-20 11:50 9,898 FastMM4_FAQ.txt
2005-12-21 13:51 9,611 FastMM4_Readme.txt
2005-10-26 12:39 6,787 FastMM4Messages.pas
2006-02-22 11:28 13,931 FastMM4Options.inc
来自:狂迷, 时间:2006-3-13 23:16:42, ID:3380809
改一下,测试,不错能提升 33%! 只是不知道稳定性怎样。
var
t: Cardinal;
I: Integer;
PData: PTest;
begin
t := GetTickCount;
for I := 1 to 10000000 do
try
New(PData);
PData^.Data := IntToStr(I);
finally
Dispose(pData);
end;
t := GetTickCount - t;
ShowMessage(IntToStr(t));
end;
来自:txj2k1, 时间:2006-3-13 23:27:29, ID:3380812
上面的代码我试过提升了 50%,可能我电脑比较差 ^_^
来自:txj2k1, 时间:2006-3-13 23:30:27, ID:3380815
另外问一下,哪有 fastcode 的下载,原来的没有了
来自:狂迷, 时间:2006-3-13 23:37:16, ID:3380817
//另外问一下,哪有 fastcode 的下载,原来的没有了
http://sourceforge.net/project/showfiles.php?group_id=130631
来自:狂迷, 时间:2006-3-13 23:39:10, ID:3380819
想问一下:需不需要所有控件都加上一句 FastMM4 然后重新编译再挂载?
来自:LSUPER, 时间:2006-3-13 23:41:34, ID:3380821
就是不同的啊,patch 的 getmem.inc 是 Borland 开发人员根据 FastMM4 修改的 For Delphi 2006 的内置内存管理器。
来自:txj2k1, 时间:2006-3-14 0:06:13, ID:3380831
我指的是http://sourceforge.net/projects/fastcode/的,不是fastmm
来自:LSUPER, 时间:2006-3-14 0:47:06, ID:3380840
http://sourceforge.net/projects/fastcode/
使用 cvs get 啊:
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/fastcode login
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/fastcode co -P modulename
不过上面没什么东西的说。
所有的代码可以由:
http://fastcode.sourceforge.net/
下载 ...
来自:狂迷, 时间:2006-3-14 11:47:33, ID:3381166
有没有单独的内存泄漏单元?
来自:LSUPER, 时间:2006-3-14 13:14:07, ID:3381261
CnPack 中就有一个啊
MemCheck 也非常不错:
http://v.mahon.free.fr/pro/freeware/memcheck/
来自:gz_runwe, 时间:2006-3-14 13:37:17, ID:3381287
哪位大侠下载一套完全FastCode找个地方供大家下载吧,我没装cvs啊
来自:狂迷, 时间:2006-3-14 15:46:51, ID:3381440
EurekaLog 5.5 中也带了内存检测吧?
来自:LSUPER, 时间:2006-3-15 2:22:07, ID:3381867
to gz_runwe:http://fastcode.sourceforge.net/ 下啊
to 狂迷:没有带。(现在好像最新的没到 5.5 啊 :)
来自:gz_runwe, 时间:2006-3-15 9:03:24, ID:3381995
是的,我已经下载了FastcodeLib0.3,但里面好象不全,数学函数都没有带,不过非常感谢LSUPER大侠提供网址
来自:EdwinYeah, 时间:2006-3-15 9:54:57, ID:3382078
to gz_runwe:
我也是从www.fastcodeproject.org 下载FastCode 0.3后,发现差一个math.pas
但可以从这个yahoo group的files下面找到:
http://groups.yahoo.com/group/fastcodeproject/
to 狂迷:
内存泄露检查可以考虑TurboPower的 Memory Sleuth
来自:deepblue2004, 时间:2006-3-16 9:22:00, ID:3383344
测试了一下在2000下编译在98下运行出现错误提示!
标题:Cannot Switch Memory Manager
内容:The memory manager cannot be changed after it has been used.
请查找原因!
来自:LSUPER, 时间:2006-3-16 12:42:37, ID:3383732
非常感谢反馈;
2000 下运行有没有问题?
这个是在 AttemptToUseSharedMemoryManager 中报的
我找个 98 看看。
或者干脆恢复到 1.0 的 pas,同时使用 SimpleShareMem 替换 ShareMem 共享内存管理器的方式。
来自:deepblue2004, 时间:2006-3-16 21:57:37, ID:3384480
to:LSUPER
不太明白你所说的,我在2000 server 下做得程序,使用了你的Borland Delphi 7 FastMM RTL 补丁,在2000下编译和运行没有问题,可是当我将其发布到98系统时出现上述问题,程序不能运行,我恢复到原来的单元文件,重新编译后没有出现问题。
现在我很难选择是否还用Borland Delphi 7 FastMM RTL 。
来自:deepblue2004, 时间:2006-3-16 22:08:48, ID:3384487
在98下是否应该连带borlandMM.dll
一起发布呀。
其实我在2000系统中只在我的开发机器上测试了,没有在其他的2000系统下测试(忽略了)。
不过现在没有时间做这个测试了,有时间在说吧,反正在98下不带borlandMM.dll
发布出现错误,没有连带borlandMM.dll
发布的情况作测试!
来自:狂迷, 时间:2006-3-17 8:45:50, ID:3384619
愿意继续讨论的请到我的QQ群组里来: 17523790 ,
请求验证时请说明:FastMM 或 DFW 或 Delphi
来自:LSUPER, 时间:2006-3-18 10:03:55, ID:3385878
非常非常感谢 deepblue2004 的反馈!
我主要的系统是 windows xp,家里和公司都没有 98 系统测试,直到昨天才有空用 vmware 搭了个 98 进行详尽的测试。
经过测试发现,这是 FastMM 的一个 BUG(不光是 FastMM 4.62、Rtl Patch 还有官方的 Delphi 2006!)在 GetMem.inc 中为了共享内存管理器创建了一个隐含的 label:
GetMem.inc 的 4424 行:
MMSharingWindow := CreateWindow('STATIC', PChar(@UniqueProcessIDString[1]), WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessId, nil);
其中 CreateWindow 的原型(GetMem.inc 进行了封套,在 4317 行定义):
function CreateWindow(lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
在 winnt 的系统下 hInstance: HINST; 传入 GetCurrentProcessId 没任何问题;而在 98 下出错(创建不成功返回 0)!这个应该修改为:
MMSharingWindow := CreateWindow('STATIC', PChar(@UniqueProcessIDString[1]), WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
来自:liuchong, 时间:2006-3-18 15:24:44, ID:3386193
改完后,Demo在98下仍然出错
来自:liuchong, 时间:2006-3-18 15:48:30, ID:3386209
LSUPER快出招
能在98下正常运行
能在做dll时,不带其它dll
现在很不爽啊
来自:LSUPER, 时间:2006-3-18 15:48:31, ID:3386210
经过和网友的交流,考虑取消 1.2 的 RTL Patch 中默认共享内存管理器,如果需要共享内存管理器可以引用 Patch 过的 ShareMem(其实就是移植 Delphi 2006 的,所以发布时不需要 BorlndMM.dll)或者 FastShareMem、ShareMemRep 等(其实就是当初 1.0 的方式:)
好处:Delphi 7 下替换内存管理器而不需要对原来代码进行任何的修改!
来自:liuchong, 时间:2006-3-18 15:51:28, ID:3386214
2ccc中还没有下载吗?
来自:LSUPER, 时间:2006-3-18 16:01:15, ID:3386229
2ccc 需要确认,稍慢,放到 tomore 了 ...
来自:liuchong, 时间:2006-3-18 16:03:12, ID:3386232
安装完了,使用上和没装之前一样吧?
写dll要
uses
ShareMem
(不用带上BorlndMM.dll了吗?)
在工程uses中第一个要加上什么单元?
来自:LSUPER, 时间:2006-3-18 16:06:36, ID:3386235
原打算把 98 下共享出错的 BUG 报告给 FastMM 开发组的,发现昨天已经被人抢先一步啦:
http://sourceforge.net/tracker/index.php?func=detail&aid=1452117&group_id=130631&atid=718458
而且 pierre_le_riche 已经确认这是 FastMM 的一个 BUG!
来自:LSUPER, 时间:2006-3-18 16:08:11, ID:3386236
to liuchong:
没用 Patch 时怎样的写法,现在就是什么样的写法 ;>
来自:LSUPER, 时间:2006-3-18 16:09:38, ID:3386238
别忘了 Exe 和 Dll 同时第一个引用 ShareMem。
老生长谈了 :>
来自:liuchong, 时间:2006-3-18 16:31:36, ID:3386256
LSUPER
98下的BUG解决了,我下你的FastMM吧
来自:LSUPER, 时间:2006-3-18 16:58:36, ID:3386279
齐齐抓虫子 ... ;>
来自:liuchong, 时间:2006-3-18 16:59:29, ID:3386280
to LSUPER
既然这是FastMM的BUG
那Borland.Delphi.7.FastMM.RTL.Patch.v1.2比
Borland.Delphi.7.FastMM.RTL.Patch.v1.1
有什么好处?
来自:LSUPER, 时间:2006-3-18 17:22:14, ID:3386298
Borland.Delphi.7.FastMM.RTL.Patch 使用了 Delphi 2006 的 GetMem.inc,而这个 GetMem.inc 其实就是 FastMM,所以说这“不光是 FastMM 4.62、Rtl Patch 还有官方的 Delphi 2006”都存在的 BUG。
你可以在 Delphi 2006 下使用 SimpleShareMem 进行共享内存管理器的测试(其实把 patch 中的 Demo 下的 ShareMem 改成 SimpleShareMem 然后在 Delphi 2006 下编译,98 下运行就可以看出来了:)
好处:
替换后不需要对“原来的代码”进行任何的修改,如果出现问题,恢复非常简单(仅仅 restore.bat,对你的代码没有影响!)
BTW:
Delphi 2006 下 ShareMem 和 SimpleShareMem 是两种完全不同的共享内存管理器的机制:前者共享第三方 Dll(borlndmm.dll) 的内存管理器,后者利用“内存桥”的方式进行共享。
来自:satanmonkey, 时间:2006-3-20 15:59:38, ID:3387821
打了这个补丁以后是否还需要在工程文件最开始uses ShareMem或者别的pas ?
来自:yuzg, 时间:2006-3-20 17:06:01, ID:3387914
我的程序分几个独立文件,采用BPL共享,用Lsuper_D7_FastMM_RTL_Patch_v1.2 需要重新编译vcl70.bpl么
要注意些什么???
来自:LSUPER, 时间:2006-3-21 0:19:15, ID:3388242
to satanmonkey:是的,需要 uses sharemem,不过这个 sharemem 已经不是 borland 那个了(替换成 delphi 2006 的 simplesharemem.pas),所以发布时不需要 borlndmm.dll。
to yuzg:应该需要。
来自:liuchong, 时间:2006-3-21 10:03:11, ID:3388310
1.2版中:
“彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(“取代”就是第一个 uses FastMM4,that is all ...)”
写DLL时,第一个uses的是ShareMem,那就无法先uses FastMM4了。
不写DLL,想提高程序效率,在dpr中第一个uses FastMM4也不行啊!
来自:h_backup, 时间:2006-3-21 9:42:47, ID:3388418
许久没看到大富翁上有质量这么高的帖子了 激动ing
来自:gz_runwe, 时间:2006-3-21 9:45:03, ID:3388428
同感
来自:LSUPER, 时间:2006-3-21 12:24:06, ID:3388730
to liuchong:
1、使用这个 Patch 就不需要使用 FastMM4 了(因为这个 Patch 就是 FastMM4,不过直接集成到 Delphi 的 RTL 源码中了)
2、如果想用 FastMM4,不需要 patch,不过 Dll 和 Exe 间共享内存管理器时需要打开 FastMM4 的编译选项:ShareMM 和 AttemptToUseSharedMM
3、原理上,FastMM4 其实可以和 ShareMem(没有修改前的) 共存的,不过要求重新编译 Borlndmm.dll,这个在 FastMM4 发布的文件中附带了。
4、“不写DLL,想提高程序效率”,可以不使用 patch 而直接“在 dpr 中第一个 uses FastMM4”。
来自:liuchong, 时间:2006-3-21 13:05:07, ID:3388778
再问:
看到Demo中的DLL和EXE中都要
uses
ShareMem
那么用Delphi做的DLL在其它语言中使用时,其它语言会不会因为ShareMem受到影响?
谢谢!
来自:LSUPER, 时间:2006-3-21 13:32:51, ID:3388821
其他语言不能理解 Delphi 中的 string、动态数组等数据类型啊(当然,除了 Delphi 的“胞兄”C++ Builder),所以你 exports 时不应该使用这些 Delphi “特有”的生存期间自管理的数据类型,而应该使用 pchar 等,而这些不需要 ShareMem 的啊。
来自:gz_runwe, 时间:2006-3-23 12:01:39, ID:3391016
最好使用OleVariant变量类型传递字符串
1.OleVariant是又操作系统支持的标准变量类型,跨语言平台不是问题;
2.该变量类型是由操作系统保证的自动释放变量类型,不会存在内存泄露,目前的Com+应用都是采用OleVariant变量传递字符传变量的,大数据量转移稳定可靠.变量的分配由操作系统的Dll中完成,类似于BorlandMM的功用;
3.唯一的缺点,速度比普通字符串稍慢点
来自:啊啊啊啊啊, 时间:2006-3-25 8:14:23, ID:3393354
强贴,做个记号
来自:狂迷, 时间:2006-3-25 18:07:02, ID:3393715
大家有没有发现,就算是只有一个空的窗体的 Delphi 程序,占的内存都在 2M 以上,而 VC 写的程序可以控制在 2M 以下,有办法使Delphi写的程序少占用内存吗?
(使用SetProcessWorkingSetSize()函数的方法不算)
来自:satanmonkey, 时间:2006-3-25 23:56:43, ID:3393880
to:狂迷
不用vcl就占用小了。直接用pascal 调api
delphi和vc各有优势,非要什么优点都集一身是奢望。
来自:狂迷, 时间:2006-3-26 14:52:04, ID:3394101
satanmonkey: Delphi + Kol 是没用到 Vcl 的,文件小了只有十几K,但占用的内存并没有少到.
来自:satanmonkey, 时间:2006-3-26 21:43:07, ID:3394267
to 狂迷,
kol还不是Framework,你是才出虎穴又入狼窝
你直接用pascal调用api写程序.就占用小了.不过不提倡.
vcl的好处是开发快.mfc写的东西占用内存是比vcl出来的小点.不过开发起来就不快了.
同样使用pascal和c++来sdk的话.pascal是要比C++略大,不过差别不大.没有mfc和vcl的差别那么大.另外vc还可以用wtl,好像更小.
来自:GalfordLiu, 时间:2006-3-31 19:43:20, ID:3400144
我按操作说明运行了Replace.bat,提示复制文件完成.但是当我运行Demo时,提示
Borland ShareMem not Used!
....请问运行了Replace.bat后还要做其它动作吗?
来自:GalfordLiu, 时间:2006-3-31 20:27:31, ID:3400168
哦,应该可以了,看错了.
来自:yeuume, 时间:2006-4-2 9:54:33, ID:3401813
www.source520.com 再次更新近3万代码,全部免费免注册狂下载
来自:bjyplbx, 时间:2006-4-5 16:29:00, ID:3405550
楼主,我下载了 FastMM464
并且已经将 FastMM.pas 和 FastMM4Messages.pas 和 FastMM4Options.inc 放在library path中
编译了 BorlandMM.dll 和 FastMM_FullDebugMode.dll 将他们放在了 delphi7\bin 下,先不关是不是提高了速度,我的 delphi 退出后,delphi32.exe 进程结束不了,什么问题。
来自:antong, 时间:2006-4-5 16:37:33, ID:3405574
kinneng 很无知
典型的中国小乡无作为派.
劝你改行 ,你年纪大了,接受事物能力不行了
来自:狂迷, 时间:2006-4-6 8:25:36, ID:3406010
bjyplbx:
不用 Debug 版的 DLL 就行了!
来自:bjyplbx, 时间:2006-4-6 9:02:00, ID:3406040
我不知很了解这个
请问 debug 版是指的什么呢?
来自:新兵, 时间:2006-4-6 14:51:34, ID:3406594
请问lz,在dpr中加了uses sharemem,运行原来的程序,出现提示窗口 :the memory manager cannot be changed after it has been used,如何解决(运行环境:2003,delphi7 8.1)
来自:新兵, 时间:2006-4-6 15:07:30, ID:3406613
知道了,要第一个引用才行
来自:wujixian, 时间:2006-4-16 13:46:27, ID:3416740
您好,我已改了安装目录,运行Replace.bat时如下:
E:\Program Files\Borland\delphiFastMM_RTL\RTL>Replace.bat
Could Not Find E:\Program Files\Borland\delphiFastMM_RTL\RTL\*.dcu
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
23837 lines, 0.27 seconds, 41681 bytes code, 12828 bytes data.
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
45 lines, 0.01 seconds, 70 bytes code, 4 bytes data.
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
23837 lines, 0.29 seconds, 41849 bytes code, 12828 bytes data.
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
45 lines, 0.02 seconds, 70 bytes code, 4 bytes data.
1 file(s) copied.
1 file(s) copied.
1 file(s) copied.
1 file(s) copied.
1 file(s) copied.
1 file(s) copied.
1 file(s) copied.
Press any key to continue . . .
想问一下,这个:
Could Not Find E:\Program Files\Borland\delphiFastMM_RTL\RTL\*.dcu
是什么意思???
谢谢
来自:EdwinYeah, 时间:2006-4-27 16:57:04, ID:3428986
to 楼主,你提供的system.pas的备份安装了d7的几个patch?
我发现我系统中原来的system.pas和你提供的包中的有一点点不同,如下:
function LoadResString(ResStringRec: PResStringRec): string;
var
Buffer: array [0..4095] of char;//我系统中的system.pas
Buffer: array [0..1023] of char;//你提供下载的包中的backup目录内的system.pas
来自:EdwinYeah, 时间:2006-4-27 17:07:04, ID:3429002
另外大家是否发现使用楼主提供的system.pas,比直接使用fastmm等"fast"一族,有一个很大的好处,就是程序启动时不再需要替换原已载入的内存管理器的过程,而节省了1-3秒(我的CASE)的启动时间?
thanks to lsuper again :)
来自:swpit, 时间:2006-5-11 15:58:48, ID:3439457
对全局变量内存泄漏检测的不准确性:全局变量的释放应该是在程序退出之后,而内存管理器报告内存泄漏时程序还没有退出,所以存在偏差(个人意见)。
//报告string str 引起了内存泄漏。
program Project1;
uses
System,
Forms,
SysUtils,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
str : string;
iCount : Integer;
begin
ReportMemoryLeaksOnShutdown := true;
Application.Initialize;
str := '123';
Application.Run;
end.
来自:zhenxin0603, 时间:2006-5-11 18:00:27, ID:3439649
加了1.2的补丁以后的程序不能同时使用EurekaLog
我用的是EurekaLog 5.13 Ent的
下面的是在Delphi7中运行上报的错
Version : 5.1.3
Date : Thu, 11 May 2006 17:50:21 +0800
OS : Microsoft Windows 2003
RAD : Delphi 7.0
Dump : $8B $50 $14 $8B $7D $F8 $8B $5D $08 $42 $89 $50 $14 $8B $C7 $83 $E0 $01 $C7 $45 $F0 $00 $00 $00 $00 $89 $45 $E8 $8B $FF $F6 $05
Section : ExceptionLog.Done (Address: 0045E580)
LastExcept:
Address : $7C9696D0
Exception : EAccessViolation
Message : Access violation at address 7C9696D0 in module 'ntdll.dll'. Read of address 00000014
Call Stack:
来自:zhenxin0603, 时间:2006-5-12 9:59:03, ID:3440058
经检查,发现是EurekaLog 5.13中ExceptionLog第2168行中的如下代码
function ModuleInitTable: PackageInfo;
begin
{$IFDEF Delphi6Down}
Result := PPointer(DWord(@AllocMemSize) + $84)^;
{$ELSE}
{$IFDEF Delphi9Down}
Result := PInitContext(DWord(@AllocMemSize) + $80).InitTable;
{$ELSE}
Result := PInitContext(DWord(@AllocMemSize) + $2218).InitTable
{$ENDIF}
{$ENDIF}
end;
此函数根据AllocMemSize取出InitTable,而1.2补丁中并没有对AllocMemSize进行处理,原版是有的,故发生此错误,怎么改正啊
来自:dyydyy, 时间:2006-5-18 21:51:50, ID:3446670
不及明白,贴子也长了,
是不是不要安装fastMM(包括那个替换用的dll),而只要运行replace就可。
那就应该这样说:
d10内存管理移至d7的方法 (本质上是fastMM),而不是fastMM补丁。
对不对,谢谢。
来自:lmxeq5, 时间:2006-9-12 15:42:51, ID:3570259
多谢楼主的热心,我也用了一下1.2 版的,不过还是不清楚dpr文件里面是否需要引用FastMM4.pas,能不能将这些也写到说明文档里,或者干脆在压缩包中带两个Demo
来自:errorcode, 时间:2006-9-14 23:54:19, ID:3572699
LZ不是说直接在DPR引用一下就可以了,为什么还要编绎SYSTEM.PAS?不懂
来自:huie_softbug, 时间:2006-12-13 9:12:58, ID:3644337
1.这个1.2的补丁包 直接用 就不要安装Fastmm 4.74了 这样可以提高性能
2.要么你就不要用这个补丁包,直接用Fastmm 4.74
3.Fastmm是什么?内存管理 取代d7原来自带的 有很多好处
4.那1.2补丁又是什么?从BDs2006移植到d7的!
查看日志|返回日志列表
留下脚印
- 踩一脚
- 您的头像会显示在这里
相关资源下载
- Delphi 6 RTL Update Pack 3
- DIHtmlParser for Borland Delphi 4/5/6/7
- Borland Delphi v8.0 最新补丁第二版2
- Borland Delhpi 7 FastMM RTL(GetMem.inc/System.pas) Patch
- Borland Delhpi 7 FastMM RTL(GetMem.inc/System.pas) Patch
- Borland Delhpi 7 FastMM RTL(GetMem.inc/System.pas) Patch
- Borland Delhpi 7 FastMM RTL(GetMem.inc/System.pas) Patch
- VCLSKIN 4.11 2006.6.29 DELPHI&BCB 补丁
- 回答Borland Delphi v8.0 最新补丁第二版2的问题
- Borland Delphi v8.0 最新补丁第二版(13.3.04)


评论