E D R , A S I H C RSS

Garbage collector for C and C++

인스톨

  • README.QUICK 파일에 기본적인 설명이 있다. doc/README.* 에 플렛폼별 자세한 설명이 있다.
  • 유닉스나 리눅스에서는 "./configure --prefix=<dir>; make; make check; make install" 으로 인스톨 할수 있다.
    • C++ 인터 페이스를 추가 하기 위해서는 "make c++" 을 하여야 한다.

  • GNU-win32 에서는 기본으로 있는 Makefile 을 사용하면된다.
    /! 시스템에 따라 Makefile 내용 중 CC=cc 를 CC=gcc 로 수정하여야 한다.
  • C++ 인터 페이스를 추가 하기 위해서는 "make c++" 을 하여야 한다.

  • MS 개발 툴을 사용한다면 NT_MAKEFILE 을 MAKEFILE 로 이름을 바꾸어 사용한다.
    • win32 쓰레드를 지원하려면 NT_THREADS_MAKEFILE 을 사용한다. (gc.mak 도 같은 파일 이다.)
    • 예) nmake /F ".gc.mak" CFG="gctest - Win32 Release"

  • 볼랜드 개발 툴을 사용한다면 BCC_MAKEFILE 을 사용한다.
  • 내가 사용한 인스톨

    • WinXP, MinGW, Msys
      • Makefile 수정 내용.
        • CC=cc 를 CC=gcc 로 수정.
        • -DGC_OPERATOR_NEW_ARRAY -DJAVA_FINALIZATION 을 CFLAGS 에 추가.

      • 빌드
        • make c++

    이슈

    • Windows NT 나 Windows 2000 에서 문제가 발생한다면 -DUSE_GLOBAL_ALLOC 나 -DUSE_MUNMAP 옵션을 사용하여 컴파일 한다.
    • C++ 에서 사용하려면 -DGC_OPERATOR_NEW_ARRAY 를 추가하여 컴파일 하는 것이 좋다.
      ~cpp 
      class A: public gc {...};
      A* a1 = new A[ 10 ];        // collectable or uncollectable? (컴파일러마다 다른 결과가 나온다.)
      A* a2 = new (GC) A[ 10 ];   // collectable
       

    옵션

    ~cpp 
    # -DSILENT disables statistics printing, and improves performance.
    # -DFIND_LEAK causes GC_find_leak to be initially set.
    #   This causes the collector to assume that all inaccessible
    #   objects should have been explicitly deallocated, and reports exceptions.
    #   Finalization and the test program are not usable in this mode.
    # -DGC_SOLARIS_THREADS enables support for Solaris (thr_) threads.
    #   (Clients should also define GC_SOLARIS_THREADS and then include
    #   gc.h before performing thr_ or dl* or GC_ operations.)
    #   Must also define -D_REENTRANT.
    # -DGC_SOLARIS_PTHREADS enables support for Solaris pthreads.
    #   (Internally this define GC_SOLARIS_THREADS as well.)
    # -DGC_IRIX_THREADS enables support for Irix pthreads.  See README.irix.
    # -DGC_HPUX_THREADS enables support for HP/UX 11 pthreads.
    #   Also requires -D_REENTRANT or -D_POSIX_C_SOURCE=199506L. See README.hp.
    # -DGC_LINUX_THREADS enables support for Xavier Leroy's Linux threads.
    #   see README.linux.  -D_REENTRANT may also be required.
    # -DGC_OSF1_THREADS enables support for Tru64 pthreads.  Untested.
    # -DGC_FREEBSD_THREADS enables support for FreeBSD pthreads.  Untested.
    #   Appeared to run into some underlying thread problems.
    # -DGC_DGUX386_THREADS enables support for DB/UX on I386 threads.
    #   See README.DGUX386.
    # -DALL_INTERIOR_POINTERS allows all pointers to the interior
    #   of objects to be recognized.  (See gc_priv.h for consequences.)
    #   Alternatively, GC_all_interior_pointers can be set at process
    #   initialization time.
    # -DSMALL_CONFIG tries to tune the collector for small heap sizes,
    #   usually causing it to use less space in such situations.
    #   Incremental collection no longer works in this case.
    # -DLARGE_CONFIG tunes the collector for unusually large heaps.
    #   Necessary for heaps larger than about 500 MB on most machines.
    #   Recommended for heaps larger than about 64 MB.
    # -DDONT_ADD_BYTE_AT_END is meaningful only with -DALL_INTERIOR_POINTERS or
    #   GC_all_interior_pointers = 1.  Normally -DALL_INTERIOR_POINTERS
    #   causes all objects to be padded so that pointers just past the end of
    #   an object can be recognized.  This can be expensive.  (The padding
    #   is normally more than one byte due to alignment constraints.)
    #   -DDONT_ADD_BYTE_AT_END disables the padding.
    # -DNO_SIGNALS does not disable signals during critical parts of
    #   the GC process.  This is no less correct than many malloc 
    #   implementations, and it sometimes has a significant performance
    #   impact.  However, it is dangerous for many not-quite-ANSI C
    #   programs that call things like printf in asynchronous signal handlers.
    #   This is on by default.  Turning it off has not been extensively tested with
    #   compilers that reorder stores.  It should have been.
    # -DNO_EXECUTE_PERMISSION may cause some or all of the heap to not
    #   have execute permission, i.e. it may be impossible to execute
    #   code from the heap.  Currently this only affects the incremental
    #   collector on UNIX machines.  It may greatly improve its performance,
    #   since this may avoid some expensive cache synchronization.
    # -DGC_NO_OPERATOR_NEW_ARRAY declares that the C++ compiler does not support
    #   the  new syntax "operator new[]" for allocating and deleting arrays.
    #   See gc_cpp.h for details.  No effect on the C part of the collector.
    #   This is defined implicitly in a few environments.  Must also be defined
    #   by clients that use gc_cpp.h.
    # -DREDIRECT_MALLOC=X causes malloc to be defined as alias for X.
    #   Unless the following macros are defined, realloc is also redirected
    #   to GC_realloc, and free is redirected to GC_free.
    #   Calloc and strdup are redefined in terms of the new malloc.  X should
    #   be either GC_malloc or GC_malloc_uncollectable, or
    #   GC_debug_malloc_replacement.  (The latter invokes GC_debug_malloc
    #   with dummy source location information, but still results in
    #   properly remembered call stacks on Linux/X86 and Solaris/SPARC.
    #   It requires that the following two macros also be used.)
    #   The former is occasionally useful for working around leaks in code
    #   you don't want to (or can't) look at.  It may not work for
    #   existing code, but it often does.  Neither works on all platforms,
    #   since some ports use malloc or calloc to obtain system memory.
    #   (Probably works for UNIX, and win32.)  If you build with DBG_HDRS_ALL,
    #   you should only use GC_debug_malloc_replacement as a malloc
    #   replacement.
    # -DREDIRECT_REALLOC=X causes GC_realloc to be redirected to X.
    #   The canonical use is -DREDIRECT_REALLOC=GC_debug_realloc_replacement,
    #   together with -DREDIRECT_MALLOC=GC_debug_malloc_replacement to
    #   generate leak reports with call stacks for both malloc and realloc.
    #   This also requires the following:
    # -DREDIRECT_FREE=X causes free to be redirected to X.  The
    #   canonical use is -DREDIRECT_FREE=GC_debug_free.
    # -DIGNORE_FREE turns calls to free into a noop.  Only useful with
    #   -DREDIRECT_MALLOC.
    # -DNO_DEBUGGING removes GC_dump and the debugging routines it calls.
    #   Reduces code size slightly at the expense of debuggability.
    # -DJAVA_FINALIZATION makes it somewhat safer to finalize objects out of
    #   order by specifying a nonstandard finalization mark procedure  (see
    #   finalize.c).  Objects reachable from finalizable objects will be marked
    #   in a sepearte postpass, and hence their memory won't be reclaimed.
    #   Not recommended unless you are implementing a language that specifies
    #   these semantics.  Since 5.0, determines only only the initial value
    #   of GC_java_finalization variable.
    # -DFINALIZE_ON_DEMAND causes finalizers to be run only in response
    #   to explicit GC_invoke_finalizers() calls.
    #   In 5.0 this became runtime adjustable, and this only determines the
    #   initial value of GC_finalize_on_demand.
    # -DATOMIC_UNCOLLECTABLE includes code for GC_malloc_atomic_uncollectable.
    #   This is useful if either the vendor malloc implementation is poor,
    #   or if REDIRECT_MALLOC is used.
    # -DHBLKSIZE=ddd, where ddd is a power of 2 between 512 and 16384, explicitly
    #   sets the heap block size.  Each heap block is devoted to a single size and
    #   kind of object.  For the incremental collector it makes sense to match
    #   the most likely page size.  Otherwise large values result in more
    #   fragmentation, but generally better performance for large heaps.
    # -DUSE_MMAP use MMAP instead of sbrk to get new memory.
    #   Works for Solaris and Irix.
    # -DUSE_MUNMAP causes memory to be returned to the OS under the right
    #   circumstances.  This currently disables VM-based incremental collection.
    #   This is currently experimental, and works only under some Unix,
    #   Linux and Windows versions.
    # -DMMAP_STACKS (for Solaris threads) Use mmap from /dev/zero rather than
    #   GC_scratch_alloc() to get stack memory.
    # -DPRINT_BLACK_LIST Whenever a black list entry is added, i.e. whenever
    #   the garbage collector detects a value that looks almost, but not quite,
    #   like a pointer, print both the address containing the value, and the
    #   value of the near-bogus-pointer.  Can be used to identifiy regions of
    #   memory that are likely to contribute misidentified pointers.
    # -DKEEP_BACK_PTRS Add code to save back pointers in debugging headers
    #   for objects allocated with the debugging allocator.  If all objects
    #   through GC_MALLOC with GC_DEBUG defined, this allows the client
    #   to determine how particular or randomly chosen objects are reachable
    #   for debugging/profiling purposes.  The gc_backptr.h interface is
    #   implemented only if this is defined.
    # -DGC_ASSERTIONS Enable some internal GC assertion checking.  Currently
    #   this facility is only used in a few places.  It is intended primarily
    #   for debugging of the garbage collector itself, but could also
    # -DDBG_HDRS_ALL Make sure that all objects have debug headers.  Increases
    #   the reliability (from 99.9999% to 100%) of some of the debugging
    #   code (especially KEEP_BACK_PTRS).  Makes -DSHORT_DBG_HDRS possible.
    #   Assumes that all client allocation is done through debugging
    #   allocators.
    # -DSHORT_DBG_HDRS Assume that all objects have debug headers.  Shorten
    #   the headers to minimize object size, at the expense of checking for
    #   writes past the end of an object.  This is intended for environments
    #   in which most client code is written in a "safe" language, such as
    #   Scheme or Java.  Assumes that all client allocation is done using
    #   the GC_debug_ functions, or through the macros that expand to these,
    #   or by redirecting malloc to GC_debug_malloc_replacement.
    #   (Also eliminates the field for the requested object size.)
    #   occasionally be useful for debugging of client code.  Slows down the
    #   collector somewhat, but not drastically.
    # -DSAVE_CALL_COUNT=<n> Set the number of call frames saved with objects
    #   allocated through the debugging interface.  Affects the amount of
    #   information generated in leak reports.  Only matters on platforms
    #   on which we can quickly generate call stacks, currently Linux/(X86 & SPARC)
    #   and Solaris/SPARC and platforms that provide execinfo.h.
    #   Default is zero.  On X86, client
    #   code should NOT be compiled with -fomit-frame-pointer.
    # -DSAVE_CALL_NARGS=<n> Set the number of functions arguments to be
    #   saved with each call frame.  Default is zero.  Ignored if we
    #   don't know how to retrieve arguments on the platform.
    # -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
    #   altered stubborn objects, at substantial performance cost.
    #   Use only for debugging of the incremental collector.
    # -DGC_GCJ_SUPPORT includes support for gcj (and possibly other systems
    #   that include a pointer to a type descriptor in each allocated object).
    #   Building this way requires an ANSI C compiler.
    # -DUSE_I686_PREFETCH causes the collector to issue Pentium III style
    #   prefetch instructions.  No effect except on X86 Linux platforms.
    #   Assumes a very recent gcc-compatible compiler and assembler.
    #   (Gas prefetcht0 support was added around May 1999.)
    #   Empirically the code appears to still run correctly on Pentium II
    #   processors, though with no performance benefit.  May not run on other
    #   X86 processors?  In some cases this improves performance by
    #   15% or so.
    # -DUSE_3DNOW_PREFETCH causes the collector to issue AMD 3DNow style
    #   prefetch instructions.  Same restrictions as USE_I686_PREFETCH.
    #   Minimally tested.  Didn't appear to be an obvious win on a K6-2/500.
    # -DGC_USE_LD_WRAP in combination with the old flags listed in README.linux
    #   causes the collector some system and pthread calls in a more transparent
    #   fashion than the usual macro-based approach.  Requires GNU ld, and
    #   currently probably works only with Linux.
    # -DTHREAD_LOCAL_ALLOC defines GC_local_malloc(), GC_local_malloc_atomic()
    #   and GC_local_gcj_malloc().  Needed for gc_gcj.h interface.  These allocate
    #   in a way that usually does not involve acquisition of a global lock.
    #   Currently requires -DGC_LINUX_THREADS, but should be easy to port to
    #   other pthreads environments.  Recommended for multiprocessors.
    # -DPARALLEL_MARK allows the marker to run in multiple threads.  Recommended
    #   for multiprocessors.  Currently requires Linux on X86 or IA64, though
    #   support for other Posix platforms should be fairly easy to add,
    #   if the thread implementation is otherwise supported.
    # -DNO_GETENV prevents the collector from looking at environment variables.
    #   These may otherwise alter its configuration, or turn off GC altogether.
    #   I don't know of a reason to disable this, except possibly if the
    #   resulting process runs as a privileged user?
    # -DUSE_GLOBAL_ALLOC.  Win32 only.  Use GlobalAlloc instead of
    #   VirtualAlloc to allocate the heap.  May be needed to work around
    #   a Windows NT/2000 issue.  Incompatible with USE_MUNMAP.
    #   See README.win32 for details.
    # -DMAKE_BACK_GRAPH. Enable GC_PRINT_BACK_HEIGHT environment variable.
    #   See README.environment for details.  Experimental. Limited platform
    #   support.  Implies DBG_HDRS_ALL.  All allocation should be done using
    #   the debug interface.
    # -DSTUBBORN_ALLOC allows allocation of "hard to change" objects, and thus
    #   makes incremental collection easier.  Was enabled by default until 6.0.
    #   Rarely used, to my knowledge.
    # -DHANDLE_FORK attempts to make GC_malloc() work in a child process fork()ed
    #   from a multithreaded parent.  Currently only supported by linux_threads.c.
    #   (Similar code should work on Solaris or Irix, but it hasn't been tried.)
    

    사용법

    인터페이스

    ----
    contributor lostship
    ----
    도구분류
    Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2021-02-07 05:23:18
    Processing time 0.0137 sec