ActiveRecord验证是否会泄漏IMEMO对象?

yzuktlbb  于 2022-10-15  发布在  Ruby
关注(0)|答案(1)|浏览(90)

背景

我的团队正在试图追踪我们的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对象?

uklbhaso

uklbhaso1#

这看起来像是转移注意力的鲱鱼。我们删除了验证,但仍然看到相同的内存增长。随后的堆比较显示了与其他方法不同的更多IMEMO对象。

相关问题