内存使用率上升.释放的内存不会被重复使用
Memory usage going up. Memory released is not being reused
我正在使用debug_new来查找内存泄漏。我正在删除我的对象,debug_new没有显示任何我泄露它们的痕迹。
我读过几篇关于内存碎片的文章。但我还是很困惑。在这一点上,我正在测试我的框架,我正在做一个简单的测试。我创建了一个这样的新对象:
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space)){
artemis::Entity& e = world->createEntity();
e.addComponent(new PositionComponent(posX,posY));
e.addComponent(new MovementComponent(500,0));
e.addComponent(new SpriteComponent(TextureManager::getInstance().getTexture("bullet.png")));
e.addComponent(new ColliderComponent(10,10));
e.refresh();
e.setGroup("BULLET");
}
这些"组件"在一个名为"EntityManager"的管理器中进行管理,该管理器重用实体对象,但在将实体发送回"池"时销毁组件。我已经对此进行了测试,如果池中没有可用的实体,则只生成新的实体。
正如您可以从上面的代码中看到的那样。在这个简单的测试中,模式是相同的。然而,分配器一直在使用新内存,而不是重用任何以前使用过的内存。每空格键点击几千次(每帧1/60次)导致我的记忆进入了2吉的范围。组件甚至没有那么大。例如:
class ColliderComponent : public artemis::Component{
public:
int width,height,collidionsId;
ColliderComponent(int width, int height){
this->width = width;
this->height = height;
}
};
到目前为止,大多数组件都是int的简单"集合"。它们很轻。它肯定应该重用一些以前分配/释放的内存。但事实并非如此。
也许我错过了什么。有人对可能发生的事情有不同的想法吗?有什么好的(免费的)内存评测器吗?如果不是因为我的组件,缺陷一定在其他地方。在这一点上,我根本看不出来,至少可以说这很令人沮丧。
编辑:看起来我忽略了另一个导致大泄漏的部分。这显然是我自己的一个愚蠢的错误。
这就是罪魁祸首:e.setGroup("BULLET");
"BULLET"被保存为指针(我应该重新设计它),并覆盖实体id索引处现有字符串的指针。我不知道为什么我忽略了这一点,但我的内存分配现在稳定了!
我本可以使用聪明的指针,但到目前为止,我从中学到了很多!我觉得我已经取得了一些成就=D
我在ColliderComponent
中没有看到重载的new
运算符,这让我相信您总是从堆中进行分配,并将内存提供给EntityManager
。这看起来肯定像是一个泄漏,一旦你的EntityManager
被破坏,它就会消失。
编辑:我现在更了解您的代码是如何工作的。组件不由EntityManager
缓存,只有Entity
缓存。
您说过您正在使用任务管理器来评估内存消耗——大多数内存管理器不会立即将释放的内存返回到操作系统(这是一项相当昂贵的操作),而是保留可用内存供应用程序本身使用。因此,你的应用程序的内存管理器(它是C++运行时的一部分)将把你释放的块标记为免费的,并且可以在以后收到另一个内存请求时重用它。
这具有性能优势,因为运行时的内存管理器不必经常调用操作系统来释放然后重新获取内存。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 从 C++11 代码中获取系统内存和 CPU 使用率
- 加载时间,遍历时间,不同数据段C/C 的内存使用率
- 使用 PID 获取内存和 CPU 使用率
- Linux:如何测量进程中线程的内存使用率
- 当CPU使用率高时,OpenCV会堆积内存吗
- Win32 C++中的DrawText会增加内存使用率
- Boost managed_mapped_file:设置允许的最大内存使用率
- 远程电脑的 CPU 使用率和内存状态
- STXXL的高内存使用率
- 内存使用率上升.释放的内存不会被重复使用
- Visual C++矢量擦除增加了内存使用率
- C、 所有平台中进程的C++CPU使用率和内存使用率+当前时间的可用网络下行链路带宽
- 具有低内存使用率的自平衡AVL树
- 内存池:对于大于缓存行大小的结构体,它们会提高缓存使用率吗?
- 在内存不增加的情况下逐渐提高cpu使用率.的想法