很长一段时间我都注意到我的服务器应用程序的Win64版本泄漏了内存.虽然Win32版本在相对稳定的内存占用情况下运行良好,但64位版本使用的内存会定期增加 - 可能是20Mb /天,没有任何明显的原因(不用说,FastMM4没有报告任何内存泄漏) .32位和64位版本的源代码相同.该应用程序是围绕Indy TIdTCPServer组件构建的,它是一个连接到数据库的高度多线程服务器,该数据库处理由Delphi XE2制作的其他客户端发送的命令.
我花了很多时间来查看自己的代码并试图理解为什么64位版本泄露了如此多的内存.最后我使用了专门用于跟踪DebugDiag和XPerf等内存泄漏的MS工具,看起来Delphi 64位RTL中存在一个基本缺陷,每次线程从DLL分离时都会导致某些字节泄露.对于必须在不重新启动的情况下全天候运行的高度多线程应用程序,此问题尤其重要.
我用一个由主机应用程序和库组成的非常基本的项目重现了这个问题,这两个项目都是用XE2构建的.DLL与主机应用程序静态链接.主机应用程序创建只调用虚拟导出过程并退出的线程:
这是库的源代码:
library FooBarDLL;
uses
Windows,
System.SysUtils,
System.Classes;
{$R *.res}
function FooBarProc(): Boolean; stdcall;
begin
Result := True; //Do nothing.
end;
exports
FooBarProc;
Run Code Online (Sandbox Code Playgroud)
宿主应用程序使用计时器来创建一个只调用导出过程的线程:
TFooThread = class (TThread)
protected
procedure Execute; override;
public
constructor Create;
end;
...
function FooBarProc(): Boolean; stdcall; external 'FooBarDll.dll';
implementation
{$R *.dfm}
procedure THostAppForm.TimerTimer(Sender: TObject);
begin
with TFooThread.Create() do
Start;
end;
{ TFooThread }
constructor TFooThread.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
end;
procedure TFooThread.Execute;
begin
/// …
Run Code Online (Sandbox Code Playgroud) 我是开发Delphi应用程序的团队的成员.内存需求量很大.500 MB是正常的,但在某些情况下它会出现内存异常.在这种情况下分配的内存通常在1000 - 1700 MB之间.
我们当然需要64位编译器,但现在不会发生(如果它发生,我们也必须转换为unicode,但这是另一个故事......).
我的问题是为什么在64位环境中运行时每个进程有2 GB的内存限制.指针是32位,所以我认为4 GB是正确的限制.我使用Delphi 2007.
编辑: 所以如果我使用以下方法在Delphi中设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志:
{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)
并在Windows Server 2003 x64上运行生成的Exe文件,然后该应用程序可以处理4 GB?
我有Windows Vista 64.
我有一些项目需要Python 2.7.3 64位和其他需要Python 2.7.3 32位(因为一些扩展不能在64位工作).
如何阻止Python 2.7.3 MSI安装程序(32或64 bot)删除其他版本.
并排使用Python 2.7.2为我工作没有问题.
在我工作的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问).当我们创建一个窗口时,我们通常的做法是将this
窗口的用户数据区域放入SetWindowLong(hwnd, GWL_USERDATA, this)
,这样我们就可以进行类似MFC的回调或紧密集成WndProc
.问题是这不适用于Win64,因为LONG只有32位宽.什么是解决这个问题的更好的解决方案适用于32位和64位系统?
问题是为什么我在尝试导入附魔时会在标题中看到错误消息.我正在使用Win64.
我只安装了32位Windows,所以我自己无法验证.
如果我理解正确,在Microsoft API的各个地方使用的DWORD是参考原始的16位字,并且与当前的硬件架构无关?
所以看起来是32位的DWORD,即使我最终编译并链接我的应用程序以在64位Windows中运行,仍将保持32位?或者DWORD会变成128位宽吗?
按照INSTALL.W64中的说明操作后,我遇到两个问题:
我在windows上安装了postgresql,而安装它要求为该帐户创建一个用户.这使我的计算机中的一个名为postgres的新Windows用户,我也为它创建了一个密码.
现在我想在Windows命令行上运行psql,它要求输入密码(不提及用户)并且总是给我回错:psql: FATAL: password authentication failed for user "Ash".
即使我已经多次设置了我的帐户密码.
使用pgadmin我将用户"postgres"更改为"Ash",但我还没有重新设置密码.我按照这里的步骤操作:我忘记了在postgres安装期间输入的密码(我更喜欢打字,host all 127.0.0.1/32 trust
因为我在Windows上),但是当再次运行psql以便我可以更改密码时我得到错误:psql FATAL:could not load pg_hba.conf.
全部在一起.
为什么不加载?我所做的只是添加一个额外的身份验证选项.
Windows用户是否与postresql用户分开,或者它们是否相同(彼此依赖)?
编辑:
正如你所看到的,它没有让我选择Aisha是否应该成为超级用户.或其他选择.
我也用过pgadmin ||| 创建新用户但弹出相同的错误:
用户不存在,为什么这样做?
我尝试写一个大文件,但似乎它不适用于大于2GB的文件.我尝试过boost :: iostreams :: file_sink.这只是增强流的限制吗?还有其他方法我可以在Win64和win32上写一个大文件吗?
win64 ×10
windows ×4
c++ ×2
delphi ×2
python ×2
winapi ×2
32bit-64bit ×1
64-bit ×1
c ×1
delphi-2007 ×1
delphi-xe2 ×1
enchant ×1
file-io ×1
import ×1
memory-leaks ×1
postgresql ×1
rundll32 ×1
visual-c++ ×1