据我所知cpython 具有GC,但不支持内存压缩,这意味着长时间运行的python进程可能遭受高内存碎片/消耗。
我已经阅读了有关该主题的几个主题:
https://lists.gt.net/python/python/1163027#1163027
https://lists.gt.net/python/python/1162114
https://dzone.com/articles/python-memory-issues-tips-and-tricks
如果我正确理解了前两个线程,那么问题就出在Python中的C内存分配器如何工作。
如果Java热点也用C编写,怎么可能会成为问题?我想念什么?
为什么cpython GC不支持内存压缩,据我所知,没有计划引入它?
问题不是CPython的内存分配器,而是CPython的C API。 Java的本机接口(JNI)经过精心设计,可将用户与虚拟机实现细节(例如垃圾收集)隔离开。相比之下,CPython的C API公开了其更多实现,包括内存布局和引用计数。引用计数已写入所有已编写的C扩展中。可以在具有不同GC设计的VM上仿真CPython API(PyPy的cpyext支持可以做到这一点),但是这种仿真并不完美,并且会增加开销。