- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我读了
For CPython, id(x) is the memory address where x is stored.
而且对象的 id
是给定的,它永远不会改变,这意味着对象在其生命周期中始终存储在给定的内存地址中。这就引出了一个问题:(虚拟)内存碎片怎么办?
假设一个对象A
在地址1(有id
1),占用10个字节,所以它占用地址1-10。对象 B
的 id
为 11,占用字节 11-12,对象 C
占用地址 13-22。一旦 B 超出范围并获得 GC,我们就会产生碎片。
这个难题是如何解决的?
最佳答案
CPython 为小对象使用它自己的内存分配器,pymalloc-allocator .在 code itself 中可以找到很好的描述.
这个分配器非常擅长避免内存碎片,因为它有效地重用了释放的内存。然而,这只是一种启发式方法,人们可能会想出导致内存碎片的场景。
让我们来玩一下当我们分配一个大小为 1 字节的对象时会发生什么。
对于小于 512 字节的对象,CPython 有自己所谓的 arena。显然,1 字节请求将由其分配器管理。
请求的大小分为 64 个不同的类别:第 0 类是 1..8 字节的大小,第 1 类是 9..16 字节的大小等等 - 这是由于需要对齐 8 字节.上述每个类都有自己或多或少的独立/专用内存。我们要求的是 0 等舱。
让我们假设这是对该尺寸等级的第一个请求。将创建一个新的“池”或重新使用一个空池。池是 4KB big ,因此有 512 个 8 字节“ block ”的空间。尽管请求只有 1 个字节,但我们将阻塞占用 block 的另外 7 个字节,因此它们不能用于其他对象。所有空闲 block 都保存在一个列表中——一开始所有 512 个 block 都在这个列表中。分配器从这个空闲 block 列表中删除第一个 block 并将其地址作为指针返回。
池本身被标记为“已用”并添加到第 0 级已用池列表中。
现在,分配另一个大小 <=8 字节的对象发生如下。首先,我们查看 0 级已用池列表,并会找到一个已在使用的池,即有一些已用 block 和一些空闲 block 。分配器使用第一个空闲 block ,将其从空闲 block 列表中删除并返回其地址作为指针。
删除第一个对象很容易——我们将占用的 block 添加为(到目前为止是单个)已用池中空闲 block 列表的头部。
当创建一个 8 字节的新对象时,将使用空闲 block 列表中的第一个 block ,这是第一个现在已删除的对象使用的 block 。
如您所见,内存得到重用,因此内存碎片大大减少。这并不意味着不能有内存碎片:
分配 512 个 1 字节对象后,第一个池变“满”,将创建/使用第 0 类大小的新池。我们还添加了另外 512 个对象,第二个池也变得“满”。等等。
现在,如果前 511 个元素被删除 - 仍然会有一个字节阻塞整个 4KB,不能用于其他类。
只有当最后一个 block 被释放时,池才变为“空”,因此可以重新用于其他大小级别。
空池不会返回给操作系统,而是留在竞技场中并被重用。但是,pymalloc manages multiple arenas ,并且如果竞技场变为“未使用”,则它可能会被释放并将占用的内存(即池)返回给操作系统。
关于python - CPython的静态对象地址和分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998210/
我是ElasticSearch的新手,并且一直在使用它的功能。 我在单个计算机上运行单个节点(master = true,data = true)。我创建一个索引,其中包含3个分片和每个分片1个副本。
我们在14个节点的集群中具有嵌入式Elasticsearch的Java应用程序。所有数据都驻留在中央数据库中,并在elasticsearch中对其进行索引以进行查询。完整的索引编制可以随时进行。 系统
我是 MongoDB 的新手,我想了解这两种技术如何协同工作: 当为你的数据库使用复制时,你有一个主节点和一堆辅助节点。为了保证一致性,建议大家始终从主节点读取,对吧? 因此,当您将复制与分片结合使用
有人告诉我,在一台更强大的机器上使用 100 个分片实现 mongodb 分片以实现更高的并发写入数据库是否有意义,每个 monogod.exe 进程都有一个全局锁?假设这是可能的,这种方法会给我更高
我有一个带有 4x 分片的生产 mongodb 部署 (3.6),它运行良好。我想向集群中添加 4 倍以上的分片。一次添加多个分片是否可以,或者这会引起戏剧性事件吗?我发现添加分片是一项昂贵的操作,在
假设在您的 Web 应用程序中,您需要调用多个 Redis 来呈现页面,例如获取一堆用户哈希。为了加快速度,您可以将 redis 命令包装在 MULTI/EXEC 部分,从而使用流水线,从而避免进行多
我正在查看ES文档,并看到以下内容 Each shard is in itself a fully-functional and independent "index" that can be hos
我有一个 Multi-Tenancy 系统,并且我正在尝试设计ElasticSearch以支持 Multi-Tenancy 。我已经在网上搜索过,但是我发现的所有帖子在实践中均未指定具体操作方法。 基
我已经在 kuberenetes 中使用散列分片设置了分片 MongoDB 集群。我首先创建了配置服务器 Replicaset,然后创建了 2 个分片副本集。最后创建了mongos来连接分片集群。 我
我在调试父子关系查询时遇到问题。我想知道调试问题的方法,而不是简单地发布我的映射、数据、查询并询问问题所在(但我最终保留这样做的权利!)。 为此,首先要检查我的 child 和关联的 parent 是
我正在启动一个 Django 项目,需要对多个可能包含太多行的表进行分片。我浏览了这里和其他地方的线程,并遵循了 Django 多数据库文档,但我仍然不确定它们是如何缝合在一起的。我的模型具有会被分片
我正在尝试使用 docker 创建 mongo 分片.我有: 配置服务器: docker run -it --rm --net=xnet -p 27016:27016 \ --hostname
我正在尝试在一台机器上配置分片,但在尝试添加分片时我不断收到错误消息。我使用以下网站作为引用:http://www.javahotchocolate.com/notes/mongodb-shardin
我刚接触 mongodb。由于我必须存储 +-5000 万份文档,我不得不设置一个带有两个副本集的 mongodb 分片集群 文档看起来像这样: { "_id" : "predefined_u
目前我们运行一个包含 2 个服务器 + 1 个仲裁器的 MongoDB 复制集。 我们在副本集的数据库中存储了大约 150 GB 的数据。 现在我们正在考虑何时开始分片。因为我们想知道是否存在不能再开
我需要并行处理某些项目,所以我使用 TPL Dataflow。 .要注意的是,共享相同键(类似于字典)的项目应按 FIFO 顺序处理,而不是彼此平行(它们可以与具有不同值的其他项目平行)。 正在完成的
问题涉及redis的分片配置。我已经用 Java 实现了一个小型测试应用程序,它以 user:userID 的形式在 Jedis 上创建了 100.000 个用户哈希。每个散列都有元素:姓名、电话、部
您好,我将使用多个 Redis 实例和实例之间的一些分片。 我的问题是,如果加载网页需要访问多个分片,性能是否会受到[明显的影响]。 我的基本概述是在多个 Redis 分片之间实现负载平衡*下面的脚注
Predis 声称拥有客户端分片(支持键的一致性散列)。 http://github.com/nrk/predis 我可以使用连接到一组配置文件(节点)来进行分片,但它不是一致的哈希。当我将另一个节点
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!