Tab*_*asa 4 c++ memory memory-management vector
所以我在我的程序中运行了一个内存使用测试,我在每个帧(~60fps)中每个向两个单独的向量添加20个元素.我预计在某些时候我会开始看到内存泄漏,但是在某个临界点之前内存使用量保持不变.总共大约700,000个元素飙升,然后在新的高原再次平稳.
我有一种感觉,这与在那时自动增加的矢量分配有关,但我不确定,也无法在网上找到任何东西.它也不能真正解释为什么在这一点上分配了如此多的额外内存(CPU上的专用字节数从~800跳到~900,系统GPU内存从~20跳到~140).以下是CPU和GPU的Process Explorer图:

注意:CPU和GPU使用率的下降来自于我在看到峰值后暂停程序.
任何人都可以向我解释这个吗?
编辑:这是一个更简单,更通用的测试:

总使用量明显低很多,但想法相同.
将元素添加到空向量时,它将new为多个元素分配足够的空间.像16也许.这样做是因为将数组调整到较大的缓冲区很慢,因此它分配的数量超过了它的需要.如果它为16个元素分配空间,这意味着你可以在需要打扰另一个调用之前再推回15个元素new.每次它增长得更多.如果你有500个元素(并且它不在房间里)并再推回一个,它可能会分配750个空间.或者甚至可能是1000个.或者2000个.充足的空间.
事实证明,当您(或向量)调用时new,您可以从程序的内存管理器中获取此信息.如果程序的内存管理器没有足够的可用内存,它将向操作系统询问大量内存,因为操作系统调用本身很慢,并且处理页面映射的速度很慢.因此,当vector请求空间用于200字节时,程序的内存管理器实际上可能会抓取65536个字节,然后只给出200个向量,并将剩余的65336个字节保存到下一个调用中new.因此,new在您不得不再次打扰操作系统之前,您(或矢量)可以多次调用,事情进展得很快.
但这有副作用:操作系统实际上无法判断程序实际使用了多少内存.它只知道你从中分配了65536,所以它会报告.当您向后推送向量中的元素时,向量最终会耗尽容量,并从程序的内存管理器中请求更多.而且它越来越多,并且操作系统报告相同的内存使用情况,因为它无法看到.最终内存管理器的容量耗尽,并要求操作系统提供更多功能.操作系统分配另一个巨大的块(65536?131072?),你会看到内存使用量突然大幅增加.
没有设置发生这种情况的向量大小,它取决于还分配了什么,以及它们被分配和取消分配的顺序.即使是你delete仍然影响事物的东西,它也非常复杂.此外,矢量增长的速率取决于您的库实现,以及程序的内存管理器从操作系统获取的内存量也会根据我不知道的因素而变化.
我不知道为什么GPU的内存会飙升,这取决于你对程序的处理方式.但是请注意,有较少的GPU内存总量,这是完全有可能的是增加了一个小的比"专用字节"的金额.
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |