在最近的一篇文章中(我的程序为什么从不释放内存?),我展示了使用FastMM时,应用程序不会将大量内存释放回系统。最近,我创建了一个人工测试程序,以确保这个问题不是内存问题,并且只出现在FastMM中。
在这个程序中,我创建并销毁一个对象(与之前的帖子中使用的对象相同)500次。 内存要求为(“私有工作集”): 没有使用FastMM
循环运行之前:1.2MB
循环运行之后:2.1MB
使用FastMM(调试模式)
循环运行之前:2.1MB
循环运行之后:25MB
使用FastMM(发布模式)
循环运行之前:1.8MB
循环运行之后:3MB
如果我多次运行循环,内存需求不会增加。这意味着未释放的内存被重新使用,因此这不是内存泄漏(内存泄漏会在每次运行时增加几KB / MB的内存占用)。
我的问题是:
如何在FastMM中禁用此行为?是否可能?我知道,如果我使用FastMM Release Mode或不使用FastMM发布程序,它将“浪费”适度的RAM。但是,按需禁用此行为将帮助我(我们?)识别内存泄漏。实际上,在我的第一篇文章中(请参见链接),许多人建议我有一个泄漏。显然,这种行为引起了混乱。不,很明显没有泄漏。只是内存管理器拒绝释放大量内存。
它会释放额外的内存吗?什么时候?什么触发器?程序员可以触发它吗?例如,当我知道我完成了一个RAM密集型任务并且用户可能一段时间内不使用程序(最小化它)时,我可以将RAM刷新回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺RAM吗?
在这个程序中,我创建并销毁一个对象(与之前的帖子中使用的对象相同)500次。 内存要求为(“私有工作集”): 没有使用FastMM
循环运行之前:1.2MB
循环运行之后:2.1MB
使用FastMM(调试模式)
循环运行之前:2.1MB
循环运行之后:25MB
使用FastMM(发布模式)
循环运行之前:1.8MB
循环运行之后:3MB
如果我多次运行循环,内存需求不会增加。这意味着未释放的内存被重新使用,因此这不是内存泄漏(内存泄漏会在每次运行时增加几KB / MB的内存占用)。
我的问题是:
如何在FastMM中禁用此行为?是否可能?我知道,如果我使用FastMM Release Mode或不使用FastMM发布程序,它将“浪费”适度的RAM。但是,按需禁用此行为将帮助我(我们?)识别内存泄漏。实际上,在我的第一篇文章中(请参见链接),许多人建议我有一个泄漏。显然,这种行为引起了混乱。不,很明显没有泄漏。只是内存管理器拒绝释放大量内存。
它会释放额外的内存吗?什么时候?什么触发器?程序员可以触发它吗?例如,当我知道我完成了一个RAM密集型任务并且用户可能一段时间内不使用程序(最小化它)时,我可以将RAM刷新回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺RAM吗?