模块 GC
GC 模块提供了 Ruby 的标记清除垃圾回收机制的接口。
一些底层方法也可以通过 ObjectSpace
模块使用。
您可以通过 GC::Profiler 获取有关 GC 操作的信息。
公共类方法
源代码
# File gc.rb, line 318 def self.config hash = nil return Primitive.gc_config_get unless hash if(Primitive.cexpr!("RBOOL(RB_TYPE_P(hash, T_HASH))")) if hash.include?(:implementation) raise ArgumentError, 'Attempting to set read-only key "Implementation"' end Primitive.gc_config_set hash else raise ArgumentError end end
设置或获取当前 GC 配置的信息。
配置参数是特定于 GC 实现的,可能会在不通知的情况下更改。
可以不带参数调用此方法,以检索当前的配置,作为带有 Symbol
键的 Hash
。
也可以使用 Hash
参数调用此方法,以将值分配给有效的配置键。传递的 Hash
中缺少的配置键将保持不变。
如果传递给此函数的键/值对与正在使用的 GC 实现的有效配置键不对应,则不会更新任何配置,该键将存在于返回的 Hash
中,并且其值为 nil
。这是为了方便在 GC 实现之间轻松迁移。
在两个调用序列中,GC.config
的返回值将是一个 Hash
,其中包含最新的完整配置,即由正在使用的特定 GC 实现定义的所有键和值。在配置更新的情况下,返回值将包括正在更新的新值。
此方法仅有望在 CRuby 上工作。
GC 实现无关的值¶ ↑
GC.config
哈希还可以包含全局且只读的键。这些键不特定于任何一个 GC 库实现,尝试写入它们会引发 ArgumentError
。
当前只有一个全局只读键
- implementation
-
返回一个
String
,其中包含当前加载的 GC 库的名称,如果已使用RUBY_GC_LIBRARY
加载了 GC 库,则返回该名称,否则在所有其他情况下返回“default”
GC 实现特定的值¶ ↑
GC 库应记录它们自己的配置。Ruby 的默认 GC 实现的有效键为
- rgengc_allow_full_mark
-
控制是否允许 GC 运行完全标记(年轻和旧对象)。
当为
true
时,GC 会交错执行主要和次要的回收。这是默认设置。GC 将按预期运行。当为
false
时,除非用户代码明确请求,否则 GC 将永远不会触发完全标记周期。相反,只会运行次要标记,只会标记年轻对象。当堆空间耗尽时,将立即分配新页面,而不是运行完全标记。将设置一个标志,以通知已请求完全标记。可以使用
GC.latest_gc_info(:needs_major_by)
访问此标志用户可以随时使用
GC.start(full_mark: true)
触发主要回收当为
false
时,将禁用年轻对象到旧对象的提升。出于性能原因,建议在将此参数设置为false
之前,使用Process.warmup
来预热应用程序。
源代码
# File gc.rb, line 100 def self.count Primitive.gc_count end
返回自进程启动以来发生 GC 的次数。
源代码
# File gc.rb, line 66 def self.disable Primitive.gc_disable end
禁用垃圾回收,如果垃圾回收已被禁用,则返回 true
。
GC.disable #=> false GC.disable #=> true
源代码
# File gc.rb, line 54 def self.enable Primitive.gc_enable end
启用垃圾回收,如果之前已禁用垃圾回收,则返回 true
。
GC.disable #=> false GC.enable #=> true GC.enable #=> false
源代码
# File gc.rb, line 346 def self.latest_gc_info hash_or_key = nil if hash_or_key == nil hash_or_key = {} elsif Primitive.cexpr!("RBOOL(!SYMBOL_P(hash_or_key) && !RB_TYPE_P(hash_or_key, T_HASH))") raise TypeError, "non-hash or symbol given" end Primitive.cstmt! %{ return rb_gc_latest_gc_info(hash_or_key); } end
返回有关最近一次垃圾回收的信息。
如果给出参数 hash
且为 Hash
对象,则会覆盖该对象并返回。这是为了避免探测效应。
如果给出参数 key
且为 Symbol
对象,则返回与该键关联的值。这等效于 GC.latest_gc_info[key]
。
源代码
# File gc.rb, line 376 def self.measure_total_time Primitive.cexpr! %{ RBOOL(rb_gc_impl_get_measure_total_time(rb_gc_get_objspace())) } end
返回 measure_total_time
标志(默认值:true
)。请注意,测量会影响应用程序的性能。
源代码
# File gc.rb, line 364 def self.measure_total_time=(flag) Primitive.cstmt! %{ rb_gc_impl_set_measure_total_time(rb_gc_get_objspace(), flag); return flag; } end
启用测量 GC 时间。您可以使用 GC.stat(:time)
获取结果。请注意,GC 时间测量可能会导致一些性能开销。
源代码
# File gc.rb, line 35 def self.start full_mark: true, immediate_mark: true, immediate_sweep: true Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false end
启动垃圾回收,即使手动禁用也是如此。
full_mark
关键字参数确定是否执行主要垃圾回收周期。当设置为 true
时,将运行主要垃圾回收周期,这意味着将标记所有对象。当设置为 false
时,将运行次要垃圾回收周期,这意味着仅标记年轻对象。
immediate_mark
关键字参数确定是否执行增量标记。当设置为 true
时,将在调用此方法期间完成标记。当设置为 false
时,标记将在与未来 Ruby 代码执行交错的步骤中执行,因此标记可能不会在此方法调用期间完成。请注意,如果 full_mark
为 false
,则无论 immediate_mark
的值如何,标记都将始终是立即的。
immediate_sweep
关键字参数确定是否延迟清除(使用惰性清除)。当设置为 false
时,清除将在与未来 Ruby 代码执行交错的步骤中执行,因此清除可能不会在此方法调用期间完成。当设置为 true
时,将在调用此方法期间完成清除。
注意:这些关键字参数是特定于实现和版本的。它们不能保证未来兼容,如果底层实现不支持它们,则可能会被忽略。
源代码
# File gc.rb, line 184 def self.stat hash_or_key = nil Primitive.gc_stat hash_or_key end
返回包含有关 GC 信息的 Hash
。
哈希的内容是特定于实现的,并且可能会在未来更改,恕不另行通知。
哈希包括有关 GC 的内部统计信息,例如
- count
-
自应用程序启动以来运行的垃圾回收总次数(计数包括次要和主要垃圾回收)
- time
-
在垃圾回收中花费的总时间(以毫秒为单位)
- heap_allocated_pages
-
:heap_eden_pages
+:heap_tomb_pages
的总数 - heap_sorted_length
-
可以放入保存对所有页面引用的缓冲区的页面数
- heap_allocatable_pages
-
应用程序可以分配而无需额外 GC 的页面总数
- heap_available_slots
-
所有
:heap_allocated_pages
中的插槽总数 - heap_live_slots
-
包含活动对象的插槽总数
- heap_free_slots
-
不包含活动对象的插槽总数
- heap_final_slots
-
具有要运行的挂起终结器的插槽总数
- heap_marked_slots
-
在上次 GC 中标记的对象总数
- heap_eden_pages
-
包含至少一个活动插槽的页面总数
- heap_tomb_pages
-
不包含任何活动插槽的页面总数
- total_allocated_pages
-
自应用程序启动以来分配的累积页面数
- total_freed_pages
-
自应用程序启动以来释放的累积页面数
- total_allocated_objects
-
自应用程序启动以来分配的累积对象数
- total_freed_objects
-
自应用程序启动以来释放的累积对象数
- malloc_increase_bytes
-
在堆上为对象分配的内存量。由任何 GC 减少
- malloc_increase_bytes_limit
-
当
:malloc_increase_bytes
超过此限制时,会触发 GC - minor_gc_count
-
自进程启动以来运行的次要垃圾回收总次数
- major_gc_count
-
自进程启动以来运行的主要垃圾回收总次数
- compact_count
-
自进程启动以来运行的压缩总次数
- read_barrier_faults
-
在压缩期间触发读取屏障的总次数
- total_moved_objects
-
压缩移动的对象总数
- remembered_wb_unprotected_objects
-
没有写入屏障的对象总数
- remembered_wb_unprotected_objects_limit
-
当
:remembered_wb_unprotected_objects
超过此限制时,将触发主要 GC - old_objects
-
至少经过 3 次垃圾回收的活动旧对象的数量
- old_objects_limit
-
当
:old_objects
超过此限制时,将触发主要 GC - oldmalloc_increase_bytes
-
在堆上为对象分配的内存量。由主要 GC 减少
- oldmalloc_increase_bytes_limit
-
当
:oldmalloc_increase_bytes
超过此限制时,将触发主要 GC
如果给出了可选参数 hash,则会覆盖该对象并返回。这是为了避免探测效应。
此方法仅有望在 CRuby 上工作。
源代码
# File gc.rb, line 247 def self.stat_heap heap_name = nil, hash_or_key = nil Primitive.gc_stat_heap heap_name, hash_or_key end
返回有关 GC 中堆的信息。
如果传入第一个可选参数 heap_name
且不为 nil
,则返回一个包含特定堆信息的 Hash
。否则,它将返回一个 Hash
,其中堆名称为键,包含堆信息的 Hash
为值。
如果第二个可选参数 hash_or_key
作为 Hash
给出,它将被覆盖并返回。这旨在避免探测效应。
如果同时传入两个可选参数,且第二个可选参数是一个符号,它将返回特定堆的 Numeric
值。
在 CRuby 中,heap_name
的类型是 Integer
,但在其他实现中可能是 String
类型。
哈希的内容是特定于实现的,并且可能会在未来更改,恕不另行通知。
如果给出可选参数 hash,它将被覆盖并返回。
此方法仅有望在 CRuby 上工作。
该 hash 包括有关 GC 内部信息的以下键:
- slot_size
-
堆的槽大小(以字节为单位)。
- heap_allocatable_pages
-
无需触发新的垃圾回收周期即可分配的页面数量。
- heap_eden_pages
-
伊甸园堆中的页面数量。
- heap_eden_slots
-
伊甸园堆中所有页面的总槽数。
- heap_tomb_pages
-
墓地堆中的页面数量。墓地堆仅包含没有任何活动对象的页面。
- heap_tomb_slots
-
墓地堆中所有页面的总槽数。
- total_allocated_pages
-
已在堆中分配的总页面数。
- total_freed_pages
-
已在堆中释放并返回给系统的总页面数。
- force_major_gc_count
-
由于耗尽空闲槽,此堆强制启动主要垃圾回收周期的次数。
- force_incremental_marking_finish_count
-
由于耗尽池化槽,此堆强制完成增量标记的次数。
源代码
# File gc.rb, line 74 def self.stress Primitive.gc_stress_get end
返回 GC 压力模式的当前状态。
源代码
# File gc.rb, line 92 def self.stress=(flag) Primitive.gc_stress_set_m flag end
更新 GC 压力模式。
启用压力模式后,GC 将在每次 GC 机会时调用:所有内存和对象分配。
启用压力模式会降低性能;它仅用于调试。
标志可以是 true、false,或者与以下标志按位或运算的整数
0x01:: no major GC 0x02:: no immediate sweep 0x04:: full mark after malloc/calloc/realloc
源代码
# File gc.rb, line 386 def self.total_time Primitive.cexpr! %{ ULL2NUM(rb_gc_impl_get_total_time(rb_gc_get_objspace())) } end
以纳秒为单位返回测量的 GC 总时间。
公共实例方法
源代码
# File gc.rb, line 40 def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false end
GC.start
的别名