问题标签 [memory-pool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
43 浏览

c++ - 如何知道内存分配器中项目的父块

我正在设计一个自定义内存分配器,它管理一个包含固定数量项目的大块池。

将从可用块中allocate分配一项未初始化的内存。由于申请,我allocate需要一次处理一件。项目的字节大小为sizeof(T)

deallocate获取一个项目指针并将其ptr回收到分配器。在进行任何内部处理之前,我们需要知道项目的block. 如何在不要求T在其原始块中包含其他卫星指针的情况下执行此操作?

我听说在设计内存分配器时有一些按位技巧以及对齐的内存分配来检索指针块。帮助需要。

0 投票
1 回答
256 浏览

c++ - 如何正确使用 C++11 风格的内存池?

我正在尝试设计一个简单的嵌入式应用程序的内部机制。数据块到达网络,需要传送到由寻址机制确定的组件。多个组件可以订阅同一个地址。我想设计一个架构,其中传入的块被封装到从内存池分配的包装对象中。只要需要,每个组件都可以保留包装器(以及其中的数据),并且在所有组件释放它时应该将其释放。那时它会返回到池中并再次准备好分配。游泳池耗尽不是一个问题。

我打算使用这个满足分配器的内存池实现。对于我计划使用的包装器对象的自动销毁,std::shared_ptr因此当所有组件释放包装器时,它会自动销毁并且使用的内存返回到池中。

我没有看到这两个概念如何结合在一起。如果我直接从池中分配内存(通过调用allocate()),它会给我一个指向数据块的指针,这很好,但是如何deallocate()自动调用呢?或者我是否需要为我的包装对象使用另一个容器,例如std::list并将其传递给内存池分配器?

0 投票
0 回答
47 浏览

c++ - 用于累积多个传感器浮动数据流的无碎片数据结构

我正在消耗每个传感器每秒 20-25 个数据包的传入数据流,具有浮动值(例如温度),并且希望累积并产生每秒 1 个输出数据流。我正在寻找一种(即用型)数据结构来避免碎片化。

换句话说,我猜哈希表和向量在这里不合适,而应该使用分配器感知(以及内存池??)。

0 投票
3 回答
983 浏览

c++ - 如果内存池比 malloc 快,为什么 malloc 不在幕后使用它们?

我一直听说内存池在分配内存时可以显着提高性能。那么为什么传统的 malloc 实现不以某种方式使用它们呢?

我知道部分原因是内存池使用固定大小的内存块,但似乎有些没有,他们唯一需要的就是提前获取一些额外的内存。有没有一种方法可以将它们充分概括用于此类目的?

0 投票
1 回答
79 浏览

c++ - weak_ptr 的自定义分配器

从高CPU使用率RtlpLowFragHeapAllocFromContext()我猜测std::weak_ptr()我经常使用(调用它)应该是不使用内部高效内存池的罪魁祸首,.lock()而是求助于///malloc()家伙。free()newdelete

有没有办法为一个指定自定义分配器std::weak_ptr?如果是,如何?如果不是,为什么?

更新:上传分析器快照 探查器快照

0 投票
0 回答
96 浏览

c++ - 是否有 ac/c++ lib 提供具有类似 stdlib 接口的内存池实现?

我有一个想法,通过 c/c++ 代码创建一个手动管理的连续内存块,并提供如下内容:

然后我可以完全控制分配在这个内存块中的所有数据结构的内存使用,并随时序列化/反序列化整个内存状态。

我搜索了一段时间是否有一些现有的开源库已经实现了这些目标,但由于我对 c/c++ 编程知识的缺乏而没有得到任何结果。所以我在这里寻找一些好运,谢谢。

0 投票
1 回答
438 浏览

sql-server - SQL Server 内部/默认资源池随时间增加

问题

我在安装了单个数据库的客户 VM 上部署了 SQL Server 2017 数据库。该数据库有一个 Web 应用程序,在高峰时间连接到大约 100 个活跃用户。在过去的几个月里,客户不得不在使用 5 天后重新启动 sql server 实例,因为应用程序开始出现性能下降的迹象(有时一个页面需要一秒钟才能加载,而同一个页面可能需要 15 秒)。几个月来我一直在监视查询存储并对查询进行性能优化,但是我仍然无法阻止数据库在本周末遇到性能问题。

当问题出现时(正常运行 5 天后),尽管查询频率和运行查询的类型在一周内完全相同,但服务器显示 CPU 和内存使用率很高。在遇到问题时查看查询存储后,我没有看到任何长时间运行的查询,并且在 CPU 或内存分析图表上没有什么比我在应用程序运行正常时看到的更高。

我注意到的一件事是内部/默认资源池在一周内的使用量增加。重新启动后不久,资源池的使用率看起来很低: 在此处输入图像描述

5 天后,资源池看起来要高得多: 在此处输入图像描述

我注意到,当我运行查询时,资源池会在查询运行时增加,但在查询完成运行后总是会释放内存,这似乎在客户实例上没有正确发生,否则我不明白为什么资源池会随着时间的推移而增加。

问题

资源池使用量是否会随着时间的推移而增加,这可能会导致性能问题?

什么会导致资源池内存不被释放?

我为缓解我们一直面临的性能问题而实施的措施如下:

  1. 打开 READ_COMMITTED_SNAPSHOT 隔离,这有助于缓解应用程序由于锁定而出现无响应的问题。
  2. 设置最大服务器内存以确保它不会使操作系统处于饥饿状态。
  3. 花了几个月的时间优化一堆查询以减少 CPU 持续时间和逻辑读取,还添加了索引,这有一定帮助,但并没有解决我的所有问题。
0 投票
1 回答
43 浏览

c++ - 从固定内存块分配内存字节数组

如何使用boost pool或其他类似的分配器技术从固定的内存块分配连续的 512 字节扇区。我正在尝试在 C++17 中模拟内存文件系统。

我假设在幕后,当用户创建指定长度的新文件时,可以使用单独的文件系统元数据对象将文件名与此内存块/池中的根指针/长度节点相关联。

如果在小于当前长度的指定偏移量处附加或截断文件,则需要从上述根节点添加或删除额外的链表节点。碎片整理会很好但可选。鉴于最小扇区分配大小为 512 字节,如果扇区未完全使用,小分配/附加到文件可能不需要添加额外的链表节点。

我不确定我上面描述的内容是否作为一个简单的库存在,或者提升池是否按原样为我做这件事。我只想分配字节块,而不是对象数组。

0 投票
2 回答
136 浏览

c - 是否可以在不违反严格别名的情况下将字符数组用作内存池?

我有一个静态分配的字符数组。我可以在不违反严格的别名规则的情况下重用这个数组来存储不同的类型吗?我不太了解严格的别名,但这是一个执行我想做的代码示例:

我已经使用 gcc 编译了这段代码-Wstrict-aliasing=3 -fstrict-aliasing,它按预期工作:

那个代码安全吗?假设memory_pool总是足够大。

0 投票
1 回答
166 浏览

go - 使用 goroutine 修复 go 程序的内存消耗

我正在研究一个涉及生产者-消费者模式的问题。我有一个生产任务的生产者和消费任务的“n”个消费者。消费者任务是从文件中读取一些数据,然后将该数据上传到 S3。一位消费者可以读取多达 xMB(8/16/32) 的数据,然后将其上传到 s3。将所有数据保留在内存中导致内存消耗超过程序的预期,因此我切换到从文件中读取数据,然后将其写入某个临时文件,然后将文件上传到 S3,尽管这在内存方面,但CPU受到了打击。我想知道是否有任何方法可以一次分配固定大小的内存,然后在不同的 goroutines 中使用它?我想要的是,如果我有 4 个 goroutine,那么我可以分配 4 个不同的 xMB 数组,然后在每个 goroutine 调用中使用相同的数组,这样 goroutine 就不会每次都分配内存,也不依赖于GC释放内存?

编辑:添加我的代码的症结。我的消费者看起来像:

我从基于块的文件中读取数据,这个块可以包含几个受xMB限制的小块或一大块xMB。

Edit2:根据评论中的建议尝试了 sync.Pool。但我没有看到内存消耗有任何改善。难道我做错了什么?