1 | The collector supports both incremental collection and threads under
|
---|
2 | Solaris 2. The incremental collector normally retrieves page dirty information
|
---|
3 | through the appropriate /proc calls. But it can also be configured
|
---|
4 | (by defining MPROTECT_VDB instead of PROC_VDB in gcconfig.h) to use mprotect
|
---|
5 | and signals. This may result in shorter pause times, but it is no longer
|
---|
6 | safe to issue arbitrary system calls that write to the heap.
|
---|
7 |
|
---|
8 | Under other UNIX versions,
|
---|
9 | the collector normally obtains memory through sbrk. There is some reason
|
---|
10 | to expect that this is not safe if the client program also calls the system
|
---|
11 | malloc, or especially realloc. The sbrk man page strongly suggests this is
|
---|
12 | not safe: "Many library routines use malloc() internally, so use brk()
|
---|
13 | and sbrk() only when you know that malloc() definitely will not be used by
|
---|
14 | any library routine." This doesn't make a lot of sense to me, since there
|
---|
15 | seems to be no documentation as to which routines can transitively call malloc.
|
---|
16 | Nonetheless, under Solaris2, the collector now (since 4.12) allocates
|
---|
17 | memory using mmap by default. (It defines USE_MMAP in gcconfig.h.)
|
---|
18 | You may want to reverse this decisions if you use -DREDIRECT_MALLOC=...
|
---|
19 |
|
---|
20 |
|
---|
21 | SOLARIS THREADS:
|
---|
22 |
|
---|
23 | The collector must be compiled with -DGC_SOLARIS_THREADS (thr_ functions)
|
---|
24 | or -DGC_SOLARIS_PTHREADS (pthread_ functions) to be thread safe.
|
---|
25 | It is also essential that gc.h be included in files that call thr_create,
|
---|
26 | thr_join, thr_suspend, thr_continue, or dlopen. Gc.h macro defines
|
---|
27 | these to also do GC bookkeeping, etc. Gc.h must be included with
|
---|
28 | one or both of these macros defined, otherwise
|
---|
29 | these replacements are not visible.
|
---|
30 | A collector built in this way way only be used by programs that are
|
---|
31 | linked with the threads library.
|
---|
32 |
|
---|
33 | In this mode, the collector contains various workarounds for older Solaris
|
---|
34 | bugs. Mostly, these should not be noticeable unless you look at system
|
---|
35 | call traces. However, it cannot protect a guard page at the end of
|
---|
36 | a thread stack. If you know that you will only be running Solaris2.5
|
---|
37 | or later, it should be possible to fix this by compiling the collector
|
---|
38 | with -DSOLARIS23_MPROTECT_BUG_FIXED.
|
---|
39 |
|
---|
40 | Since 5.0 alpha5, dlopen disables collection temporarily,
|
---|
41 | unless USE_PROC_FOR_LIBRARIES is defined. In some unlikely cases, this
|
---|
42 | can result in unpleasant heap growth. But it seems better than the
|
---|
43 | race/deadlock issues we had before.
|
---|
44 |
|
---|
45 | If solaris_threads are used on an X86 processor with malloc redirected to
|
---|
46 | GC_malloc, it is necessary to call GC_thr_init explicitly before forking the
|
---|
47 | first thread. (This avoids a deadlock arising from calling GC_thr_init
|
---|
48 | with the allocation lock held.)
|
---|
49 |
|
---|
50 | It appears that there is a problem in using gc_cpp.h in conjunction with
|
---|
51 | Solaris threads and Sun's C++ runtime. Apparently the overloaded new operator
|
---|
52 | is invoked by some iostream initialization code before threads are correctly
|
---|
53 | initialized. As a result, call to thr_self() in garbage collector
|
---|
54 | initialization segfaults. Currently the only known workaround is to not
|
---|
55 | invoke the garbage collector from a user defined global operator new, or to
|
---|
56 | have it invoke the garbage-collector's allocators only after main has started.
|
---|
57 | (Note that the latter requires a moderately expensive test in operator
|
---|
58 | delete.)
|
---|
59 |
|
---|
60 | Hans-J. Boehm
|
---|
61 | (The above contains my personal opinions, which are probably not shared
|
---|
62 | by anyone else.)
|
---|