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