背景
我的团队正在试图追踪我们的rails 6.1应用程序中的内存泄漏。我们使用了here描述的技术,即获取三个连续的堆转储并对它们进行差异处理。我们使用rbtrace获取转储文件,使用rbheap进行差异处理。我们尝试了几次,样本之间的间隔不同。
版本:
- Rails 6.1.6.1
- Ruby 3.0.3
结果
比较结果中大约85%的结果类似于下面显示的示例。它们与ActiveRecord的数值验证有关,我们在我们的一个模型中使用了它。这是验证的源代码。奇怪的是,这些分配是IMEMO对象,根据article存储有关编译代码的信息。
我们模型中的验证
validates :msrp, numericality: { less_than_or_equal_to: MAX_INT }, allow_nil: true
IMEMO对象分配示例
{
"address": "0x5632f3df7588",
"type": "IMEMO",
"class": "0x5632f654de48",
"imemo_type": "callcache",
"references": ["0x5632f654dbc8"],
"file": "/app/vendor/bundle/ruby/3.0.0/gems/activerecord-6.1.6.1/lib/active_record/validations/numericality.rb",
"line": 10,
"method": "validate_each",
"generation": 9233,
"memsize": 40,
"flags": {
"wb_protected": true,
"old": true,
"uncollectible": true,
"marked": true
}
}
{
"address": "0x5632f3e0f070",
"type": "IMEMO",
"class": "0x5632f7dc23d0",
"imemo_type": "callinfo",
"file": "/app/vendor/bundle/ruby/3.0.0/gems/activerecord-6.1.6.1/lib/active_record/validations/numericality.rb",
"line": 10,
"method": "validate_each",
"generation": 6225,
"memsize": 40,
"flags": {
"wb_protected": true,
"old": true,
"uncollectible": true,
"marked": true
}
}
问题
1.有没有人目睹过与ActiveRecord验证相关的类似内存泄漏行为?
1.有没有人知道为什么同一行代码分配和泄漏了这么多IMEMO对象?
1条答案
按热度按时间uklbhaso1#
这看起来像是转移注意力的鲱鱼。我们删除了验证,但仍然看到相同的内存增长。随后的堆比较显示了与其他方法不同的更多IMEMO对象。