Charles Oliver Nutter wrote:
> Hongli Lai wrote:
>> Robert Klemme wrote:
>>> ObjectSpace does create some issues for JRuby IIRC, so maybe we should
>>> consider whether we can get rid of it without too many disadvantages.
>>
>> There's at least one important use case for ObjectSpace: closing all
>> open IO objects. This is very important for daemonizing a process.
> ...
>> However, walking ObjectSpace is quite inefficient. I wouldn't mind
>> getting rid of ObjectSpace if an alternative for closing all IO
>> objects is provided.
>
> ObjectSpace is more than just inefficient...it and features like it
> are holding back the standard Ruby implementation, since they impose
> concurrency, memory layout, and GC limitations. That's why each_object
> is not fully-functional in JRuby by default...because we're running on
> a GC and memory model incompatible with arbitrarily walking the heap.
>
> In JRuby, we also want to be able to shut down all IO objects, since
> we do caching at a Java level rather than through C APIs (FILE*). So
> we keep a weak list of all IO objects and run through it as needed.
> Maintaining such a list in any implementation would be trivial, and an
> API could be provided for programmatically accessing it.
>
> In a similar fashion, we track subclasses in weak lists attached to
> each class. The lists are lazily allocated, so they don't exist unless
> there are subclasses. But they allow us to support each_object(Class)
> trivially by walking the live class hierarchy directly.
>
> I suppose the bottom line I want to convey is that almost all the
> practical uses of ObjectSpace (outside of debugging and toy uses, for
> which nobody cares about performance) can be implemented in other ways
> that don't impose limitations on the system. As I've advocated before
> I'll advocate again: ObjectSpace should go.
>
> - Charlie
>

The sooner we can get rid of ObjectSpace.each_object, the sooner we can
use an of-the-shelf collector (like BDW, for example) and get efficient
weak pointers working.  I have Treadmill-style collector I'd love to try
using.  

File.open() should probably force a GC after open(...) and errno ==
ENFILE and retry.  That would give an opportunity for the finalizers to
return unused file descriptor(s) back to the OS.

Kurt