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,但并不是更好.
请参阅Stackoverflow:Malloc和Free Work的工作原理
出于各种原因(在上面的引文中详细说明),几乎没有内存管理器将内存释放回操作系统.
为了让您了解流程更改,Ruby解释器的底层malloc
和free
C部分需要为主机操作系统提供内存.这不会发生,但在Ruby级别,对象已经过GC并且在解释器中位于本地保存的空闲列表中.
这些对象应该被垃圾收集。如果您要再次创建它们,该进程不应显着增长,因为它有所有空白空间。然而,Ruby 不会将该内存释放回操作系统,因为它假设将来可能再次需要那么多内存。
这是一个相当简单的解释,但基本上,您所看到的都是正常的。
归档时间: |
|
查看次数: |
1445 次 |
最近记录: |