The garbage collector looks at a number of environment variables which are
then used to affect its operation.  These are examined only on Un*x-like
platforms and win32.

GC_INITIAL_HEAP_SIZE=<bytes> -	Initial heap size in bytes.  May speed up
				process start-up.

GC_MAXIMUM_HEAP_SIZE=<bytes> - Maximum collected heap size.

GC_LOOP_ON_ABORT - Causes the collector abort routine to enter a tight loop.
		   This may make it easier to debug, such a process, especially
		   for multithreaded platforms that don't produce usable core
		   files, or if a core file would be too large.  On some
		   platforms, this also causes SIGSEGV to be caught and
		   result in an infinite loop in a handler, allowing
		   similar debugging techniques.

GC_PRINT_STATS - Turn on as much logging as is easily feasible without
		 adding signifcant runtime overhead.  Doesn't work if
		 the collector is built with SMALL_CONFIG.  Overridden
		 by setting GC_quiet.  On by default if the collector
		 was built without -DSILENT.

GC_DUMP_REGULARLY - Generate a GC debugging dump GC_dump() on startup
		    and during every collection.  Very verbose.  Useful
		    if you have a bug to report, but please include only the
		    last complete dump.

GC_BACKTRACES=<n> - Generate n random backtraces (for heap profiling) after
		    each GC.  Collector must have been built with
		    KEEP_BACK_PTRS.  This won't generate useful output unless
		    most objects in the heap were allocated through debug
		    allocators.  This is intended to be only a statistical
		    sample;  individual traces may be erroneous due to
		    concurrent heap mutation.

GC_PRINT_ADDRESS_MAP - Linux only.  Dump /proc/self/maps, i.e. various address
		       maps for the process, to stderr on every GC.  Useful for
		       mapping root addresses to source for deciphering leak
		       reports.

GC_NPROCS=<n> - Linux w/threads only.  Explicitly sets the number of processors
	        that the GC should expect to use.  Note that setting this to 1
		when multiple processors are available will preserve
		correctness, but may lead to really horrible performance,
		since the lock implementation will immediately yield without
		first spinning.

GC_MARKERS=<n> - Linux w/threads and parallel marker only.  Set the number
		of marker threads.  This is normaly set to the number of
		processors.  It is safer to adjust GC_MARKERS than GC_NPROCS,
		since GC_MARKERS has no impact on the lock implementation.

GC_NO_BLACKLIST_WARNING - Prevents the collector from issuing
		warnings about allocations of very large blocks.
		Deprecated.  Use GC_LARGE_ALLOC_WARN_INTERVAL instead.

GC_LARGE_ALLOC_WARN_INTERVAL=<n> - Print every nth warning about very large
		block allocations, starting with the nth one.  Small values
		of n are generally benign, in that a bounded number of
		such warnings generally indicate at most a bounded leak.
		For best results it should be set at 1 during testing.
		Default is 5.  Very large numbers effectively disable the
		warning.

GC_IGNORE_GCJ_INFO - Ignore the type descriptors implicitly supplied by
		     GC_gcj_malloc and friends.  This is useful for debugging
		     descriptor generation problems, and possibly for
		     temporarily working around such problems.  It forces a
		     fully conservative scan of all heap objects except
		     those known to be pointerfree, and may thus have other
		     adverse effects.

GC_PRINT_BACK_HEIGHT - Print max length of chain through unreachable objects
		     ending in a reachable one.  If this number remains
		     bounded, then the program is "GC robust".  This ensures
		     that a fixed number of misidentified pointers can only
		     result in a bounded space leak.  This currently only
		     works if debugging allocation is used throughout.
		     It increases GC space and time requirements appreciably.
		     This feature is still somewhat experimental, and requires
		     that the collector have been built with MAKE_BACK_GRAPH
		     defined.  For details, see Boehm, "Bounding Space Usage
		     of Conservative Garbage Collectors", POPL 2001, or
		     http://lib.hpl.hp.com/techpubs/2001/HPL-2001-251.html .

GC_RETRY_SIGNALS, GC_NO_RETRY_SIGNALS - Try to compensate for lost
		     thread suspend signals in linux_threads.c.  On by
		     default for GC_OSF1_THREADS, off otherwise.  Note 
		     that this does not work around a possible loss of
		     thread restart signals.  This seems to be necessary for
		     some versions of Tru64.  Since we've previously seen
		     similar issues on some other operating systems, it
		     was turned into a runtime flag to enable last-minute
		     work-arounds.

GC_IGNORE_FB[=<n>] -  (Win32 only.) Try to avoid treating a mapped
		frame buffer as part of the root set.  Certain (higher end?)
		graphics cards seems to result in the graphics memory mapped
		into the user address space as writable memory.
		Unfortunately, there seems to be no systematic way to
		identify such memory.  Setting the environment variable to n
		causes the collector to ignore mappings longer than n MB.
		The default value of n is currently 15.  (This should cover
		a 16 MB graphics card, since the mapping appears to be slightly
		shorter than all of graphics memory.  It will fail if a dll
		writes pointers to collectable objects into a data segment
		whose length is >= 15MB.  Empirically that's rare, but
		certainly possible.)  WARNING: Security sensitive applications
		should probably disable this feature by setting
		GC_disallow_ignore_fb, or by building with -DNO_GETENV,
		since small values could force collection of reachable
		objects, which is conceivably a	(difficult to exploit)
		security hole.  GC_IGNORE_FB values less than 3 MB
		are never honored, eliminating this risk for most,
		but not all, applications.  This feature is likely to disappear
		if/when we find a less disgusting "solution".

The following turn on runtime flags that are also program settable.  Checked
only during initialization.  We expect that they will usually be set through
other means, but this may help with debugging and testing:

GC_ENABLE_INCREMENTAL - Turn on incremental collection at startup.  Note that,
		     depending on platform and collector configuration, this
		     may involve write protecting pieces of the heap to
		     track modifications.  These pieces may include pointerfree
		     objects or not.  Although this is intended to be
		     transparent, it may cause unintended system call failures.
		     Use with caution.

GC_PAUSE_TIME_TARGET - Set the desired garbage collector pause time in msecs.
		     This only has an effect if incremental collection is
		     enabled.  If a collection requires appreciably more time
		     than this, the client will be restarted, and the collector
		     will need to do additional work to compensate.  The
		     special value "999999" indicates that pause time is
		     unlimited, and the incremental collector will behave
		     completely like a simple generational collector.  If
		     the collector is configured for parallel marking, and
		     run on a multiprocessor, incremental collection should
		     only be used with unlimited pause time.

GC_FIND_LEAK - Turns on GC_find_leak and thus leak detection.  Forces a
	       collection at program termination to detect leaks that would
	       otherwise occur after the last GC.

GC_ALL_INTERIOR_POINTERS - Turns on GC_all_interior_pointers and thus interior
			   pointer recognition.

GC_DONT_GC - Turns off garbage collection.  Use cautiously.
