最近我创建了一个人工测试程序,以确保它不是一个内存的问题,它只出现在FastMM中.
在这个程序中,我创建并销毁一个对象(与前一篇文章中使用的对象相同)500次.
内存要求是(“私人工作集”):
没有FastMM
在运行循环之前:1.2MB
运行循环后:2.1MB
使用FastMM(积极的调试模式)
在运行循环之前:2.1MB
运行循环后:25MB
使用FastMM(发布模式)
在运行循环之前:1.8MB
运行循环后:3MB
如果我多次运行循环,则内存要求不会增加.这意味着重新使用未释放的内存,因此这不是内存泄漏(内存泄漏会增加内存占用,每次运行时会有几KB / MB).
我的问题是:
如何在FastMM中禁用此行为?它甚至可能吗?我知道,如果我在没有FastMM或FastMM发布模式的情况下发布程序,它将“浪费”适量的RAM.但是,根据需要禁用此行为,将帮助我(我们?)识别内存泄漏.实际上在我的第一篇文章中(见链接),很多人都认为我有泄漏.由于这种行为,显然造成了混乱.不,很明显没有泄漏.只是内存管理器拒绝释放大量内存.
它会释放额外的内存吗?什么时候?什么引发了这个?程序员可以触发吗?例如,当我知道我已完成RAM密集型任务并且用户可能暂时不使用该程序(最小化它)时,我可以将RAM刷回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺内存吗?
解决方法
你说你继续在循环中重新运行相同的操作.当你这样做时,它仍然有可用的旧内存,它可以立即分配它,而不必向Windows请求一大堆新的堆.这是将“Fast”置于“FastMM”中的技巧之一,如果它没有这样做,你会发现你的程序运行得慢得多.
您无需担心FastMM调试模式图.这只是用于调试,并且您不会发布针对FullDebugMode编译的程序. “不使用FastMM”和“使用FastMM发布模式”之间的差异大约为1 MB,这在现代硬件上可以忽略不计.对于仅额外1 MB的低成本,您可以获得巨大的性能提升.所以不要担心.