1Building and installing a packaged release of jemalloc can be as simple as
2typing the following while in the root directory of the source tree:
3
4    ./configure
5    make
6    make install
7
8If building from unpackaged developer sources, the simplest command sequence
9that might work is:
10
11    ./autogen.sh
12    make dist
13    make
14    make install
15
16Note that documentation is not built by the default target because doing so
17would create a dependency on xsltproc in packaged releases, hence the
18requirement to either run 'make dist' or avoid installing docs via the various
19install_* targets documented below.
20
21=== Advanced configuration =====================================================
22
23The 'configure' script supports numerous options that allow control of which
24functionality is enabled, where jemalloc is installed, etc.  Optionally, pass
25any of the following arguments (not a definitive list) to 'configure':
26
27--help
28    Print a definitive list of options.
29
30--prefix=<install-root-dir>
31    Set the base directory in which to install.  For example:
32
33        ./configure --prefix=/usr/local
34
35    will cause files to be installed into /usr/local/include, /usr/local/lib,
36    and /usr/local/man.
37
38--with-rpath=<colon-separated-rpath>
39    Embed one or more library paths, so that libjemalloc can find the libraries
40    it is linked to.  This works only on ELF-based systems.
41
42--with-mangling=<map>
43    Mangle public symbols specified in <map> which is a comma-separated list of
44    name:mangled pairs.
45
46    For example, to use ld's --wrap option as an alternative method for
47    overriding libc's malloc implementation, specify something like:
48
49      --with-mangling=malloc:__wrap_malloc,free:__wrap_free[...]
50
51    Note that mangling happens prior to application of the prefix specified by
52    --with-jemalloc-prefix, and mangled symbols are then ignored when applying
53    the prefix.
54
55--with-jemalloc-prefix=<prefix>
56    Prefix all public APIs with <prefix>.  For example, if <prefix> is
57    "prefix_", API changes like the following occur:
58
59      malloc()         --> prefix_malloc()
60      malloc_conf      --> prefix_malloc_conf
61      /etc/malloc.conf --> /etc/prefix_malloc.conf
62      MALLOC_CONF      --> PREFIX_MALLOC_CONF
63
64    This makes it possible to use jemalloc at the same time as the system
65    allocator, or even to use multiple copies of jemalloc simultaneously.
66
67    By default, the prefix is "", except on OS X, where it is "je_".  On OS X,
68    jemalloc overlays the default malloc zone, but makes no attempt to actually
69    replace the "malloc", "calloc", etc. symbols.
70
71--without-export
72    Don't export public APIs.  This can be useful when building jemalloc as a
73    static library, or to avoid exporting public APIs when using the zone
74    allocator on OSX.
75
76--with-private-namespace=<prefix>
77    Prefix all library-private APIs with <prefix>je_.  For shared libraries,
78    symbol visibility mechanisms prevent these symbols from being exported, but
79    for static libraries, naming collisions are a real possibility.  By
80    default, <prefix> is empty, which results in a symbol prefix of je_ .
81
82--with-install-suffix=<suffix>
83    Append <suffix> to the base name of all installed files, such that multiple
84    versions of jemalloc can coexist in the same installation directory.  For
85    example, libjemalloc.so.0 becomes libjemalloc<suffix>.so.0.
86
87--with-malloc-conf=<malloc_conf>
88    Embed <malloc_conf> as a run-time options string that is processed prior to
89    the malloc_conf global variable, the /etc/malloc.conf symlink, and the
90    MALLOC_CONF environment variable.  For example, to change the default chunk
91    size to 256 KiB:
92
93      --with-malloc-conf=lg_chunk:18
94
95--disable-cc-silence
96    Disable code that silences non-useful compiler warnings.  This is mainly
97    useful during development when auditing the set of warnings that are being
98    silenced.
99
100--enable-debug
101    Enable assertions and validation code.  This incurs a substantial
102    performance hit, but is very useful during application development.
103    Implies --enable-ivsalloc.
104
105--enable-code-coverage
106    Enable code coverage support, for use during jemalloc test development.
107    Additional testing targets are available if this option is enabled:
108
109      coverage
110      coverage_unit
111      coverage_integration
112      coverage_stress
113
114    These targets do not clear code coverage results from previous runs, and
115    there are interactions between the various coverage targets, so it is
116    usually advisable to run 'make clean' between repeated code coverage runs.
117
118--disable-stats
119    Disable statistics gathering functionality.  See the "opt.stats_print"
120    option documentation for usage details.
121
122--enable-ivsalloc
123    Enable validation code, which verifies that pointers reside within
124    jemalloc-owned chunks before dereferencing them.  This incurs a minor
125    performance hit.
126
127--enable-prof
128    Enable heap profiling and leak detection functionality.  See the "opt.prof"
129    option documentation for usage details.  When enabled, there are several
130    approaches to backtracing, and the configure script chooses the first one
131    in the following list that appears to function correctly:
132
133    + libunwind      (requires --enable-prof-libunwind)
134    + libgcc         (unless --disable-prof-libgcc)
135    + gcc intrinsics (unless --disable-prof-gcc)
136
137--enable-prof-libunwind
138    Use the libunwind library (http://www.nongnu.org/libunwind/) for stack
139    backtracing.
140
141--disable-prof-libgcc
142    Disable the use of libgcc's backtracing functionality.
143
144--disable-prof-gcc
145    Disable the use of gcc intrinsics for backtracing.
146
147--with-static-libunwind=<libunwind.a>
148    Statically link against the specified libunwind.a rather than dynamically
149    linking with -lunwind.
150
151--disable-tcache
152    Disable thread-specific caches for small objects.  Objects are cached and
153    released in bulk, thus reducing the total number of mutex operations.  See
154    the "opt.tcache" option for usage details.
155
156--disable-munmap
157    Disable virtual memory deallocation via munmap(2); instead keep track of
158    the virtual memory for later use.  munmap() is disabled by default (i.e.
159    --disable-munmap is implied) on Linux, which has a quirk in its virtual
160    memory allocation algorithm that causes semi-permanent VM map holes under
161    normal jemalloc operation.
162
163--disable-fill
164    Disable support for junk/zero filling of memory, quarantine, and redzones.
165    See the "opt.junk", "opt.zero", "opt.quarantine", and "opt.redzone" option
166    documentation for usage details.
167
168--disable-valgrind
169    Disable support for Valgrind.
170
171--disable-zone-allocator
172    Disable zone allocator for Darwin.  This means jemalloc won't be hooked as
173    the default allocator on OSX/iOS.
174
175--enable-utrace
176    Enable utrace(2)-based allocation tracing.  This feature is not broadly
177    portable (FreeBSD has it, but Linux and OS X do not).
178
179--enable-xmalloc
180    Enable support for optional immediate termination due to out-of-memory
181    errors, as is commonly implemented by "xmalloc" wrapper function for malloc.
182    See the "opt.xmalloc" option documentation for usage details.
183
184--enable-lazy-lock
185    Enable code that wraps pthread_create() to detect when an application
186    switches from single-threaded to multi-threaded mode, so that it can avoid
187    mutex locking/unlocking operations while in single-threaded mode.  In
188    practice, this feature usually has little impact on performance unless
189    thread-specific caching is disabled.
190
191--disable-tls
192    Disable thread-local storage (TLS), which allows for fast access to
193    thread-local variables via the __thread keyword.  If TLS is available,
194    jemalloc uses it for several purposes.
195
196--disable-cache-oblivious
197    Disable cache-oblivious large allocation alignment for large allocation
198    requests with no alignment constraints.  If this feature is disabled, all
199    large allocations are page-aligned as an implementation artifact, which can
200    severely harm CPU cache utilization.  However, the cache-oblivious layout
201    comes at the cost of one extra page per large allocation, which in the
202    most extreme case increases physical memory usage for the 16 KiB size class
203    to 20 KiB.
204
205--with-xslroot=<path>
206    Specify where to find DocBook XSL stylesheets when building the
207    documentation.
208
209--with-lg-page=<lg-page>
210    Specify the base 2 log of the system page size.  This option is only useful
211    when cross compiling, since the configure script automatically determines
212    the host's page size by default.
213
214--with-lg-page-sizes=<lg-page-sizes>
215    Specify the comma-separated base 2 logs of the page sizes to support.  This
216    option may be useful when cross-compiling in combination with
217    --with-lg-page, but its primary use case is for integration with FreeBSD's
218    libc, wherein jemalloc is embedded.
219
220--with-lg-size-class-group=<lg-size-class-group>
221    Specify the base 2 log of how many size classes to use for each doubling in
222    size.  By default jemalloc uses <lg-size-class-group>=2, which results in
223    e.g. the following size classes:
224
225      [...], 64,
226      80, 96, 112, 128,
227      160, [...]
228
229    <lg-size-class-group>=3 results in e.g. the following size classes:
230
231      [...], 64,
232      72, 80, 88, 96, 104, 112, 120, 128,
233      144, [...]
234
235    The minimal <lg-size-class-group>=0 causes jemalloc to only provide size
236    classes that are powers of 2:
237
238      [...],
239      64,
240      128,
241      256,
242      [...]
243
244    An implementation detail currently limits the total number of small size
245    classes to 255, and a compilation error will result if the
246    <lg-size-class-group> you specify cannot be supported.  The limit is
247    roughly <lg-size-class-group>=4, depending on page size.
248
249--with-lg-quantum=<lg-quantum>
250    Specify the base 2 log of the minimum allocation alignment.  jemalloc needs
251    to know the minimum alignment that meets the following C standard
252    requirement (quoted from the April 12, 2011 draft of the C11 standard):
253
254      The pointer returned if the allocation succeeds is suitably aligned so
255      that it may be assigned to a pointer to any type of object with a
256      fundamental alignment requirement and then used to access such an object
257      or an array of such objects in the space allocated [...]
258
259    This setting is architecture-specific, and although jemalloc includes known
260    safe values for the most commonly used modern architectures, there is a
261    wrinkle related to GNU libc (glibc) that may impact your choice of
262    <lg-quantum>.  On most modern architectures, this mandates 16-byte alignment
263    (<lg-quantum>=4), but the glibc developers chose not to meet this
264    requirement for performance reasons.  An old discussion can be found at
265    https://sourceware.org/bugzilla/show_bug.cgi?id=206 .  Unlike glibc,
266    jemalloc does follow the C standard by default (caveat: jemalloc
267    technically cheats if --with-lg-tiny-min is smaller than
268    --with-lg-quantum), but the fact that Linux systems already work around
269    this allocator noncompliance means that it is generally safe in practice to
270    let jemalloc's minimum alignment follow glibc's lead.  If you specify
271    --with-lg-quantum=3 during configuration, jemalloc will provide additional
272    size classes that are not 16-byte-aligned (24, 40, and 56, assuming
273    --with-lg-size-class-group=2).
274
275--with-lg-tiny-min=<lg-tiny-min>
276    Specify the base 2 log of the minimum tiny size class to support.  Tiny
277    size classes are powers of 2 less than the quantum, and are only
278    incorporated if <lg-tiny-min> is less than <lg-quantum> (see
279    --with-lg-quantum).  Tiny size classes technically violate the C standard
280    requirement for minimum alignment, and crashes could conceivably result if
281    the compiler were to generate instructions that made alignment assumptions,
282    both because illegal instruction traps could result, and because accesses
283    could straddle page boundaries and cause segmentation faults due to
284    accessing unmapped addresses.
285
286    The default of <lg-tiny-min>=3 works well in practice even on architectures
287    that technically require 16-byte alignment, probably for the same reason
288    --with-lg-quantum=3 works.  Smaller tiny size classes can, and will, cause
289    crashes (see https://bugzilla.mozilla.org/show_bug.cgi?id=691003 for an
290    example).
291
292    This option is rarely useful, and is mainly provided as documentation of a
293    subtle implementation detail.  If you do use this option, specify a
294    value in [3, ..., <lg-quantum>].
295
296The following environment variables (not a definitive list) impact configure's
297behavior:
298
299CFLAGS="?"
300    Pass these flags to the compiler.  You probably shouldn't define this unless
301    you know what you are doing.  (Use EXTRA_CFLAGS instead.)
302
303EXTRA_CFLAGS="?"
304    Append these flags to CFLAGS.  This makes it possible to add flags such as
305    -Werror, while allowing the configure script to determine what other flags
306    are appropriate for the specified configuration.
307
308    The configure script specifically checks whether an optimization flag (-O*)
309    is specified in EXTRA_CFLAGS, and refrains from specifying an optimization
310    level if it finds that one has already been specified.
311
312CPPFLAGS="?"
313    Pass these flags to the C preprocessor.  Note that CFLAGS is not passed to
314    'cpp' when 'configure' is looking for include files, so you must use
315    CPPFLAGS instead if you need to help 'configure' find header files.
316
317LD_LIBRARY_PATH="?"
318    'ld' uses this colon-separated list to find libraries.
319
320LDFLAGS="?"
321    Pass these flags when linking.
322
323PATH="?"
324    'configure' uses this to find programs.
325
326=== Advanced compilation =======================================================
327
328To build only parts of jemalloc, use the following targets:
329
330    build_lib_shared
331    build_lib_static
332    build_lib
333    build_doc_html
334    build_doc_man
335    build_doc
336
337To install only parts of jemalloc, use the following targets:
338
339    install_bin
340    install_include
341    install_lib_shared
342    install_lib_static
343    install_lib
344    install_doc_html
345    install_doc_man
346    install_doc
347
348To clean up build results to varying degrees, use the following make targets:
349
350    clean
351    distclean
352    relclean
353
354=== Advanced installation ======================================================
355
356Optionally, define make variables when invoking make, including (not
357exclusively):
358
359INCLUDEDIR="?"
360    Use this as the installation prefix for header files.
361
362LIBDIR="?"
363    Use this as the installation prefix for libraries.
364
365MANDIR="?"
366    Use this as the installation prefix for man pages.
367
368DESTDIR="?"
369    Prepend DESTDIR to INCLUDEDIR, LIBDIR, DATADIR, and MANDIR.  This is useful
370    when installing to a different path than was specified via --prefix.
371
372CC="?"
373    Use this to invoke the C compiler.
374
375CFLAGS="?"
376    Pass these flags to the compiler.
377
378CPPFLAGS="?"
379    Pass these flags to the C preprocessor.
380
381LDFLAGS="?"
382    Pass these flags when linking.
383
384PATH="?"
385    Use this to search for programs used during configuration and building.
386
387=== Development ================================================================
388
389If you intend to make non-trivial changes to jemalloc, use the 'autogen.sh'
390script rather than 'configure'.  This re-generates 'configure', enables
391configuration dependency rules, and enables re-generation of automatically
392generated source files.
393
394The build system supports using an object directory separate from the source
395tree.  For example, you can create an 'obj' directory, and from within that
396directory, issue configuration and build commands:
397
398    autoconf
399    mkdir obj
400    cd obj
401    ../configure --enable-autogen
402    make
403
404=== Documentation ==============================================================
405
406The manual page is generated in both html and roff formats.  Any web browser
407can be used to view the html manual.  The roff manual page can be formatted
408prior to installation via the following command:
409
410    nroff -man -t doc/jemalloc.3
411