# The GC module provides an interface to Ruby's mark and sweep garbage # collection mechanism. # # Some of the underlying methods are also available via the ObjectSpace module. # # You may obtain information about the operation of the GC through GC::Profiler. # module GC # The number of times GC occurred. # # It returns the number of times GC occurred since the process started. # def self.count: () -> Integer # Disables garbage collection, returning `true` if garbage collection was # already disabled. # # GC.disable #=> false # GC.disable #=> true # def self.disable: () -> bool # Enables garbage collection, returning `true` if garbage collection was # previously disabled. # # GC.disable #=> false # GC.enable #=> true # GC.enable #=> false # def self.enable: () -> bool # Initiates garbage collection, even if manually disabled. # # This method is defined with keyword arguments that default to true: # # def GC.start(full_mark: true, immediate_sweep: true); end # # Use full_mark: false to perform a minor GC. Use immediate_sweep: false to # defer sweeping (use lazy sweep). # # Note: These keyword arguments are implementation and version dependent. They # are not guaranteed to be future-compatible, and may be ignored if the # underlying implementation does not support them. # def self.start: (?immediate_sweep: boolish immediate_sweep, ?immediate_mark: boolish immediate_mark, ?full_mark: boolish full_mark) -> nil # Returns a Hash containing information about the GC. # # The hash includes information about internal statistics about GC such as: # # { # :count=>0, # :heap_allocated_pages=>24, # :heap_sorted_length=>24, # :heap_allocatable_pages=>0, # :heap_available_slots=>9783, # :heap_live_slots=>7713, # :heap_free_slots=>2070, # :heap_final_slots=>0, # :heap_marked_slots=>0, # :heap_eden_pages=>24, # :heap_tomb_pages=>0, # :total_allocated_pages=>24, # :total_freed_pages=>0, # :total_allocated_objects=>7796, # :total_freed_objects=>83, # :malloc_increase_bytes=>2389312, # :malloc_increase_bytes_limit=>16777216, # :minor_gc_count=>0, # :major_gc_count=>0, # :remembered_wb_unprotected_objects=>0, # :remembered_wb_unprotected_objects_limit=>0, # :old_objects=>0, # :old_objects_limit=>0, # :oldmalloc_increase_bytes=>2389760, # :oldmalloc_increase_bytes_limit=>16777216 # } # # The contents of the hash are implementation specific and may be changed in the # future. # # This method is only expected to work on C Ruby. # def self.stat: (?::Hash[Symbol, Integer] arg0) -> ::Hash[Symbol, Integer] | (?Symbol arg0) -> Integer # Returns current status of GC stress mode. # def self.stress: () -> (Integer | TrueClass | FalseClass) # Updates the GC stress mode. # # When stress mode is enabled, the GC is invoked at every GC opportunity: all # memory and object allocations. # # Enabling stress mode will degrade performance, it is only for debugging. # # flag can be true, false, or an integer bit-ORed following flags. # 0x01:: no major GC # 0x02:: no immediate sweep # 0x04:: full mark after malloc/calloc/realloc # def self.stress=: (Integer | TrueClass | FalseClass flag) -> (Integer | TrueClass | FalseClass) def self.compact: () -> ::Hash[:considered | :moved, Hash[Symbol | Integer, Integer]] # Verify compaction reference consistency. # # This method is implementation specific. During compaction, objects that were # moved are replaced with T_MOVED objects. No object should have a reference to # a T_MOVED object after compaction. # # This function doubles the heap to ensure room to move all objects, compacts # the heap to make sure everything moves, updates all references, then performs # a full GC. If any object contains a reference to a T_MOVED object, that # object should be pushed on the mark stack, and will make a SEGV. # def self.verify_compaction_references: () -> ::Hash[:considered | :moved, Hash[Symbol | Integer, Integer]] # Verify internal consistency. # # This method is implementation specific. Now this method checks generational # consistency if RGenGC is supported. # def self.verify_internal_consistency: () -> nil def self.verify_transient_heap_internal_consistency: () -> nil # Returns information about the most recent garbage collection. # def self.latest_gc_info: () -> ::Hash[::Symbol, untyped] | [K] (?Hash[K, untyped] hash) -> ::Hash[::Symbol | K, untyped] | (Symbol key) -> untyped def garbage_collect: (?immediate_sweep: boolish immediate_sweep, ?immediate_mark: boolish immediate_mark, ?full_mark: boolish full_mark) -> nil end # internal constants # # GC::INTERNAL_CONSTANTS: Hash[Symbol, Integer] # GC build options # # GC::OPTS: Array[String] # The GC profiler provides access to information on GC runs including time, # length and object space size. # # Example: # # GC::Profiler.enable # # require 'rdoc/rdoc' # # GC::Profiler.report # # GC::Profiler.disable # # See also GC.count, GC.malloc_allocated_size and GC.malloc_allocations # module GC::Profiler # Clears the GC profiler data. # def self.clear: () -> void # Stops the GC profiler. # def self.disable: () -> void # Starts the GC profiler. # def self.enable: () -> void # The current status of GC profile mode. # def self.enabled?: () -> bool # Returns an Array of individual raw profile data Hashes ordered from earliest # to latest by `:GC_INVOKE_TIME`. # # For example: # # [ # { # :GC_TIME=>1.3000000000000858e-05, # :GC_INVOKE_TIME=>0.010634999999999999, # :HEAP_USE_SIZE=>289640, # :HEAP_TOTAL_SIZE=>588960, # :HEAP_TOTAL_OBJECTS=>14724, # :GC_IS_MARKED=>false # }, # # ... # ] # # The keys mean: # # `:GC_TIME` # : Time elapsed in seconds for this GC run # `:GC_INVOKE_TIME` # : Time elapsed in seconds from startup to when the GC was invoked # `:HEAP_USE_SIZE` # : Total bytes of heap used # `:HEAP_TOTAL_SIZE` # : Total size of heap in bytes # `:HEAP_TOTAL_OBJECTS` # : Total number of objects # `:GC_IS_MARKED` # : Returns `true` if the GC is in mark phase # # # If ruby was built with `GC_PROFILE_MORE_DETAIL`, you will also have access to # the following hash keys: # # `:GC_MARK_TIME` # `:GC_SWEEP_TIME` # `:ALLOCATE_INCREASE` # `:ALLOCATE_LIMIT` # `:HEAP_USE_PAGES` # `:HEAP_LIVE_OBJECTS` # `:HEAP_FREE_OBJECTS` # `:HAVE_FINALIZE` # : # def self.raw_data: () -> ::Array[::Hash[Symbol, untyped]] # Writes the GC::Profiler.result to `$stdout` or the given IO object. # def self.report: (?IO io) -> void # Returns a profile data report such as: # # GC 1 invokes. # Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC time(ms) # 1 0.012 159240 212940 10647 0.00000000000001530000 # def self.result: () -> String # The total time used for garbage collection in seconds # def self.total_time: () -> Float end