README.md
1# jemalloc-sys - Rust bindings to the `jemalloc` C library
2
3[![Travis-CI Status]][travis] [![Latest Version]][crates.io] [![docs]][docs.rs]
4
5> Note: the Rust allocator API is implemented for `jemalloc` in the
6> [`tikv-jemallocator`](https://crates.io/crates/tikv-jemallocator) crate.
7
8## Documentation
9
10* [Latest release (docs.rs)][docs.rs]
11
12`jemalloc` is a general purpose memory allocator, its documentation
13
14 can be found here:
15
16* [API documentation][jemalloc_docs]
17* [Wiki][jemalloc_wiki] (design documents, presentations, profiling, debugging, tuning, ...)
18
19[jemalloc_docs]: http://jemalloc.net/jemalloc.3.html
20[jemalloc_wiki]: https://github.com/jemalloc/jemalloc/wiki
21
22**Current jemalloc version**: 5.2.1.
23
24## Platform support
25
26See the platform support of the
27[`tikv-jemallocator`](https://crates.io/crates/tikv-jemallocator) crate.
28
29## Features
30
31Most features correspond to `jemalloc` features - the reference is
32[`jemalloc/INSTALL.md`][jemalloc_install].
33
34### Cargo features
35
36This crate provides following cargo feature flags:
37
38* `profiling` (configure `jemalloc` with `--enable-prof`): Enable heap profiling
39 and leak detection functionality. See jemalloc's "opt.prof" option
40 documentation for usage details. When enabled, there are several approaches to
41 backtracing, and the configure script chooses the first one in the following
42 list that appears to function correctly:
43
44 * `libunwind` (requires --enable-prof-libunwind)
45 * `libgcc` (unless --disable-prof-libgcc)
46 * `gcc intrinsics` (unless --disable-prof-gcc)
47
48* `stats` (configure `jemalloc` with `--enable-stats`): Enable statistics
49 gathering functionality. See the `jemalloc`'s "`opt.stats_print`" option
50 documentation for usage details.
51
52* `debug` (configure `jemalloc` with `--enable-debug`): Enable assertions and
53 validation code. This incurs a substantial performance hit, but is very useful
54 during application development.
55
56* `background_threads_runtime_support` (enabled by default): enables
57 background-threads run-time support when building `jemalloc-sys` on some POSIX
58 targets supported by `jemalloc`. Background threads are disabled at run-time
59 by default. This option allows dynamically enabling them at run-time.
60
61* `background_threads` (disabled by default): enables background threads by
62 default at run-time. When set to true, background threads are created on
63 demand (the number of background threads will be no more than the number of
64 CPUs or active arenas). Threads run periodically, and handle purging
65 asynchronously. When switching off, background threads are terminated
66 synchronously. Note that after `fork(2)` function, the state in the child
67 process will be disabled regardless the state in parent process. See
68 `stats.background_thread` for related stats. `opt.background_thread` can be
69 used to set the default option. The background thread is only available on
70 selected pthread-based platforms.
71
72* `unprefixed_malloc_on_supported_platforms`: when disabled, configure
73 `jemalloc` with `--with-jemalloc-prefix=_rjem_`. Enabling this causes symbols
74 like `malloc` to be emitted without a prefix, overriding the ones defined by
75 libc. This usually causes C and C++ code linked in the same program to use
76 `jemalloc` as well. On some platforms prefixes are always used because
77 unprefixing is known to cause segfaults due to allocator mismatches.
78
79* `disable_initial_exec_tls` (disabled by default): when enabled, jemalloc is
80 built with the `--disable-initial-exec-tls` option. It disables the
81 initial-exec TLS model for jemalloc's internal thread-local storage (on those
82 platforms that support explicit settings). This can allow jemalloc to be
83 dynamically loaded after program startup (e.g. using dlopen). If you encounter
84 the error `yourlib.so: cannot allocate memory in static TLS block`, you'll
85 likely want to enable this.
86
87* `disable_cache_oblivious` (disabled by default): when enabled, jemalloc is
88 built with the `--disable-cache-oblivious` option. In that case, all large
89 allocations are page-aligned as an implementation artifact. It may severely
90 harm CPU cache utilization. However, the cache-oblivious layout has a cost of
91 one extra page per large allocation which can be unfeasible for certain
92 applications.
93
94### Environment variables
95
96`jemalloc` options taking values are passed via environment variables using the
97schema `JEMALLOC_SYS_{KEY}=VALUE` where the `KEY` names correspond to the
98`./configure` options of `jemalloc` where the words are capitalized and the
99hyphens `-` are replaced with underscores `_`(see
100[`jemalloc/INSTALL.md`][jemalloc_install]):
101
102* `JEMALLOC_SYS_WITH_MALLOC_CONF=<malloc_conf>`: Embed `<malloc_conf>` as a
103 run-time options string that is processed prior to the `malloc_conf` global
104 variable, the `/etc/malloc.conf` symlink, and the `MALLOC_CONF` environment
105 variable (note: this variable might be prefixed as `_RJEM_MALLOC_CONF`). For
106 example, to change the default decay time for dirty pages to 30 seconds:
107
108 ```
109 JEMALLOC_SYS_WITH_MALLOC_CONF=dirty_decay_ms:30000
110 ```
111
112* `JEMALLOC_SYS_WITH_LG_PAGE=<lg-page>`: Specify the base 2 log of the allocator
113 page size, which must in turn be at least as large as the system page size. By
114 default the configure script determines the host's page size and sets the
115 allocator page size equal to the system page size, so this option need not be
116 specified unless the system page size may change between configuration and
117 execution, e.g. when cross compiling.
118
119* `JEMALLOC_SYS_WITH_LG_HUGEPAGE=<lg-hugepage>`: Specify the base 2 log of the
120 system huge page size. This option is useful when cross compiling, or when
121 overriding the default for systems that do not explicitly support huge pages.
122
123
124* `JEMALLOC_SYS_WITH_LG_QUANTUM=<lg-quantum>`: Specify the base 2 log of the
125 minimum allocation alignment. jemalloc needs to know the minimum alignment
126 that meets the following C standard requirement (quoted from the April 12,
127 2011 draft of the C11 standard):
128
129 > The pointer returned if the allocation succeeds is suitably aligned so that
130 > it may be assigned to a pointer to any type of object with a fundamental
131 > alignment requirement and then used to access such an object or an array of
132 > such objects in the space allocated [...]
133
134 This setting is architecture-specific, and although jemalloc includes known
135 safe values for the most commonly used modern architectures, there is a
136 wrinkle related to GNU libc (glibc) that may impact your choice of . On most
137 modern architectures, this mandates 16-byte alignment (=4), but the glibc
138 developers chose not to meet this requirement for performance reasons. An old
139 discussion can be found at https://sourceware.org/bugzilla/show_bug.cgi?id=206
140 . Unlike glibc, jemalloc does follow the C standard by default (caveat:
141 jemalloc technically cheats for size classes smaller than the quantum), but
142 the fact that Linux systems already work around this allocator noncompliance
143 means that it is generally safe in practice to let jemalloc's minimum
144 alignment follow glibc's lead. If you specify `JEMALLOC_SYS_WITH_LG_QUANTUM=3`
145 during configuration, jemalloc will provide additional size classes that are
146 not 16-byte-aligned (24, 40, and 56).
147
148* `JEMALLOC_SYS_WITH_LG_VADDR=<lg-vaddr>`: Specify the number of significant
149 virtual address bits. By default, the configure script attempts to detect
150 virtual address size on those platforms where it knows how, and picks a
151 default otherwise. This option may be useful when cross-compiling.
152
153[jemalloc_install]: https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md#advanced-configuration
154
155## License
156
157This project is licensed under either of
158
159 * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
160 http://www.apache.org/licenses/LICENSE-2.0)
161 * MIT license ([LICENSE-MIT](LICENSE-MIT) or
162 http://opensource.org/licenses/MIT)
163
164at your option.
165
166## Contribution
167
168Unless you explicitly state otherwise, any contribution intentionally submitted
169for inclusion in `tikv-jemalloc-sys` by you, as defined in the Apache-2.0 license,
170shall be dual licensed as above, without any additional terms or conditions.
171
172[travis]: https://travis-ci.com/tikv/jemallocator
173[Travis-CI Status]: https://travis-ci.com/tikv/jemallocator.svg?branch=master
174[Latest Version]: https://img.shields.io/crates/v/tikv-jemallocator.svg
175[crates.io]: https://crates.io/crates/tikv-jemallocator
176[docs]: https://docs.rs/tikv-jemallocator/badge.svg
177[docs.rs]: https://docs.rs/tikv-jemallocator/
178