[gclist] memory leaks and the Boehm collector
Hans Boehm
boehm@hoh.engr.sgi.com
Fri, 16 Jul 1999 10:00:17 -0700
On Jul 15, 3:56pm, cd_smith@ou.edu wrote:
> No real-life ones, although it's not that hard to produce sample cases
> where leaks like this happen, at least as of circa JDK 1.1.6. One
> particular situation that I remember (became a relatively large thread on
> comp.lang.java.help about a year ago IIRC) involved building a linked list
> and stepping the head pointer forward... apparently, the original head was
> kept somewhere because GC would preserve the entire list. Adding any sort
> of real processing to the program (besides just adding a list element and
> then head = head.next) eliminated the problem entirely, making it somewhat
> irrelevant in the real world.
>
I think we can call that the canonical example. Variations of it have been
rediscovered by a number of people. (The earliest is probably Wentworth's 1990
SP&E paper.) In some sense, it's provably the only kind of example: Any
unbounded leak from a single misidentified pointer must involve a growing chain
of objects ending at a live object. (See
http://reality.sgi.com/boehm/bounds.html for most of the argument.)
This particular case is also easily avoidable in a language like Java: Clear
the link field when you step the last pointer forward. Although this is a
moderately ugly workaround, you should use it even without a conservative
collector. Essentially the same phenomenon can cause all objects to be
promoted to the oldest generation in a generational collector. (And unlike
manual deallocation, it's of course safe; errors cannot affect other data
structures.)
Hans
--
Hans-J. Boehm
boehm@sgi.com