[gclist] Java vs. ML, particularly GC
Manoj Plakal
plakal@cs.wisc.edu
Fri, 22 Dec 2000 14:25:44 -0600
Krishnaswami, Neel wrote (Fri, Dec 22, 2000 at 02:50:44PM -0500) :
> Yes. The hashcode() method on the Object class in Java makes it
> very hard to write a high-quality garbage collector for the JVM,
> since it makes it very hard to write a copying or generational
> collector.
>
> The problem is that every object must return a meaningful hash
> code, *and* the Java spec requires that the hash code of an
> object cannot change during the run of a program. The simplest
> implementation of hashcode() is to cast the address of the object
> to an integer and return that, and with this implementation the
> constant-hashcode requirement will be violated by any moving
> garbage collector.
>
> [snip]
>
> I'm sure there's trickery you can use to get around this
> restriction in Java, but it's a serious enough problem that
> most Java implementations simply punt and use a simple mark-and-
> sweep garbage collecter. This kills gc performance compared
> to the collectors in other advanced functional and OO languages.
I don't see why implementations have to stick to
"use-pointer-as-hashCode" solution. I think some
implementations reserve some space in each object
to store the hashCode, in which case the allocator
could put in an object-ID (maybe coupled with
a thread-ID for multithreaded allocators). Or use
the object creation time + thread-ID.
There should be some tricks you can play to reduce
this space overhead but I'm sure there are many
Java implementations out there today which use
something better than stop-the-world mark-and-sweep.
Though I don't know how many of these have
made their way into commercial products.
Manoj