gpt4 book ai didi

ruby - File.realpath() 是否泄漏内存?

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:57 25 4
gpt4 key购买 nike

我在使用 File.realpath() 时遇到问题,留下的字符串似乎没有被垃圾收集。在我看来,这像是内存泄漏,但我无法想象这样的事情对于核心库方法来说真的是真的。

考虑以下代码:

def string_test(string)
puts string
end


GC.start
report = MemoryProfiler.report do
s = './foo.txt'.freeze
string_test(s)
s = nil
GC.start
end
report.pretty_print

这会产生(以及其他冗长的输出):

Total allocated: 0 bytes (0 objects)
Total retained: 0 bytes (0 objects)

到目前为止一切顺利,调用 string_test() 方法似乎没有剩余内存使用。但是,如果我更改方法来解析相对路径,如下所示:

def string_test(string)
puts File.realpath(string)
end

我从 MemoryProfiler 得到以下输出:

Total allocated: 128 bytes (2 objects)
Total retained: 88 bytes (1 objects)
.
.
.
Retained String Report
-----------------------------------
1 "/home/asdfjk/tmp/foo.txt"
1 t:28

foo.txt 是指向实际文件的符号链接(symbolic link)。我不知道这是否相关。似乎 File.realpath() 留下了字符串的副本。将其汇总到数十万个文件中,会占用大量内存。任何人都可以帮助我了解这里发生了什么以及可能如何解决它吗?

另一个有趣的花絮是,在第一个示例(没有泄漏的那个)中,字符串 s 必须被卡住,否则结果与包括调用 File.realpath() 的版本相同。

最佳答案

我使用 ruby 2.5.1p57(2018-03-29 修订版 63029)[x86_64-darwin18] 和文件 ./foo.txt 进行了测试,这是一个符号链接(symbolic link)也是 ./foo.

如果我们将您的示例缩减到最低限度,那么答案是否定的,File.realpath 中没有内存泄漏:

require 'memory_profiler'
MemoryProfiler.report { puts File.realpath('./foo.txt') }.pretty_print
<snip>
Retained String Report
-----------------------------------

您看到的问题归结为您对 GC.start.freeze 的调用以及 MemoryProfiler 测量方式的组合这些东西在一个代码块中。

至于为什么puts stringputs File.realpath(string)行为不同,puts string读取string的值 并将其打印到控制台; puts File.realpath(string) 创建一个新的 String 对象,然后将其打印到控制台。

关于ruby - File.realpath() 是否泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51955974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com