| 1 | The garbage collector looks at a number of environment variables which are | 
|---|
| 2 | then used to affect its operation.  These are examined only on Un*x-like | 
|---|
| 3 | platforms and win32. | 
|---|
| 4 |  | 
|---|
| 5 | GC_INITIAL_HEAP_SIZE=<bytes> -  Initial heap size in bytes.  May speed up | 
|---|
| 6 | process start-up. | 
|---|
| 7 |  | 
|---|
| 8 | GC_MAXIMUM_HEAP_SIZE=<bytes> - Maximum collected heap size. | 
|---|
| 9 |  | 
|---|
| 10 | GC_LOOP_ON_ABORT - Causes the collector abort routine to enter a tight loop. | 
|---|
| 11 | This may make it easier to debug, such a process, especially | 
|---|
| 12 | for multithreaded platforms that don't produce usable core | 
|---|
| 13 | files, or if a core file would be too large.  On some | 
|---|
| 14 | platforms, this also causes SIGSEGV to be caught and | 
|---|
| 15 | result in an infinite loop in a handler, allowing | 
|---|
| 16 | similar debugging techniques. | 
|---|
| 17 |  | 
|---|
| 18 | GC_PRINT_STATS - Turn on as much logging as is easily feasible without | 
|---|
| 19 | adding signifcant runtime overhead.  Doesn't work if | 
|---|
| 20 | the collector is built with SMALL_CONFIG.  Overridden | 
|---|
| 21 | by setting GC_quiet.  On by default if the collector | 
|---|
| 22 | was built without -DSILENT. | 
|---|
| 23 |  | 
|---|
| 24 | GC_DUMP_REGULARLY - Generate a GC debugging dump GC_dump() on startup | 
|---|
| 25 | and during every collection.  Very verbose.  Useful | 
|---|
| 26 | if you have a bug to report, but please include only the | 
|---|
| 27 | last complete dump. | 
|---|
| 28 |  | 
|---|
| 29 | GC_BACKTRACES=<n> - Generate n random backtraces (for heap profiling) after | 
|---|
| 30 | each GC.  Collector must have been built with | 
|---|
| 31 | KEEP_BACK_PTRS.  This won't generate useful output unless | 
|---|
| 32 | most objects in the heap were allocated through debug | 
|---|
| 33 | allocators.  This is intended to be only a statistical | 
|---|
| 34 | sample;  individual traces may be erroneous due to | 
|---|
| 35 | concurrent heap mutation. | 
|---|
| 36 |  | 
|---|
| 37 | GC_PRINT_ADDRESS_MAP - Linux only.  Dump /proc/self/maps, i.e. various address | 
|---|
| 38 | maps for the process, to stderr on every GC.  Useful for | 
|---|
| 39 | mapping root addresses to source for deciphering leak | 
|---|
| 40 | reports. | 
|---|
| 41 |  | 
|---|
| 42 | GC_NPROCS=<n> - Linux w/threads only.  Explicitly sets the number of processors | 
|---|
| 43 | that the GC should expect to use.  Note that setting this to 1 | 
|---|
| 44 | when multiple processors are available will preserve | 
|---|
| 45 | correctness, but may lead to really horrible performance, | 
|---|
| 46 | since the lock implementation will immediately yield without | 
|---|
| 47 | first spinning. | 
|---|
| 48 |  | 
|---|
| 49 | GC_MARKERS=<n> - Linux w/threads and parallel marker only.  Set the number | 
|---|
| 50 | of marker threads.  This is normaly set to the number of | 
|---|
| 51 | processors.  It is safer to adjust GC_MARKERS than GC_NPROCS, | 
|---|
| 52 | since GC_MARKERS has no impact on the lock implementation. | 
|---|
| 53 |  | 
|---|
| 54 | GC_NO_BLACKLIST_WARNING - Prevents the collector from issuing | 
|---|
| 55 | warnings about allocations of very large blocks. | 
|---|
| 56 | Deprecated.  Use GC_LARGE_ALLOC_WARN_INTERVAL instead. | 
|---|
| 57 |  | 
|---|
| 58 | GC_LARGE_ALLOC_WARN_INTERVAL=<n> - Print every nth warning about very large | 
|---|
| 59 | block allocations, starting with the nth one.  Small values | 
|---|
| 60 | of n are generally benign, in that a bounded number of | 
|---|
| 61 | such warnings generally indicate at most a bounded leak. | 
|---|
| 62 | For best results it should be set at 1 during testing. | 
|---|
| 63 | Default is 5.  Very large numbers effectively disable the | 
|---|
| 64 | warning. | 
|---|
| 65 |  | 
|---|
| 66 | GC_IGNORE_GCJ_INFO - Ignore the type descriptors implicitly supplied by | 
|---|
| 67 | GC_gcj_malloc and friends.  This is useful for debugging | 
|---|
| 68 | descriptor generation problems, and possibly for | 
|---|
| 69 | temporarily working around such problems.  It forces a | 
|---|
| 70 | fully conservative scan of all heap objects except | 
|---|
| 71 | those known to be pointerfree, and may thus have other | 
|---|
| 72 | adverse effects. | 
|---|
| 73 |  | 
|---|
| 74 | GC_PRINT_BACK_HEIGHT - Print max length of chain through unreachable objects | 
|---|
| 75 | ending in a reachable one.  If this number remains | 
|---|
| 76 | bounded, then the program is "GC robust".  This ensures | 
|---|
| 77 | that a fixed number of misidentified pointers can only | 
|---|
| 78 | result in a bounded space leak.  This currently only | 
|---|
| 79 | works if debugging allocation is used throughout. | 
|---|
| 80 | It increases GC space and time requirements appreciably. | 
|---|
| 81 | This feature is still somewhat experimental, and requires | 
|---|
| 82 | that the collector have been built with MAKE_BACK_GRAPH | 
|---|
| 83 | defined.  For details, see Boehm, "Bounding Space Usage | 
|---|
| 84 | of Conservative Garbage Collectors", POPL 2001, or | 
|---|
| 85 | http://lib.hpl.hp.com/techpubs/2001/HPL-2001-251.html . | 
|---|
| 86 |  | 
|---|
| 87 | GC_RETRY_SIGNALS, GC_NO_RETRY_SIGNALS - Try to compensate for lost | 
|---|
| 88 | thread suspend signals in linux_threads.c.  On by | 
|---|
| 89 | default for GC_OSF1_THREADS, off otherwise.  Note | 
|---|
| 90 | that this does not work around a possible loss of | 
|---|
| 91 | thread restart signals.  This seems to be necessary for | 
|---|
| 92 | some versions of Tru64.  Since we've previously seen | 
|---|
| 93 | similar issues on some other operating systems, it | 
|---|
| 94 | was turned into a runtime flag to enable last-minute | 
|---|
| 95 | work-arounds. | 
|---|
| 96 |  | 
|---|
| 97 | GC_IGNORE_FB[=<n>] -  (Win32 only.) Try to avoid treating a mapped | 
|---|
| 98 | frame buffer as part of the root set.  Certain (higher end?) | 
|---|
| 99 | graphics cards seems to result in the graphics memory mapped | 
|---|
| 100 | into the user address space as writable memory. | 
|---|
| 101 | Unfortunately, there seems to be no systematic way to | 
|---|
| 102 | identify such memory.  Setting the environment variable to n | 
|---|
| 103 | causes the collector to ignore mappings longer than n MB. | 
|---|
| 104 | The default value of n is currently 15.  (This should cover | 
|---|
| 105 | a 16 MB graphics card, since the mapping appears to be slightly | 
|---|
| 106 | shorter than all of graphics memory.  It will fail if a dll | 
|---|
| 107 | writes pointers to collectable objects into a data segment | 
|---|
| 108 | whose length is >= 15MB.  Empirically that's rare, but | 
|---|
| 109 | certainly possible.)  WARNING: Security sensitive applications | 
|---|
| 110 | should probably disable this feature by setting | 
|---|
| 111 | GC_disallow_ignore_fb, or by building with -DNO_GETENV, | 
|---|
| 112 | since small values could force collection of reachable | 
|---|
| 113 | objects, which is conceivably a (difficult to exploit) | 
|---|
| 114 | security hole.  GC_IGNORE_FB values less than 3 MB | 
|---|
| 115 | are never honored, eliminating this risk for most, | 
|---|
| 116 | but not all, applications.  This feature is likely to disappear | 
|---|
| 117 | if/when we find a less disgusting "solution". | 
|---|
| 118 | IN VERSION 6.4 AND LATER, THIS SHOULD BE UNNECESSARY. | 
|---|
| 119 |  | 
|---|
| 120 | The following turn on runtime flags that are also program settable.  Checked | 
|---|
| 121 | only during initialization.  We expect that they will usually be set through | 
|---|
| 122 | other means, but this may help with debugging and testing: | 
|---|
| 123 |  | 
|---|
| 124 | GC_ENABLE_INCREMENTAL - Turn on incremental collection at startup.  Note that, | 
|---|
| 125 | depending on platform and collector configuration, this | 
|---|
| 126 | may involve write protecting pieces of the heap to | 
|---|
| 127 | track modifications.  These pieces may include pointerfree | 
|---|
| 128 | objects or not.  Although this is intended to be | 
|---|
| 129 | transparent, it may cause unintended system call failures. | 
|---|
| 130 | Use with caution. | 
|---|
| 131 |  | 
|---|
| 132 | GC_PAUSE_TIME_TARGET - Set the desired garbage collector pause time in msecs. | 
|---|
| 133 | This only has an effect if incremental collection is | 
|---|
| 134 | enabled.  If a collection requires appreciably more time | 
|---|
| 135 | than this, the client will be restarted, and the collector | 
|---|
| 136 | will need to do additional work to compensate.  The | 
|---|
| 137 | special value "999999" indicates that pause time is | 
|---|
| 138 | unlimited, and the incremental collector will behave | 
|---|
| 139 | completely like a simple generational collector.  If | 
|---|
| 140 | the collector is configured for parallel marking, and | 
|---|
| 141 | run on a multiprocessor, incremental collection should | 
|---|
| 142 | only be used with unlimited pause time. | 
|---|
| 143 |  | 
|---|
| 144 | GC_FIND_LEAK - Turns on GC_find_leak and thus leak detection.  Forces a | 
|---|
| 145 | collection at program termination to detect leaks that would | 
|---|
| 146 | otherwise occur after the last GC. | 
|---|
| 147 |  | 
|---|
| 148 | GC_ALL_INTERIOR_POINTERS - Turns on GC_all_interior_pointers and thus interior | 
|---|
| 149 | pointer recognition. | 
|---|
| 150 |  | 
|---|
| 151 | GC_DONT_GC - Turns off garbage collection.  Use cautiously. | 
|---|