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