179 lines
8.4 KiB
Markdown
179 lines
8.4 KiB
Markdown
# jemalloc-sys - Rust bindings to the `jemalloc` C library
|
|
|
|
[![Travis-CI Status]][travis] [![Appveyor Status]][appveyor] [![Latest Version]][crates.io] [![docs]][docs.rs]
|
|
|
|
> Note: the Rust allocator API is implemented for `jemalloc` in the
|
|
> [`jemallocator`](https://crates.io/crates/jemallocator) crate.
|
|
|
|
## Documentation
|
|
|
|
* [Latest release (docs.rs)][docs.rs]
|
|
* [master branch`][master_docs]
|
|
|
|
`jemalloc` is a general purpose memory allocator, its documentation
|
|
|
|
can be found here:
|
|
|
|
* [API documentation][jemalloc_docs]
|
|
* [Wiki][jemalloc_wiki] (design documents, presentations, profiling, debugging, tuning, ...)
|
|
|
|
[jemalloc_docs]: http://jemalloc.net/jemalloc.3.html
|
|
[jemalloc_wiki]: https://github.com/jemalloc/jemalloc/wiki
|
|
|
|
**Current jemalloc version**: 5.1.
|
|
|
|
## Platform support
|
|
|
|
See the platform support of the
|
|
[`jemallocator`](https://crates.io/crates/jemallocator) crate.
|
|
|
|
## Features
|
|
|
|
Most features correspond to `jemalloc` features - the reference is
|
|
[`jemalloc/INSTALL.md`][jemalloc_install].
|
|
|
|
### Cargo features
|
|
|
|
This crate provides following cargo feature flags:
|
|
|
|
* `profiling` (configure `jemalloc` with `--enable-prof`): Enable heap profiling
|
|
and leak detection functionality. See jemalloc's "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)
|
|
|
|
* `stats` (configure `jemalloc` with `--enable-stats`): Enable statistics
|
|
gathering functionality. See the `jemalloc`'s "`opt.stats_print`" option
|
|
documentation for usage details.
|
|
|
|
* `debug` (configure `jemalloc` with `--enable-debug`): Enable assertions and
|
|
validation code. This incurs a substantial performance hit, but is very useful
|
|
during application development.
|
|
|
|
* `background_threads_runtime_support` (enabled by default): enables
|
|
background-threads run-time support when building `jemalloc-sys` on some POSIX
|
|
targets supported by `jemalloc`. Background threads are disabled at run-time
|
|
by default. This option allows dynamically enabling them at run-time.
|
|
|
|
* `background_threads` (disabled by default): enables background threads by
|
|
default at run-time. When set to true, background threads are created on
|
|
demand (the number of background threads will be no more than the number of
|
|
CPUs or active arenas). Threads run periodically, and handle purging
|
|
asynchronously. When switching off, background threads are terminated
|
|
synchronously. Note that after `fork(2)` function, the state in the child
|
|
process will be disabled regardless the state in parent process. See
|
|
`stats.background_thread` for related stats. `opt.background_thread` can be
|
|
used to set the default option. The background thread is only available on
|
|
selected pthread-based platforms.
|
|
|
|
* `unprefixed_malloc_on_supported_platforms`: when disabled, configure
|
|
`jemalloc` with `--with-jemalloc-prefix=_rjem_`. Enabling this causes symbols
|
|
like `malloc` to be emitted without a prefix, overriding the ones defined by
|
|
libc. This usually causes C and C++ code linked in the same program to use
|
|
`jemalloc` as well. On some platforms prefixes are always used because
|
|
unprefixing is known to cause segfaults due to allocator mismatches.
|
|
|
|
* `disable_initial_exec_tls` (disabled by default): when enabled, jemalloc is
|
|
built with the `--disable-initial-exec-tls` option. It disables the
|
|
initial-exec TLS model for jemalloc's internal thread-local storage (on those
|
|
platforms that support explicit settings). This can allow jemalloc to be
|
|
dynamically loaded after program startup (e.g. using dlopen). If you encounter
|
|
the error `yourlib.so: cannot allocate memory in static TLS block`, you'll
|
|
likely want to enable this.
|
|
|
|
### Environment variables
|
|
|
|
`jemalloc` options taking values are passed via environment variables using the
|
|
schema `JEMALLOC_SYS_{KEY}=VALUE` where the `KEY` names correspond to the
|
|
`./configure` options of `jemalloc` where the words are capitalized and the
|
|
hyphens `-` are replaced with underscores `_`(see
|
|
[`jemalloc/INSTALL.md`][jemalloc_install]):
|
|
|
|
* `JEMALLOC_SYS_WITH_MALLOC_CONF=<malloc_conf>`: Embed `<malloc_conf>` as a
|
|
run-time options string that is processed prior to the `malloc_conf` global
|
|
variable, the `/etc/malloc.conf` symlink, and the `MALLOC_CONF` environment
|
|
variable (note: this variable might be prefixed as `_RJEM_MALLOC_CONF`). For
|
|
example, to change the default decay time to 30 seconds:
|
|
|
|
```
|
|
JEMALLOC_SYS_WITH_MALLOC_CONF=decay_ms:30000
|
|
```
|
|
|
|
* `JEMALLOC_SYS_WITH_LG_PAGE=<lg-page>`: Specify the base 2 log of the allocator
|
|
page size, which must in turn be at least as large as the system page size. By
|
|
default the configure script determines the host's page size and sets the
|
|
allocator page size equal to the system page size, so this option need not be
|
|
specified unless the system page size may change between configuration and
|
|
execution, e.g. when cross compiling.
|
|
|
|
* `JEMALLOC_SYS_WITH_LG_HUGEPAGE=<lg-hugepage>`: Specify the base 2 log of the
|
|
system huge page size. This option is useful when cross compiling, or when
|
|
overriding the default for systems that do not explicitly support huge pages.
|
|
|
|
|
|
* `JEMALLOC_SYS_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 . On most
|
|
modern architectures, this mandates 16-byte alignment (=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 for size classes smaller than the 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 `JEMALLOC_SYS_WITH_LG_QUANTUM=3`
|
|
during configuration, jemalloc will provide additional size classes that are
|
|
not 16-byte-aligned (24, 40, and 56).
|
|
|
|
* `JEMALLOC_SYS_WITH_LG_VADDR=<lg-vaddr>`: Specify the number of significant
|
|
virtual address bits. By default, the configure script attempts to detect
|
|
virtual address size on those platforms where it knows how, and picks a
|
|
default otherwise. This option may be useful when cross-compiling.
|
|
|
|
* `JEMALLOC_SYS_GIT_DEV_BRANCH`: when this environment variable is defined, the
|
|
latest commit from `jemalloc`'s dev branch is fetched from
|
|
`https://github.com/jemalloc/jemalloc` and built.
|
|
|
|
[jemalloc_install]: https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md#advanced-configuration
|
|
|
|
## License
|
|
|
|
This project is licensed under either of
|
|
|
|
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
http://www.apache.org/licenses/LICENSE-2.0)
|
|
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
http://opensource.org/licenses/MIT)
|
|
|
|
at your option.
|
|
|
|
## Contribution
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally submitted
|
|
for inclusion in `jemalloc-sys` by you, as defined in the Apache-2.0 license,
|
|
shall be dual licensed as above, without any additional terms or conditions.
|
|
|
|
[travis]: https://travis-ci.org/gnzlbg/jemallocator
|
|
[Travis-CI Status]: https://travis-ci.org/gnzlbg/jemallocator.svg?branch=master
|
|
[appveyor]: https://ci.appveyor.com/project/gnzlbg/jemallocator/branch/master
|
|
[Appveyor Status]: https://ci.appveyor.com/api/projects/status/github/gnzlbg/jemallocator?branch=master&svg=true
|
|
[Latest Version]: https://img.shields.io/crates/v/jemalloc-sys.svg
|
|
[crates.io]: https://crates.io/crates/jemalloc-ctl
|
|
[docs]: https://docs.rs/jemalloc-sys/badge.svg
|
|
[docs.rs]: https://docs.rs/jemalloc-sys/
|
|
[master_docs]: https://gnzlbg.github.io/jemallocator/jemalloc-sys
|