密钥删除后ruby哈希内存泄漏

Ada*_*ent 5 ruby hash memory-leaks memory-management

Helo,我无法成功在哈希中删除键后如何释放内存.当我从Hash中删除密钥时,内存不会被释放,也不会在GC.start手动调用之后.当从Hash中删除密钥并且这些对象在某处泄漏时,这种预期行为或GC是否不释放内存?如何删除Ruby中的Hash键并在内存中取消分配?

例:

irb(main):001:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 4748
irb(main):002:0> a = {}
=> {}
irb(main):003:0> 1000000.times{|i| a[i] = "test #{i}"}
=> 1000000
irb(main):004:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 140340
irb(main):005:0> 1000000.times{|i| a.delete(i)}
=> 1000000
irb(main):006:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 140364
irb(main):007:0> GC.start
=> nil
irb(main):008:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 127076
Run Code Online (Sandbox Code Playgroud)

PS:我使用ruby 1.8.7.我也试过ruby 1.9.2,但并不是更好.

Dig*_*oss 6

请参阅Stackoverflow:Malloc和Free Work的工作原理

出于各种原因(在上面的引文中详细说明),几乎没有内存管理器将内存释放回操作系统.

为了让您了解流程更改,Ruby解释器的底层mallocfreeC部分需要为主机操作系统提供内存.这不会发生,但在Ruby级别,对象已经过GC并且在解释器中位于本地保存的空闲列表中.


Aus*_*lor 1

这些对象应该被垃圾收集。如果您要再次创建它们,该进程不应显着增长,因为它有所有空白空间。然而,Ruby 不会将该内存释放回操作系统,因为它假设将来可能再次需要那么多内存。

这是一个相当简单的解释,但基本上,您所看到的都是正常的。