Short version: you mainly don't need to worry about what Ruby GC is doing and how, because you have little to no control over it through Ruby. You can 'suggest' to Ruby to begin garbage collection with GC.start, and you can 'protect' any object from being GC'd so long as it has any variable referencing it accessible from the current scope (including any available closures). Telling GC to start gives it priority, which may mean a temporary performance hit, and usually, the objects you are dealing with do not have enough of a memory footprint to warrant trying to "steer" the GC like that. Generally speaking, you are better of just letting it do what it does without trying to interfere.
However, when it comes to dealing with graphical objects (Sprite, Window, Plane and Viewport) it is very important that you use dispose to free the metadata of the object before you lose the last reference to the object to have it be GC'd because you may have not just a memory leak, but a potential Game.exe crash on your hand (see my sig thread). Windows stored in instance variables of Scene_Base and its descendants are disposed in the dispose_all_windows method when the scene terminates, everything else needs to be explicitly disposed. Bitmaps have not been shown to cause a crash if you don't dispose them, but you will have a very small memory leak (though bitmaps themselves seem to be inherently leaky). You do not need to dispose bitmaps loaded through Cache - these have a global reference and will never be GC'd. Calling .dispose does not free all memory associated with these objects, it frees the only metadata associated with the "hidden" methods; the Ruby object itself sticks around so long as it has a reference but it can no longer access any of these methods because the associated memory has been freed. Ruby GC will actually get most of the metadata associated with a Bitmap when it claims the object, but there is a very small difference in memory usage from disposing and having a bitmap be GC'd versus just having it be GC'd. The Ruby objects themselves are very small and don't warrant explicitly calling GC.start.