| Building and installing a packaged release of jemalloc can be as simple as | |
| typing the following while in the root directory of the source tree: | |
| ./configure | |
| make | |
| make install | |
| If building from unpackaged developer sources, the simplest command sequence | |
| that might work is: | |
| ./autogen.sh | |
| make dist | |
| make | |
| make install | |
| Note that documentation is not built by the default target because doing so | |
| would create a dependency on xsltproc in packaged releases, hence the | |
| requirement to either run 'make dist' or avoid installing docs via the various | |
| install_* targets documented below. | |
| === Advanced configuration ===================================================== | |
| The 'configure' script supports numerous options that allow control of which | |
| functionality is enabled, where jemalloc is installed, etc. Optionally, pass | |
| any of the following arguments (not a definitive list) to 'configure': | |
| --help | |
| Print a definitive list of options. | |
| --prefix=<install-root-dir> | |
| Set the base directory in which to install. For example: | |
| ./configure --prefix=/usr/local | |
| will cause files to be installed into /usr/local/include, /usr/local/lib, | |
| and /usr/local/man. | |
| --with-rpath=<colon-separated-rpath> | |
| Embed one or more library paths, so that libjemalloc can find the libraries | |
| it is linked to. This works only on ELF-based systems. | |
| --with-mangling=<map> | |
| Mangle public symbols specified in <map> which is a comma-separated list of | |
| name:mangled pairs. | |
| For example, to use ld's --wrap option as an alternative method for | |
| overriding libc's malloc implementation, specify something like: | |
| --with-mangling=malloc:__wrap_malloc,free:__wrap_free[...] | |
| Note that mangling happens prior to application of the prefix specified by | |
| --with-jemalloc-prefix, and mangled symbols are then ignored when applying | |
| the prefix. | |
| --with-jemalloc-prefix=<prefix> | |
| Prefix all public APIs with <prefix>. For example, if <prefix> is | |
| "prefix_", API changes like the following occur: | |
| malloc() --> prefix_malloc() | |
| malloc_conf --> prefix_malloc_conf | |
| /etc/malloc.conf --> /etc/prefix_malloc.conf | |
| MALLOC_CONF --> PREFIX_MALLOC_CONF | |
| This makes it possible to use jemalloc at the same time as the system | |
| allocator, or even to use multiple copies of jemalloc simultaneously. | |
| By default, the prefix is "", except on OS X, where it is "je_". On OS X, | |
| jemalloc overlays the default malloc zone, but makes no attempt to actually | |
| replace the "malloc", "calloc", etc. symbols. | |
| --without-export | |
| Don't export public APIs. This can be useful when building jemalloc as a | |
| static library, or to avoid exporting public APIs when using the zone | |
| allocator on OSX. | |
| --with-private-namespace=<prefix> | |
| Prefix all library-private APIs with <prefix>je_. For shared libraries, | |
| symbol visibility mechanisms prevent these symbols from being exported, but | |
| for static libraries, naming collisions are a real possibility. By | |
| default, <prefix> is empty, which results in a symbol prefix of je_ . | |
| --with-install-suffix=<suffix> | |
| Append <suffix> to the base name of all installed files, such that multiple | |
| versions of jemalloc can coexist in the same installation directory. For | |
| example, libjemalloc.so.0 becomes libjemalloc<suffix>.so.0. | |
| --disable-cc-silence | |
| Disable code that silences non-useful compiler warnings. This is mainly | |
| useful during development when auditing the set of warnings that are being | |
| silenced. | |
| --enable-debug | |
| Enable assertions and validation code. This incurs a substantial | |
| performance hit, but is very useful during application development. | |
| Implies --enable-ivsalloc. | |
| --enable-code-coverage | |
| Enable code coverage support, for use during jemalloc test development. | |
| Additional testing targets are available if this option is enabled: | |
| coverage | |
| coverage_unit | |
| coverage_integration | |
| coverage_stress | |
| These targets do not clear code coverage results from previous runs, and | |
| there are interactions between the various coverage targets, so it is | |
| usually advisable to run 'make clean' between repeated code coverage runs. | |
| --disable-stats | |
| Disable statistics gathering functionality. See the "opt.stats_print" | |
| option documentation for usage details. | |
| --enable-ivsalloc | |
| Enable validation code, which verifies that pointers reside within | |
| jemalloc-owned chunks before dereferencing them. This incurs a minor | |
| performance hit. | |
| --enable-prof | |
| Enable heap profiling and leak detection functionality. See the "opt.prof" | |
| option documentation for usage details. When enabled, there are several | |
| approaches to backtracing, and the configure script chooses the first one | |
| in the following list that appears to function correctly: | |
| + libunwind (requires --enable-prof-libunwind) | |
| + libgcc (unless --disable-prof-libgcc) | |
| + gcc intrinsics (unless --disable-prof-gcc) | |
| --enable-prof-libunwind | |
| Use the libunwind library (http://www.nongnu.org/libunwind/) for stack | |
| backtracing. | |
| --disable-prof-libgcc | |
| Disable the use of libgcc's backtracing functionality. | |
| --disable-prof-gcc | |
| Disable the use of gcc intrinsics for backtracing. | |
| --with-static-libunwind=<libunwind.a> | |
| Statically link against the specified libunwind.a rather than dynamically | |
| linking with -lunwind. | |
| --disable-tcache | |
| Disable thread-specific caches for small objects. Objects are cached and | |
| released in bulk, thus reducing the total number of mutex operations. See | |
| the "opt.tcache" option for usage details. | |
| --disable-munmap | |
| Disable virtual memory deallocation via munmap(2); instead keep track of | |
| the virtual memory for later use. munmap() is disabled by default (i.e. | |
| --disable-munmap is implied) on Linux, which has a quirk in its virtual | |
| memory allocation algorithm that causes semi-permanent VM map holes under | |
| normal jemalloc operation. | |
| --disable-fill | |
| Disable support for junk/zero filling of memory, quarantine, and redzones. | |
| See the "opt.junk", "opt.zero", "opt.quarantine", and "opt.redzone" option | |
| documentation for usage details. | |
| --disable-valgrind | |
| Disable support for Valgrind. | |
| --disable-zone-allocator | |
| Disable zone allocator for Darwin. This means jemalloc won't be hooked as | |
| the default allocator on OSX/iOS. | |
| --enable-utrace | |
| Enable utrace(2)-based allocation tracing. This feature is not broadly | |
| portable (FreeBSD has it, but Linux and OS X do not). | |
| --enable-xmalloc | |
| Enable support for optional immediate termination due to out-of-memory | |
| errors, as is commonly implemented by "xmalloc" wrapper function for malloc. | |
| See the "opt.xmalloc" option documentation for usage details. | |
| --enable-lazy-lock | |
| Enable code that wraps pthread_create() to detect when an application | |
| switches from single-threaded to multi-threaded mode, so that it can avoid | |
| mutex locking/unlocking operations while in single-threaded mode. In | |
| practice, this feature usually has little impact on performance unless | |
| thread-specific caching is disabled. | |
| --disable-tls | |
| Disable thread-local storage (TLS), which allows for fast access to | |
| thread-local variables via the __thread keyword. If TLS is available, | |
| jemalloc uses it for several purposes. | |
| --disable-cache-oblivious | |
| Disable cache-oblivious large allocation alignment for large allocation | |
| requests with no alignment constraints. If this feature is disabled, all | |
| large allocations are page-aligned as an implementation artifact, which can | |
| severely harm CPU cache utilization. However, the cache-oblivious layout | |
| comes at the cost of one extra page per large allocation, which in the | |
| most extreme case increases physical memory usage for the 16 KiB size class | |
| to 20 KiB. | |
| --with-xslroot=<path> | |
| Specify where to find DocBook XSL stylesheets when building the | |
| documentation. | |
| --with-lg-page=<lg-page> | |
| Specify the base 2 log of the system page size. This option is only useful | |
| when cross compiling, since the configure script automatically determines | |
| the host's page size by default. | |
| --with-lg-page-sizes=<lg-page-sizes> | |
| Specify the comma-separated base 2 logs of the page sizes to support. This | |
| option may be useful when cross-compiling in combination with | |
| --with-lg-page, but its primary use case is for integration with FreeBSD's | |
| libc, wherein jemalloc is embedded. | |
| --with-lg-size-class-group=<lg-size-class-group> | |
| Specify the base 2 log of how many size classes to use for each doubling in | |
| size. By default jemalloc uses <lg-size-class-group>=2, which results in | |
| e.g. the following size classes: | |
| [...], 64, | |
| 80, 96, 112, 128, | |
| 160, [...] | |
| <lg-size-class-group>=3 results in e.g. the following size classes: | |
| [...], 64, | |
| 72, 80, 88, 96, 104, 112, 120, 128, | |
| 144, [...] | |
| The minimal <lg-size-class-group>=0 causes jemalloc to only provide size | |
| classes that are powers of 2: | |
| [...], | |
| 64, | |
| 128, | |
| 256, | |
| [...] | |
| An implementation detail currently limits the total number of small size | |
| classes to 255, and a compilation error will result if the | |
| <lg-size-class-group> you specify cannot be supported. The limit is | |
| roughly <lg-size-class-group>=4, depending on page size. | |
| --with-lg-quantum=<lg-quantum> | |
| Specify the base 2 log of the minimum allocation alignment. jemalloc needs | |
| to know the minimum alignment that meets the following C standard | |
| requirement (quoted from the April 12, 2011 draft of the C11 standard): | |
| The pointer returned if the allocation succeeds is suitably aligned so | |
| that it may be assigned to a pointer to any type of object with a | |
| fundamental alignment requirement and then used to access such an object | |
| or an array of such objects in the space allocated [...] | |
| This setting is architecture-specific, and although jemalloc includes known | |
| safe values for the most commonly used modern architectures, there is a | |
| wrinkle related to GNU libc (glibc) that may impact your choice of | |
| <lg-quantum>. On most modern architectures, this mandates 16-byte alignment | |
| (<lg-quantum>=4), but the glibc developers chose not to meet this | |
| requirement for performance reasons. An old discussion can be found at | |
| https://sourceware.org/bugzilla/show_bug.cgi?id=206 . Unlike glibc, | |
| jemalloc does follow the C standard by default (caveat: jemalloc | |
| technically cheats if --with-lg-tiny-min is smaller than | |
| --with-lg-quantum), but the fact that Linux systems already work around | |
| this allocator noncompliance means that it is generally safe in practice to | |
| let jemalloc's minimum alignment follow glibc's lead. If you specify | |
| --with-lg-quantum=3 during configuration, jemalloc will provide additional | |
| size classes that are not 16-byte-aligned (24, 40, and 56, assuming | |
| --with-lg-size-class-group=2). | |
| --with-lg-tiny-min=<lg-tiny-min> | |
| Specify the base 2 log of the minimum tiny size class to support. Tiny | |
| size classes are powers of 2 less than the quantum, and are only | |
| incorporated if <lg-tiny-min> is less than <lg-quantum> (see | |
| --with-lg-quantum). Tiny size classes technically violate the C standard | |
| requirement for minimum alignment, and crashes could conceivably result if | |
| the compiler were to generate instructions that made alignment assumptions, | |
| both because illegal instruction traps could result, and because accesses | |
| could straddle page boundaries and cause segmentation faults due to | |
| accessing unmapped addresses. | |
| The default of <lg-tiny-min>=3 works well in practice even on architectures | |
| that technically require 16-byte alignment, probably for the same reason | |
| --with-lg-quantum=3 works. Smaller tiny size classes can, and will, cause | |
| crashes (see https://bugzilla.mozilla.org/show_bug.cgi?id=691003 for an | |
| example). | |
| This option is rarely useful, and is mainly provided as documentation of a | |
| subtle implementation detail. If you do use this option, specify a | |
| value in [3, ..., <lg-quantum>]. | |
| The following environment variables (not a definitive list) impact configure's | |
| behavior: | |
| CFLAGS="?" | |
| Pass these flags to the compiler. You probably shouldn't define this unless | |
| you know what you are doing. (Use EXTRA_CFLAGS instead.) | |
| EXTRA_CFLAGS="?" | |
| Append these flags to CFLAGS. This makes it possible to add flags such as | |
| -Werror, while allowing the configure script to determine what other flags | |
| are appropriate for the specified configuration. | |
| The configure script specifically checks whether an optimization flag (-O*) | |
| is specified in EXTRA_CFLAGS, and refrains from specifying an optimization | |
| level if it finds that one has already been specified. | |
| CPPFLAGS="?" | |
| Pass these flags to the C preprocessor. Note that CFLAGS is not passed to | |
| 'cpp' when 'configure' is looking for include files, so you must use | |
| CPPFLAGS instead if you need to help 'configure' find header files. | |
| LD_LIBRARY_PATH="?" | |
| 'ld' uses this colon-separated list to find libraries. | |
| LDFLAGS="?" | |
| Pass these flags when linking. | |
| PATH="?" | |
| 'configure' uses this to find programs. | |
| === Advanced compilation ======================================================= | |
| To build only parts of jemalloc, use the following targets: | |
| build_lib_shared | |
| build_lib_static | |
| build_lib | |
| build_doc_html | |
| build_doc_man | |
| build_doc | |
| To install only parts of jemalloc, use the following targets: | |
| install_bin | |
| install_include | |
| install_lib_shared | |
| install_lib_static | |
| install_lib | |
| install_doc_html | |
| install_doc_man | |
| install_doc | |
| To clean up build results to varying degrees, use the following make targets: | |
| clean | |
| distclean | |
| relclean | |
| === Advanced installation ====================================================== | |
| Optionally, define make variables when invoking make, including (not | |
| exclusively): | |
| INCLUDEDIR="?" | |
| Use this as the installation prefix for header files. | |
| LIBDIR="?" | |
| Use this as the installation prefix for libraries. | |
| MANDIR="?" | |
| Use this as the installation prefix for man pages. | |
| DESTDIR="?" | |
| Prepend DESTDIR to INCLUDEDIR, LIBDIR, DATADIR, and MANDIR. This is useful | |
| when installing to a different path than was specified via --prefix. | |
| CC="?" | |
| Use this to invoke the C compiler. | |
| CFLAGS="?" | |
| Pass these flags to the compiler. | |
| CPPFLAGS="?" | |
| Pass these flags to the C preprocessor. | |
| LDFLAGS="?" | |
| Pass these flags when linking. | |
| PATH="?" | |
| Use this to search for programs used during configuration and building. | |
| === Development ================================================================ | |
| If you intend to make non-trivial changes to jemalloc, use the 'autogen.sh' | |
| script rather than 'configure'. This re-generates 'configure', enables | |
| configuration dependency rules, and enables re-generation of automatically | |
| generated source files. | |
| The build system supports using an object directory separate from the source | |
| tree. For example, you can create an 'obj' directory, and from within that | |
| directory, issue configuration and build commands: | |
| autoconf | |
| mkdir obj | |
| cd obj | |
| ../configure --enable-autogen | |
| make | |
| === Documentation ============================================================== | |
| The manual page is generated in both html and roff formats. Any web browser | |
| can be used to view the html manual. The roff manual page can be formatted | |
| prior to installation via the following command: | |
| nroff -man -t doc/jemalloc.3 |