CPython 的垃圾收集是否进行压缩?
Does CPython's garbage collection do compaction?
我和一个朋友聊天,比较语言,他提到 Java 的自动内存管理优于 Python,因为 Java 的压缩,而 Python 没有 - 因此对于长 运行 服务器,Python 是一个糟糕的选择。
先不说是好是坏,他的说法是真的吗——CPython 的垃圾收集器不是压缩内存,因此,long-运行 Python 进程随着时间的推移越来越分散?
我知道 运行 CPython 的垃圾收集器是可选的。大多数情况下,它使用自动引用计数来进行自动内存管理,一旦引用计数为零,就会释放对象——因此,就释放对象而言,CPython 的垃圾收集器唯一需要做的事情, 是检测根集中没有对象引用的循环。但我不知道除此之外是否有任何压缩的细节。
如果没有,那么 long-运行 CPython 进程如何解决内存碎片问题?
我不确定,但 CPython 使用 reference counting and its objects use memory addresses as ids so I would say it does not do compaction... And according to this,“[C]Python 不使用内存压缩 ... [w] 会 Python 使用内存压缩,实现 C 扩展
更乏味和容易出错,这样的事情会更少
扩展 - 限制使用 Python 的域。"
我和一个朋友聊天,比较语言,他提到 Java 的自动内存管理优于 Python,因为 Java 的压缩,而 Python 没有 - 因此对于长 运行 服务器,Python 是一个糟糕的选择。
先不说是好是坏,他的说法是真的吗——CPython 的垃圾收集器不是压缩内存,因此,long-运行 Python 进程随着时间的推移越来越分散?
我知道 运行 CPython 的垃圾收集器是可选的。大多数情况下,它使用自动引用计数来进行自动内存管理,一旦引用计数为零,就会释放对象——因此,就释放对象而言,CPython 的垃圾收集器唯一需要做的事情, 是检测根集中没有对象引用的循环。但我不知道除此之外是否有任何压缩的细节。
如果没有,那么 long-运行 CPython 进程如何解决内存碎片问题?
我不确定,但 CPython 使用 reference counting and its objects use memory addresses as ids so I would say it does not do compaction... And according to this,“[C]Python 不使用内存压缩 ... [w] 会 Python 使用内存压缩,实现 C 扩展 更乏味和容易出错,这样的事情会更少 扩展 - 限制使用 Python 的域。"