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