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".
		IN VERSION 6.4 AND LATER, THIS SHOULD BE UNNECESSARY.

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.
