1<?xml version='1.0' encoding='UTF-8'?>
2<?xml-stylesheet type="text/xsl"
3        href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"?>
4<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
5        "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
6]>
7
8<refentry>
9  <refentryinfo>
10    <title>User Manual</title>
11    <productname>jemalloc</productname>
12    <releaseinfo role="version">@jemalloc_version@</releaseinfo>
13    <authorgroup>
14      <author>
15        <firstname>Jason</firstname>
16        <surname>Evans</surname>
17        <personblurb>Author</personblurb>
18      </author>
19    </authorgroup>
20  </refentryinfo>
21  <refmeta>
22    <refentrytitle>JEMALLOC</refentrytitle>
23    <manvolnum>3</manvolnum>
24  </refmeta>
25  <refnamediv>
26    <refdescriptor>jemalloc</refdescriptor>
27    <refname>jemalloc</refname>
28    <!-- Each refname causes a man page file to be created.  Only if this were
29         the system malloc(3) implementation would these files be appropriate.
30    <refname>malloc</refname>
31    <refname>calloc</refname>
32    <refname>posix_memalign</refname>
33    <refname>aligned_alloc</refname>
34    <refname>realloc</refname>
35    <refname>free</refname>
36    <refname>mallocx</refname>
37    <refname>rallocx</refname>
38    <refname>xallocx</refname>
39    <refname>sallocx</refname>
40    <refname>dallocx</refname>
41    <refname>sdallocx</refname>
42    <refname>nallocx</refname>
43    <refname>mallctl</refname>
44    <refname>mallctlnametomib</refname>
45    <refname>mallctlbymib</refname>
46    <refname>malloc_stats_print</refname>
47    <refname>malloc_usable_size</refname>
48    -->
49    <refpurpose>general purpose memory allocation functions</refpurpose>
50  </refnamediv>
51  <refsect1 id="library">
52    <title>LIBRARY</title>
53    <para>This manual describes jemalloc @jemalloc_version@.  More information
54    can be found at the <ulink
55    url="http://www.canonware.com/jemalloc/">jemalloc website</ulink>.</para>
56  </refsect1>
57  <refsynopsisdiv>
58    <title>SYNOPSIS</title>
59    <funcsynopsis>
60      <funcsynopsisinfo>#include &lt;<filename class="headerfile">jemalloc/jemalloc.h</filename>&gt;</funcsynopsisinfo>
61      <refsect2>
62        <title>Standard API</title>
63        <funcprototype>
64          <funcdef>void *<function>malloc</function></funcdef>
65          <paramdef>size_t <parameter>size</parameter></paramdef>
66        </funcprototype>
67        <funcprototype>
68          <funcdef>void *<function>calloc</function></funcdef>
69          <paramdef>size_t <parameter>number</parameter></paramdef>
70          <paramdef>size_t <parameter>size</parameter></paramdef>
71        </funcprototype>
72        <funcprototype>
73          <funcdef>int <function>posix_memalign</function></funcdef>
74          <paramdef>void **<parameter>ptr</parameter></paramdef>
75          <paramdef>size_t <parameter>alignment</parameter></paramdef>
76          <paramdef>size_t <parameter>size</parameter></paramdef>
77        </funcprototype>
78        <funcprototype>
79          <funcdef>void *<function>aligned_alloc</function></funcdef>
80          <paramdef>size_t <parameter>alignment</parameter></paramdef>
81          <paramdef>size_t <parameter>size</parameter></paramdef>
82        </funcprototype>
83        <funcprototype>
84          <funcdef>void *<function>realloc</function></funcdef>
85          <paramdef>void *<parameter>ptr</parameter></paramdef>
86          <paramdef>size_t <parameter>size</parameter></paramdef>
87        </funcprototype>
88        <funcprototype>
89          <funcdef>void <function>free</function></funcdef>
90          <paramdef>void *<parameter>ptr</parameter></paramdef>
91        </funcprototype>
92      </refsect2>
93      <refsect2>
94        <title>Non-standard API</title>
95        <funcprototype>
96          <funcdef>void *<function>mallocx</function></funcdef>
97          <paramdef>size_t <parameter>size</parameter></paramdef>
98          <paramdef>int <parameter>flags</parameter></paramdef>
99        </funcprototype>
100        <funcprototype>
101          <funcdef>void *<function>rallocx</function></funcdef>
102          <paramdef>void *<parameter>ptr</parameter></paramdef>
103          <paramdef>size_t <parameter>size</parameter></paramdef>
104          <paramdef>int <parameter>flags</parameter></paramdef>
105        </funcprototype>
106        <funcprototype>
107          <funcdef>size_t <function>xallocx</function></funcdef>
108          <paramdef>void *<parameter>ptr</parameter></paramdef>
109          <paramdef>size_t <parameter>size</parameter></paramdef>
110          <paramdef>size_t <parameter>extra</parameter></paramdef>
111          <paramdef>int <parameter>flags</parameter></paramdef>
112        </funcprototype>
113        <funcprototype>
114          <funcdef>size_t <function>sallocx</function></funcdef>
115          <paramdef>void *<parameter>ptr</parameter></paramdef>
116          <paramdef>int <parameter>flags</parameter></paramdef>
117        </funcprototype>
118        <funcprototype>
119          <funcdef>void <function>dallocx</function></funcdef>
120          <paramdef>void *<parameter>ptr</parameter></paramdef>
121          <paramdef>int <parameter>flags</parameter></paramdef>
122        </funcprototype>
123        <funcprototype>
124          <funcdef>void <function>sdallocx</function></funcdef>
125          <paramdef>void *<parameter>ptr</parameter></paramdef>
126          <paramdef>size_t <parameter>size</parameter></paramdef>
127          <paramdef>int <parameter>flags</parameter></paramdef>
128        </funcprototype>
129        <funcprototype>
130          <funcdef>size_t <function>nallocx</function></funcdef>
131          <paramdef>size_t <parameter>size</parameter></paramdef>
132          <paramdef>int <parameter>flags</parameter></paramdef>
133        </funcprototype>
134        <funcprototype>
135          <funcdef>int <function>mallctl</function></funcdef>
136          <paramdef>const char *<parameter>name</parameter></paramdef>
137          <paramdef>void *<parameter>oldp</parameter></paramdef>
138          <paramdef>size_t *<parameter>oldlenp</parameter></paramdef>
139          <paramdef>void *<parameter>newp</parameter></paramdef>
140          <paramdef>size_t <parameter>newlen</parameter></paramdef>
141        </funcprototype>
142        <funcprototype>
143          <funcdef>int <function>mallctlnametomib</function></funcdef>
144          <paramdef>const char *<parameter>name</parameter></paramdef>
145          <paramdef>size_t *<parameter>mibp</parameter></paramdef>
146          <paramdef>size_t *<parameter>miblenp</parameter></paramdef>
147        </funcprototype>
148        <funcprototype>
149          <funcdef>int <function>mallctlbymib</function></funcdef>
150          <paramdef>const size_t *<parameter>mib</parameter></paramdef>
151          <paramdef>size_t <parameter>miblen</parameter></paramdef>
152          <paramdef>void *<parameter>oldp</parameter></paramdef>
153          <paramdef>size_t *<parameter>oldlenp</parameter></paramdef>
154          <paramdef>void *<parameter>newp</parameter></paramdef>
155          <paramdef>size_t <parameter>newlen</parameter></paramdef>
156        </funcprototype>
157        <funcprototype>
158          <funcdef>void <function>malloc_stats_print</function></funcdef>
159          <paramdef>void <parameter>(*write_cb)</parameter>
160            <funcparams>void *, const char *</funcparams>
161          </paramdef>
162          <paramdef>void *<parameter>cbopaque</parameter></paramdef>
163          <paramdef>const char *<parameter>opts</parameter></paramdef>
164        </funcprototype>
165        <funcprototype>
166          <funcdef>size_t <function>malloc_usable_size</function></funcdef>
167          <paramdef>const void *<parameter>ptr</parameter></paramdef>
168        </funcprototype>
169        <funcprototype>
170          <funcdef>void <function>(*malloc_message)</function></funcdef>
171          <paramdef>void *<parameter>cbopaque</parameter></paramdef>
172          <paramdef>const char *<parameter>s</parameter></paramdef>
173        </funcprototype>
174        <para><type>const char *</type><varname>malloc_conf</varname>;</para>
175      </refsect2>
176    </funcsynopsis>
177  </refsynopsisdiv>
178  <refsect1 id="description">
179    <title>DESCRIPTION</title>
180    <refsect2>
181      <title>Standard API</title>
182
183      <para>The <function>malloc<parameter/></function> function allocates
184      <parameter>size</parameter> bytes of uninitialized memory.  The allocated
185      space is suitably aligned (after possible pointer coercion) for storage
186      of any type of object.</para>
187
188      <para>The <function>calloc<parameter/></function> function allocates
189      space for <parameter>number</parameter> objects, each
190      <parameter>size</parameter> bytes in length.  The result is identical to
191      calling <function>malloc<parameter/></function> with an argument of
192      <parameter>number</parameter> * <parameter>size</parameter>, with the
193      exception that the allocated memory is explicitly initialized to zero
194      bytes.</para>
195
196      <para>The <function>posix_memalign<parameter/></function> function
197      allocates <parameter>size</parameter> bytes of memory such that the
198      allocation's base address is a multiple of
199      <parameter>alignment</parameter>, and returns the allocation in the value
200      pointed to by <parameter>ptr</parameter>.  The requested
201      <parameter>alignment</parameter> must be a power of 2 at least as large as
202      <code language="C">sizeof(<type>void *</type>)</code>.</para>
203
204      <para>The <function>aligned_alloc<parameter/></function> function
205      allocates <parameter>size</parameter> bytes of memory such that the
206      allocation's base address is a multiple of
207      <parameter>alignment</parameter>.  The requested
208      <parameter>alignment</parameter> must be a power of 2.  Behavior is
209      undefined if <parameter>size</parameter> is not an integral multiple of
210      <parameter>alignment</parameter>.</para>
211
212      <para>The <function>realloc<parameter/></function> function changes the
213      size of the previously allocated memory referenced by
214      <parameter>ptr</parameter> to <parameter>size</parameter> bytes.  The
215      contents of the memory are unchanged up to the lesser of the new and old
216      sizes.  If the new size is larger, the contents of the newly allocated
217      portion of the memory are undefined.  Upon success, the memory referenced
218      by <parameter>ptr</parameter> is freed and a pointer to the newly
219      allocated memory is returned.  Note that
220      <function>realloc<parameter/></function> may move the memory allocation,
221      resulting in a different return value than <parameter>ptr</parameter>.
222      If <parameter>ptr</parameter> is <constant>NULL</constant>, the
223      <function>realloc<parameter/></function> function behaves identically to
224      <function>malloc<parameter/></function> for the specified size.</para>
225
226      <para>The <function>free<parameter/></function> function causes the
227      allocated memory referenced by <parameter>ptr</parameter> to be made
228      available for future allocations.  If <parameter>ptr</parameter> is
229      <constant>NULL</constant>, no action occurs.</para>
230    </refsect2>
231    <refsect2>
232      <title>Non-standard API</title>
233      <para>The <function>mallocx<parameter/></function>,
234      <function>rallocx<parameter/></function>,
235      <function>xallocx<parameter/></function>,
236      <function>sallocx<parameter/></function>,
237      <function>dallocx<parameter/></function>,
238      <function>sdallocx<parameter/></function>, and
239      <function>nallocx<parameter/></function> functions all have a
240      <parameter>flags</parameter> argument that can be used to specify
241      options.  The functions only check the options that are contextually
242      relevant.  Use bitwise or (<code language="C">|</code>) operations to
243      specify one or more of the following:
244        <variablelist>
245          <varlistentry id="MALLOCX_LG_ALIGN">
246            <term><constant>MALLOCX_LG_ALIGN(<parameter>la</parameter>)
247            </constant></term>
248
249            <listitem><para>Align the memory allocation to start at an address
250            that is a multiple of <code language="C">(1 &lt;&lt;
251            <parameter>la</parameter>)</code>.  This macro does not validate
252            that <parameter>la</parameter> is within the valid
253            range.</para></listitem>
254          </varlistentry>
255          <varlistentry id="MALLOCX_ALIGN">
256            <term><constant>MALLOCX_ALIGN(<parameter>a</parameter>)
257            </constant></term>
258
259            <listitem><para>Align the memory allocation to start at an address
260            that is a multiple of <parameter>a</parameter>, where
261            <parameter>a</parameter> is a power of two.  This macro does not
262            validate that <parameter>a</parameter> is a power of 2.
263            </para></listitem>
264          </varlistentry>
265          <varlistentry id="MALLOCX_ZERO">
266            <term><constant>MALLOCX_ZERO</constant></term>
267
268            <listitem><para>Initialize newly allocated memory to contain zero
269            bytes.  In the growing reallocation case, the real size prior to
270            reallocation defines the boundary between untouched bytes and those
271            that are initialized to contain zero bytes.  If this macro is
272            absent, newly allocated memory is uninitialized.</para></listitem>
273          </varlistentry>
274          <varlistentry id="MALLOCX_TCACHE">
275            <term><constant>MALLOCX_TCACHE(<parameter>tc</parameter>)
276            </constant></term>
277
278            <listitem><para>Use the thread-specific cache (tcache) specified by
279            the identifier <parameter>tc</parameter>, which must have been
280            acquired via the <link
281            linkend="tcache.create"><mallctl>tcache.create</mallctl></link>
282            mallctl.  This macro does not validate that
283            <parameter>tc</parameter> specifies a valid
284            identifier.</para></listitem>
285          </varlistentry>
286          <varlistentry id="MALLOC_TCACHE_NONE">
287            <term><constant>MALLOCX_TCACHE_NONE</constant></term>
288
289            <listitem><para>Do not use a thread-specific cache (tcache).  Unless
290            <constant>MALLOCX_TCACHE(<parameter>tc</parameter>)</constant> or
291            <constant>MALLOCX_TCACHE_NONE</constant> is specified, an
292            automatically managed tcache will be used under many circumstances.
293            This macro cannot be used in the same <parameter>flags</parameter>
294            argument as
295            <constant>MALLOCX_TCACHE(<parameter>tc</parameter>)</constant>.</para></listitem>
296          </varlistentry>
297          <varlistentry id="MALLOCX_ARENA">
298            <term><constant>MALLOCX_ARENA(<parameter>a</parameter>)
299            </constant></term>
300
301            <listitem><para>Use the arena specified by the index
302            <parameter>a</parameter>.  This macro has no effect for regions that
303            were allocated via an arena other than the one specified.  This
304            macro does not validate that <parameter>a</parameter> specifies an
305            arena index in the valid range.</para></listitem>
306          </varlistentry>
307        </variablelist>
308      </para>
309
310      <para>The <function>mallocx<parameter/></function> function allocates at
311      least <parameter>size</parameter> bytes of memory, and returns a pointer
312      to the base address of the allocation.  Behavior is undefined if
313      <parameter>size</parameter> is <constant>0</constant>.</para>
314
315      <para>The <function>rallocx<parameter/></function> function resizes the
316      allocation at <parameter>ptr</parameter> to be at least
317      <parameter>size</parameter> bytes, and returns a pointer to the base
318      address of the resulting allocation, which may or may not have moved from
319      its original location.  Behavior is undefined if
320      <parameter>size</parameter> is <constant>0</constant>.</para>
321
322      <para>The <function>xallocx<parameter/></function> function resizes the
323      allocation at <parameter>ptr</parameter> in place to be at least
324      <parameter>size</parameter> bytes, and returns the real size of the
325      allocation.  If <parameter>extra</parameter> is non-zero, an attempt is
326      made to resize the allocation to be at least <code
327      language="C">(<parameter>size</parameter> +
328      <parameter>extra</parameter>)</code> bytes, though inability to allocate
329      the extra byte(s) will not by itself result in failure to resize.
330      Behavior is undefined if <parameter>size</parameter> is
331      <constant>0</constant>, or if <code
332      language="C">(<parameter>size</parameter> + <parameter>extra</parameter>
333      &gt; <constant>SIZE_T_MAX</constant>)</code>.</para>
334
335      <para>The <function>sallocx<parameter/></function> function returns the
336      real size of the allocation at <parameter>ptr</parameter>.</para>
337
338      <para>The <function>dallocx<parameter/></function> function causes the
339      memory referenced by <parameter>ptr</parameter> to be made available for
340      future allocations.</para>
341
342      <para>The <function>sdallocx<parameter/></function> function is an
343      extension of <function>dallocx<parameter/></function> with a
344      <parameter>size</parameter> parameter to allow the caller to pass in the
345      allocation size as an optimization.  The minimum valid input size is the
346      original requested size of the allocation, and the maximum valid input
347      size is the corresponding value returned by
348      <function>nallocx<parameter/></function> or
349      <function>sallocx<parameter/></function>.</para>
350
351      <para>The <function>nallocx<parameter/></function> function allocates no
352      memory, but it performs the same size computation as the
353      <function>mallocx<parameter/></function> function, and returns the real
354      size of the allocation that would result from the equivalent
355      <function>mallocx<parameter/></function> function call, or
356      <constant>0</constant> if the inputs exceed the maximum supported size
357      class and/or alignment.  Behavior is undefined if
358      <parameter>size</parameter> is <constant>0</constant>.</para>
359
360      <para>The <function>mallctl<parameter/></function> function provides a
361      general interface for introspecting the memory allocator, as well as
362      setting modifiable parameters and triggering actions.  The
363      period-separated <parameter>name</parameter> argument specifies a
364      location in a tree-structured namespace; see the <xref
365      linkend="mallctl_namespace" xrefstyle="template:%t"/> section for
366      documentation on the tree contents.  To read a value, pass a pointer via
367      <parameter>oldp</parameter> to adequate space to contain the value, and a
368      pointer to its length via <parameter>oldlenp</parameter>; otherwise pass
369      <constant>NULL</constant> and <constant>NULL</constant>.  Similarly, to
370      write a value, pass a pointer to the value via
371      <parameter>newp</parameter>, and its length via
372      <parameter>newlen</parameter>; otherwise pass <constant>NULL</constant>
373      and <constant>0</constant>.</para>
374
375      <para>The <function>mallctlnametomib<parameter/></function> function
376      provides a way to avoid repeated name lookups for applications that
377      repeatedly query the same portion of the namespace, by translating a name
378      to a &ldquo;Management Information Base&rdquo; (MIB) that can be passed
379      repeatedly to <function>mallctlbymib<parameter/></function>.  Upon
380      successful return from <function>mallctlnametomib<parameter/></function>,
381      <parameter>mibp</parameter> contains an array of
382      <parameter>*miblenp</parameter> integers, where
383      <parameter>*miblenp</parameter> is the lesser of the number of components
384      in <parameter>name</parameter> and the input value of
385      <parameter>*miblenp</parameter>.  Thus it is possible to pass a
386      <parameter>*miblenp</parameter> that is smaller than the number of
387      period-separated name components, which results in a partial MIB that can
388      be used as the basis for constructing a complete MIB.  For name
389      components that are integers (e.g. the 2 in
390      <link
391      linkend="arenas.bin.i.size"><mallctl>arenas.bin.2.size</mallctl></link>),
392      the corresponding MIB component will always be that integer.  Therefore,
393      it is legitimate to construct code like the following: <programlisting
394      language="C"><![CDATA[
395unsigned nbins, i;
396size_t mib[4];
397size_t len, miblen;
398
399len = sizeof(nbins);
400mallctl("arenas.nbins", &nbins, &len, NULL, 0);
401
402miblen = 4;
403mallctlnametomib("arenas.bin.0.size", mib, &miblen);
404for (i = 0; i < nbins; i++) {
405	size_t bin_size;
406
407	mib[2] = i;
408	len = sizeof(bin_size);
409	mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0);
410	/* Do something with bin_size... */
411}]]></programlisting></para>
412
413      <para>The <function>malloc_stats_print<parameter/></function> function
414      writes human-readable summary statistics via the
415      <parameter>write_cb</parameter> callback function pointer and
416      <parameter>cbopaque</parameter> data passed to
417      <parameter>write_cb</parameter>, or
418      <function>malloc_message<parameter/></function> if
419      <parameter>write_cb</parameter> is <constant>NULL</constant>.  This
420      function can be called repeatedly.  General information that never
421      changes during execution can be omitted by specifying "g" as a character
422      within the <parameter>opts</parameter> string.  Note that
423      <function>malloc_message<parameter/></function> uses the
424      <function>mallctl*<parameter/></function> functions internally, so
425      inconsistent statistics can be reported if multiple threads use these
426      functions simultaneously.  If <option>--enable-stats</option> is
427      specified during configuration, &ldquo;m&rdquo; and &ldquo;a&rdquo; can
428      be specified to omit merged arena and per arena statistics, respectively;
429      &ldquo;b&rdquo;, &ldquo;l&rdquo;, and &ldquo;h&rdquo; can be specified to
430      omit per size class statistics for bins, large objects, and huge objects,
431      respectively.  Unrecognized characters are silently ignored.  Note that
432      thread caching may prevent some statistics from being completely up to
433      date, since extra locking would be required to merge counters that track
434      thread cache operations.
435      </para>
436
437      <para>The <function>malloc_usable_size<parameter/></function> function
438      returns the usable size of the allocation pointed to by
439      <parameter>ptr</parameter>.  The return value may be larger than the size
440      that was requested during allocation.  The
441      <function>malloc_usable_size<parameter/></function> function is not a
442      mechanism for in-place <function>realloc<parameter/></function>; rather
443      it is provided solely as a tool for introspection purposes.  Any
444      discrepancy between the requested allocation size and the size reported
445      by <function>malloc_usable_size<parameter/></function> should not be
446      depended on, since such behavior is entirely implementation-dependent.
447      </para>
448    </refsect2>
449  </refsect1>
450  <refsect1 id="tuning">
451    <title>TUNING</title>
452    <para>Once, when the first call is made to one of the memory allocation
453    routines, the allocator initializes its internals based in part on various
454    options that can be specified at compile- or run-time.</para>
455
456    <para>The string specified via <option>--with-malloc-conf</option>, the
457    string pointed to by the global variable <varname>malloc_conf</varname>, the
458    &ldquo;name&rdquo; of the file referenced by the symbolic link named
459    <filename class="symlink">/etc/malloc.conf</filename>, and the value of the
460    environment variable <envar>MALLOC_CONF</envar>, will be interpreted, in
461    that order, from left to right as options.  Note that
462    <varname>malloc_conf</varname> may be read before
463    <function>main<parameter/></function> is entered, so the declaration of
464    <varname>malloc_conf</varname> should specify an initializer that contains
465    the final value to be read by jemalloc.  <option>--with-malloc-conf</option>
466    and <varname>malloc_conf</varname> are compile-time mechanisms, whereas
467    <filename class="symlink">/etc/malloc.conf</filename> and
468    <envar>MALLOC_CONF</envar> can be safely set any time prior to program
469    invocation.</para>
470
471    <para>An options string is a comma-separated list of option:value pairs.
472    There is one key corresponding to each <link
473    linkend="opt.abort"><mallctl>opt.*</mallctl></link> mallctl (see the <xref
474    linkend="mallctl_namespace" xrefstyle="template:%t"/> section for options
475    documentation).  For example, <literal>abort:true,narenas:1</literal> sets
476    the <link linkend="opt.abort"><mallctl>opt.abort</mallctl></link> and <link
477    linkend="opt.narenas"><mallctl>opt.narenas</mallctl></link> options.  Some
478    options have boolean values (true/false), others have integer values (base
479    8, 10, or 16, depending on prefix), and yet others have raw string
480    values.</para>
481  </refsect1>
482  <refsect1 id="implementation_notes">
483    <title>IMPLEMENTATION NOTES</title>
484    <para>Traditionally, allocators have used
485    <citerefentry><refentrytitle>sbrk</refentrytitle>
486    <manvolnum>2</manvolnum></citerefentry> to obtain memory, which is
487    suboptimal for several reasons, including race conditions, increased
488    fragmentation, and artificial limitations on maximum usable memory.  If
489    <citerefentry><refentrytitle>sbrk</refentrytitle>
490    <manvolnum>2</manvolnum></citerefentry> is supported by the operating
491    system, this allocator uses both
492    <citerefentry><refentrytitle>mmap</refentrytitle>
493    <manvolnum>2</manvolnum></citerefentry> and
494    <citerefentry><refentrytitle>sbrk</refentrytitle>
495    <manvolnum>2</manvolnum></citerefentry>, in that order of preference;
496    otherwise only <citerefentry><refentrytitle>mmap</refentrytitle>
497    <manvolnum>2</manvolnum></citerefentry> is used.</para>
498
499    <para>This allocator uses multiple arenas in order to reduce lock
500    contention for threaded programs on multi-processor systems.  This works
501    well with regard to threading scalability, but incurs some costs.  There is
502    a small fixed per-arena overhead, and additionally, arenas manage memory
503    completely independently of each other, which means a small fixed increase
504    in overall memory fragmentation.  These overheads are not generally an
505    issue, given the number of arenas normally used.  Note that using
506    substantially more arenas than the default is not likely to improve
507    performance, mainly due to reduced cache performance.  However, it may make
508    sense to reduce the number of arenas if an application does not make much
509    use of the allocation functions.</para>
510
511    <para>In addition to multiple arenas, unless
512    <option>--disable-tcache</option> is specified during configuration, this
513    allocator supports thread-specific caching for small and large objects, in
514    order to make it possible to completely avoid synchronization for most
515    allocation requests.  Such caching allows very fast allocation in the
516    common case, but it increases memory usage and fragmentation, since a
517    bounded number of objects can remain allocated in each thread cache.</para>
518
519    <para>Memory is conceptually broken into equal-sized chunks, where the chunk
520    size is a power of two that is greater than the page size.  Chunks are
521    always aligned to multiples of the chunk size.  This alignment makes it
522    possible to find metadata for user objects very quickly.  User objects are
523    broken into three categories according to size: small, large, and huge.
524    Multiple small and large objects can reside within a single chunk, whereas
525    huge objects each have one or more chunks backing them.  Each chunk that
526    contains small and/or large objects tracks its contents as runs of
527    contiguous pages (unused, backing a set of small objects, or backing one
528    large object).  The combination of chunk alignment and chunk page maps makes
529    it possible to determine all metadata regarding small and large allocations
530    in constant time.</para>
531
532    <para>Small objects are managed in groups by page runs.  Each run maintains
533    a bitmap to track which regions are in use.  Allocation requests that are no
534    more than half the quantum (8 or 16, depending on architecture) are rounded
535    up to the nearest power of two that is at least <code
536    language="C">sizeof(<type>double</type>)</code>.  All other object size
537    classes are multiples of the quantum, spaced such that there are four size
538    classes for each doubling in size, which limits internal fragmentation to
539    approximately 20% for all but the smallest size classes.  Small size classes
540    are smaller than four times the page size, large size classes are smaller
541    than the chunk size (see the <link
542    linkend="opt.lg_chunk"><mallctl>opt.lg_chunk</mallctl></link> option), and
543    huge size classes extend from the chunk size up to one size class less than
544    the full address space size.</para>
545
546    <para>Allocations are packed tightly together, which can be an issue for
547    multi-threaded applications.  If you need to assure that allocations do not
548    suffer from cacheline sharing, round your allocation requests up to the
549    nearest multiple of the cacheline size, or specify cacheline alignment when
550    allocating.</para>
551
552    <para>The <function>realloc<parameter/></function>,
553    <function>rallocx<parameter/></function>, and
554    <function>xallocx<parameter/></function> functions may resize allocations
555    without moving them under limited circumstances.  Unlike the
556    <function>*allocx<parameter/></function> API, the standard API does not
557    officially round up the usable size of an allocation to the nearest size
558    class, so technically it is necessary to call
559    <function>realloc<parameter/></function> to grow e.g. a 9-byte allocation to
560    16 bytes, or shrink a 16-byte allocation to 9 bytes.  Growth and shrinkage
561    trivially succeeds in place as long as the pre-size and post-size both round
562    up to the same size class.  No other API guarantees are made regarding
563    in-place resizing, but the current implementation also tries to resize large
564    and huge allocations in place, as long as the pre-size and post-size are
565    both large or both huge.  In such cases shrinkage always succeeds for large
566    size classes, but for huge size classes the chunk allocator must support
567    splitting (see <link
568    linkend="arena.i.chunk_hooks"><mallctl>arena.&lt;i&gt;.chunk_hooks</mallctl></link>).
569    Growth only succeeds if the trailing memory is currently available, and
570    additionally for huge size classes the chunk allocator must support
571    merging.</para>
572
573    <para>Assuming 2 MiB chunks, 4 KiB pages, and a 16-byte quantum on a
574    64-bit system, the size classes in each category are as shown in <xref
575    linkend="size_classes" xrefstyle="template:Table %n"/>.</para>
576
577    <table xml:id="size_classes" frame="all">
578      <title>Size classes</title>
579      <tgroup cols="3" colsep="1" rowsep="1">
580      <colspec colname="c1" align="left"/>
581      <colspec colname="c2" align="right"/>
582      <colspec colname="c3" align="left"/>
583      <thead>
584        <row>
585          <entry>Category</entry>
586          <entry>Spacing</entry>
587          <entry>Size</entry>
588        </row>
589      </thead>
590      <tbody>
591        <row>
592          <entry morerows="8">Small</entry>
593          <entry>lg</entry>
594          <entry>[8]</entry>
595        </row>
596        <row>
597          <entry>16</entry>
598          <entry>[16, 32, 48, 64, 80, 96, 112, 128]</entry>
599        </row>
600        <row>
601          <entry>32</entry>
602          <entry>[160, 192, 224, 256]</entry>
603        </row>
604        <row>
605          <entry>64</entry>
606          <entry>[320, 384, 448, 512]</entry>
607        </row>
608        <row>
609          <entry>128</entry>
610          <entry>[640, 768, 896, 1024]</entry>
611        </row>
612        <row>
613          <entry>256</entry>
614          <entry>[1280, 1536, 1792, 2048]</entry>
615        </row>
616        <row>
617          <entry>512</entry>
618          <entry>[2560, 3072, 3584, 4096]</entry>
619        </row>
620        <row>
621          <entry>1 KiB</entry>
622          <entry>[5 KiB, 6 KiB, 7 KiB, 8 KiB]</entry>
623        </row>
624        <row>
625          <entry>2 KiB</entry>
626          <entry>[10 KiB, 12 KiB, 14 KiB]</entry>
627        </row>
628        <row>
629          <entry morerows="7">Large</entry>
630          <entry>2 KiB</entry>
631          <entry>[16 KiB]</entry>
632        </row>
633        <row>
634          <entry>4 KiB</entry>
635          <entry>[20 KiB, 24 KiB, 28 KiB, 32 KiB]</entry>
636        </row>
637        <row>
638          <entry>8 KiB</entry>
639          <entry>[40 KiB, 48 KiB, 54 KiB, 64 KiB]</entry>
640        </row>
641        <row>
642          <entry>16 KiB</entry>
643          <entry>[80 KiB, 96 KiB, 112 KiB, 128 KiB]</entry>
644        </row>
645        <row>
646          <entry>32 KiB</entry>
647          <entry>[160 KiB, 192 KiB, 224 KiB, 256 KiB]</entry>
648        </row>
649        <row>
650          <entry>64 KiB</entry>
651          <entry>[320 KiB, 384 KiB, 448 KiB, 512 KiB]</entry>
652        </row>
653        <row>
654          <entry>128 KiB</entry>
655          <entry>[640 KiB, 768 KiB, 896 KiB, 1 MiB]</entry>
656        </row>
657        <row>
658          <entry>256 KiB</entry>
659          <entry>[1280 KiB, 1536 KiB, 1792 KiB]</entry>
660        </row>
661        <row>
662          <entry morerows="6">Huge</entry>
663          <entry>256 KiB</entry>
664          <entry>[2 MiB]</entry>
665        </row>
666        <row>
667          <entry>512 KiB</entry>
668          <entry>[2560 KiB, 3 MiB, 3584 KiB, 4 MiB]</entry>
669        </row>
670        <row>
671          <entry>1 MiB</entry>
672          <entry>[5 MiB, 6 MiB, 7 MiB, 8 MiB]</entry>
673        </row>
674        <row>
675          <entry>2 MiB</entry>
676          <entry>[10 MiB, 12 MiB, 14 MiB, 16 MiB]</entry>
677        </row>
678        <row>
679          <entry>4 MiB</entry>
680          <entry>[20 MiB, 24 MiB, 28 MiB, 32 MiB]</entry>
681        </row>
682        <row>
683          <entry>8 MiB</entry>
684          <entry>[40 MiB, 48 MiB, 56 MiB, 64 MiB]</entry>
685        </row>
686        <row>
687          <entry>...</entry>
688          <entry>...</entry>
689        </row>
690      </tbody>
691      </tgroup>
692    </table>
693  </refsect1>
694  <refsect1 id="mallctl_namespace">
695    <title>MALLCTL NAMESPACE</title>
696    <para>The following names are defined in the namespace accessible via the
697    <function>mallctl*<parameter/></function> functions.  Value types are
698    specified in parentheses, their readable/writable statuses are encoded as
699    <literal>rw</literal>, <literal>r-</literal>, <literal>-w</literal>, or
700    <literal>--</literal>, and required build configuration flags follow, if
701    any.  A name element encoded as <literal>&lt;i&gt;</literal> or
702    <literal>&lt;j&gt;</literal> indicates an integer component, where the
703    integer varies from 0 to some upper value that must be determined via
704    introspection.  In the case of <mallctl>stats.arenas.&lt;i&gt;.*</mallctl>,
705    <literal>&lt;i&gt;</literal> equal to <link
706    linkend="arenas.narenas"><mallctl>arenas.narenas</mallctl></link> can be
707    used to access the summation of statistics from all arenas.  Take special
708    note of the <link linkend="epoch"><mallctl>epoch</mallctl></link> mallctl,
709    which controls refreshing of cached dynamic statistics.</para>
710
711    <variablelist>
712      <varlistentry id="version">
713        <term>
714          <mallctl>version</mallctl>
715          (<type>const char *</type>)
716          <literal>r-</literal>
717        </term>
718        <listitem><para>Return the jemalloc version string.</para></listitem>
719      </varlistentry>
720
721      <varlistentry id="epoch">
722        <term>
723          <mallctl>epoch</mallctl>
724          (<type>uint64_t</type>)
725          <literal>rw</literal>
726        </term>
727        <listitem><para>If a value is passed in, refresh the data from which
728        the <function>mallctl*<parameter/></function> functions report values,
729        and increment the epoch.  Return the current epoch.  This is useful for
730        detecting whether another thread caused a refresh.</para></listitem>
731      </varlistentry>
732
733      <varlistentry id="config.cache_oblivious">
734        <term>
735          <mallctl>config.cache_oblivious</mallctl>
736          (<type>bool</type>)
737          <literal>r-</literal>
738        </term>
739        <listitem><para><option>--enable-cache-oblivious</option> was specified
740        during build configuration.</para></listitem>
741      </varlistentry>
742
743      <varlistentry id="config.debug">
744        <term>
745          <mallctl>config.debug</mallctl>
746          (<type>bool</type>)
747          <literal>r-</literal>
748        </term>
749        <listitem><para><option>--enable-debug</option> was specified during
750        build configuration.</para></listitem>
751      </varlistentry>
752
753      <varlistentry id="config.fill">
754        <term>
755          <mallctl>config.fill</mallctl>
756          (<type>bool</type>)
757          <literal>r-</literal>
758        </term>
759        <listitem><para><option>--enable-fill</option> was specified during
760        build configuration.</para></listitem>
761      </varlistentry>
762
763      <varlistentry id="config.lazy_lock">
764        <term>
765          <mallctl>config.lazy_lock</mallctl>
766          (<type>bool</type>)
767          <literal>r-</literal>
768        </term>
769        <listitem><para><option>--enable-lazy-lock</option> was specified
770        during build configuration.</para></listitem>
771      </varlistentry>
772
773      <varlistentry id="config.malloc_conf">
774        <term>
775          <mallctl>config.malloc_conf</mallctl>
776          (<type>const char *</type>)
777          <literal>r-</literal>
778        </term>
779        <listitem><para>Embedded configure-time-specified run-time options
780        string, empty unless <option>--with-malloc-conf</option> was specified
781        during build configuration.</para></listitem>
782      </varlistentry>
783
784      <varlistentry id="config.munmap">
785        <term>
786          <mallctl>config.munmap</mallctl>
787          (<type>bool</type>)
788          <literal>r-</literal>
789        </term>
790        <listitem><para><option>--enable-munmap</option> was specified during
791        build configuration.</para></listitem>
792      </varlistentry>
793
794      <varlistentry id="config.prof">
795        <term>
796          <mallctl>config.prof</mallctl>
797          (<type>bool</type>)
798          <literal>r-</literal>
799        </term>
800        <listitem><para><option>--enable-prof</option> was specified during
801        build configuration.</para></listitem>
802      </varlistentry>
803
804      <varlistentry id="config.prof_libgcc">
805        <term>
806          <mallctl>config.prof_libgcc</mallctl>
807          (<type>bool</type>)
808          <literal>r-</literal>
809        </term>
810        <listitem><para><option>--disable-prof-libgcc</option> was not
811        specified during build configuration.</para></listitem>
812      </varlistentry>
813
814      <varlistentry id="config.prof_libunwind">
815        <term>
816          <mallctl>config.prof_libunwind</mallctl>
817          (<type>bool</type>)
818          <literal>r-</literal>
819        </term>
820        <listitem><para><option>--enable-prof-libunwind</option> was specified
821        during build configuration.</para></listitem>
822      </varlistentry>
823
824      <varlistentry id="config.stats">
825        <term>
826          <mallctl>config.stats</mallctl>
827          (<type>bool</type>)
828          <literal>r-</literal>
829        </term>
830        <listitem><para><option>--enable-stats</option> was specified during
831        build configuration.</para></listitem>
832      </varlistentry>
833
834      <varlistentry id="config.tcache">
835        <term>
836          <mallctl>config.tcache</mallctl>
837          (<type>bool</type>)
838          <literal>r-</literal>
839        </term>
840        <listitem><para><option>--disable-tcache</option> was not specified
841        during build configuration.</para></listitem>
842      </varlistentry>
843
844      <varlistentry id="config.tls">
845        <term>
846          <mallctl>config.tls</mallctl>
847          (<type>bool</type>)
848          <literal>r-</literal>
849        </term>
850        <listitem><para><option>--disable-tls</option> was not specified during
851        build configuration.</para></listitem>
852      </varlistentry>
853
854      <varlistentry id="config.utrace">
855        <term>
856          <mallctl>config.utrace</mallctl>
857          (<type>bool</type>)
858          <literal>r-</literal>
859        </term>
860        <listitem><para><option>--enable-utrace</option> was specified during
861        build configuration.</para></listitem>
862      </varlistentry>
863
864      <varlistentry id="config.valgrind">
865        <term>
866          <mallctl>config.valgrind</mallctl>
867          (<type>bool</type>)
868          <literal>r-</literal>
869        </term>
870        <listitem><para><option>--enable-valgrind</option> was specified during
871        build configuration.</para></listitem>
872      </varlistentry>
873
874      <varlistentry id="config.xmalloc">
875        <term>
876          <mallctl>config.xmalloc</mallctl>
877          (<type>bool</type>)
878          <literal>r-</literal>
879        </term>
880        <listitem><para><option>--enable-xmalloc</option> was specified during
881        build configuration.</para></listitem>
882      </varlistentry>
883
884      <varlistentry id="opt.abort">
885        <term>
886          <mallctl>opt.abort</mallctl>
887          (<type>bool</type>)
888          <literal>r-</literal>
889        </term>
890        <listitem><para>Abort-on-warning enabled/disabled.  If true, most
891        warnings are fatal.  The process will call
892        <citerefentry><refentrytitle>abort</refentrytitle>
893        <manvolnum>3</manvolnum></citerefentry> in these cases.  This option is
894        disabled by default unless <option>--enable-debug</option> is
895        specified during configuration, in which case it is enabled by default.
896        </para></listitem>
897      </varlistentry>
898
899      <varlistentry id="opt.dss">
900        <term>
901          <mallctl>opt.dss</mallctl>
902          (<type>const char *</type>)
903          <literal>r-</literal>
904        </term>
905        <listitem><para>dss (<citerefentry><refentrytitle>sbrk</refentrytitle>
906        <manvolnum>2</manvolnum></citerefentry>) allocation precedence as
907        related to <citerefentry><refentrytitle>mmap</refentrytitle>
908        <manvolnum>2</manvolnum></citerefentry> allocation.  The following
909        settings are supported if
910        <citerefentry><refentrytitle>sbrk</refentrytitle>
911        <manvolnum>2</manvolnum></citerefentry> is supported by the operating
912        system: &ldquo;disabled&rdquo;, &ldquo;primary&rdquo;, and
913        &ldquo;secondary&rdquo;; otherwise only &ldquo;disabled&rdquo; is
914        supported.  The default is &ldquo;secondary&rdquo; if
915        <citerefentry><refentrytitle>sbrk</refentrytitle>
916        <manvolnum>2</manvolnum></citerefentry> is supported by the operating
917        system; &ldquo;disabled&rdquo; otherwise.
918        </para></listitem>
919      </varlistentry>
920
921      <varlistentry id="opt.lg_chunk">
922        <term>
923          <mallctl>opt.lg_chunk</mallctl>
924          (<type>size_t</type>)
925          <literal>r-</literal>
926        </term>
927        <listitem><para>Virtual memory chunk size (log base 2).  If a chunk
928        size outside the supported size range is specified, the size is
929        silently clipped to the minimum/maximum supported size.  The default
930        chunk size is 2 MiB (2^21).
931        </para></listitem>
932      </varlistentry>
933
934      <varlistentry id="opt.narenas">
935        <term>
936          <mallctl>opt.narenas</mallctl>
937          (<type>unsigned</type>)
938          <literal>r-</literal>
939        </term>
940        <listitem><para>Maximum number of arenas to use for automatic
941        multiplexing of threads and arenas.  The default is four times the
942        number of CPUs, or one if there is a single CPU.</para></listitem>
943      </varlistentry>
944
945      <varlistentry id="opt.purge">
946        <term>
947          <mallctl>opt.purge</mallctl>
948          (<type>const char *</type>)
949          <literal>r-</literal>
950        </term>
951        <listitem><para>Purge mode is &ldquo;ratio&rdquo; (default) or
952        &ldquo;decay&rdquo;.  See <link
953        linkend="opt.lg_dirty_mult"><mallctl>opt.lg_dirty_mult</mallctl></link>
954        for details of the ratio mode.  See <link
955        linkend="opt.decay_time"><mallctl>opt.decay_time</mallctl></link> for
956        details of the decay mode.</para></listitem>
957      </varlistentry>
958
959      <varlistentry id="opt.lg_dirty_mult">
960        <term>
961          <mallctl>opt.lg_dirty_mult</mallctl>
962          (<type>ssize_t</type>)
963          <literal>r-</literal>
964        </term>
965        <listitem><para>Per-arena minimum ratio (log base 2) of active to dirty
966        pages.  Some dirty unused pages may be allowed to accumulate, within
967        the limit set by the ratio (or one chunk worth of dirty pages,
968        whichever is greater), before informing the kernel about some of those
969        pages via <citerefentry><refentrytitle>madvise</refentrytitle>
970        <manvolnum>2</manvolnum></citerefentry> or a similar system call.  This
971        provides the kernel with sufficient information to recycle dirty pages
972        if physical memory becomes scarce and the pages remain unused.  The
973        default minimum ratio is 8:1 (2^3:1); an option value of -1 will
974        disable dirty page purging.  See <link
975        linkend="arenas.lg_dirty_mult"><mallctl>arenas.lg_dirty_mult</mallctl></link>
976        and <link
977        linkend="arena.i.lg_dirty_mult"><mallctl>arena.&lt;i&gt;.lg_dirty_mult</mallctl></link>
978        for related dynamic control options.</para></listitem>
979      </varlistentry>
980
981      <varlistentry id="opt.decay_time">
982        <term>
983          <mallctl>opt.decay_time</mallctl>
984          (<type>ssize_t</type>)
985          <literal>r-</literal>
986        </term>
987        <listitem><para>Approximate time in seconds from the creation of a set
988        of unused dirty pages until an equivalent set of unused dirty pages is
989        purged and/or reused.  The pages are incrementally purged according to a
990        sigmoidal decay curve that starts and ends with zero purge rate.  A
991        decay time of 0 causes all unused dirty pages to be purged immediately
992        upon creation.  A decay time of -1 disables purging.  The default decay
993        time is 10 seconds.  See <link
994        linkend="arenas.decay_time"><mallctl>arenas.decay_time</mallctl></link>
995        and <link
996        linkend="arena.i.decay_time"><mallctl>arena.&lt;i&gt;.decay_time</mallctl></link>
997        for related dynamic control options.
998        </para></listitem>
999      </varlistentry>
1000
1001      <varlistentry id="opt.stats_print">
1002        <term>
1003          <mallctl>opt.stats_print</mallctl>
1004          (<type>bool</type>)
1005          <literal>r-</literal>
1006        </term>
1007        <listitem><para>Enable/disable statistics printing at exit.  If
1008        enabled, the <function>malloc_stats_print<parameter/></function>
1009        function is called at program exit via an
1010        <citerefentry><refentrytitle>atexit</refentrytitle>
1011        <manvolnum>3</manvolnum></citerefentry> function.  If
1012        <option>--enable-stats</option> is specified during configuration, this
1013        has the potential to cause deadlock for a multi-threaded process that
1014        exits while one or more threads are executing in the memory allocation
1015        functions.  Furthermore, <function>atexit<parameter/></function> may
1016        allocate memory during application initialization and then deadlock
1017        internally when jemalloc in turn calls
1018        <function>atexit<parameter/></function>, so this option is not
1019        univerally usable (though the application can register its own
1020        <function>atexit<parameter/></function> function with equivalent
1021        functionality).  Therefore, this option should only be used with care;
1022        it is primarily intended as a performance tuning aid during application
1023        development.  This option is disabled by default.</para></listitem>
1024      </varlistentry>
1025
1026      <varlistentry id="opt.junk">
1027        <term>
1028          <mallctl>opt.junk</mallctl>
1029          (<type>const char *</type>)
1030          <literal>r-</literal>
1031          [<option>--enable-fill</option>]
1032        </term>
1033        <listitem><para>Junk filling.  If set to "alloc", each byte of
1034        uninitialized allocated memory will be initialized to
1035        <literal>0xa5</literal>.  If set to "free", all deallocated memory will
1036        be initialized to <literal>0x5a</literal>.  If set to "true", both
1037        allocated and deallocated memory will be initialized, and if set to
1038        "false", junk filling be disabled entirely.  This is intended for
1039        debugging and will impact performance negatively.  This option is
1040        "false" by default unless <option>--enable-debug</option> is specified
1041        during configuration, in which case it is "true" by default unless
1042        running inside <ulink
1043        url="http://valgrind.org/">Valgrind</ulink>.</para></listitem>
1044      </varlistentry>
1045
1046      <varlistentry id="opt.quarantine">
1047        <term>
1048          <mallctl>opt.quarantine</mallctl>
1049          (<type>size_t</type>)
1050          <literal>r-</literal>
1051          [<option>--enable-fill</option>]
1052        </term>
1053        <listitem><para>Per thread quarantine size in bytes.  If non-zero, each
1054        thread maintains a FIFO object quarantine that stores up to the
1055        specified number of bytes of memory.  The quarantined memory is not
1056        freed until it is released from quarantine, though it is immediately
1057        junk-filled if the <link
1058        linkend="opt.junk"><mallctl>opt.junk</mallctl></link> option is
1059        enabled.  This feature is of particular use in combination with <ulink
1060        url="http://valgrind.org/">Valgrind</ulink>, which can detect attempts
1061        to access quarantined objects.  This is intended for debugging and will
1062        impact performance negatively.  The default quarantine size is 0 unless
1063        running inside Valgrind, in which case the default is 16
1064        MiB.</para></listitem>
1065      </varlistentry>
1066
1067      <varlistentry id="opt.redzone">
1068        <term>
1069          <mallctl>opt.redzone</mallctl>
1070          (<type>bool</type>)
1071          <literal>r-</literal>
1072          [<option>--enable-fill</option>]
1073        </term>
1074        <listitem><para>Redzones enabled/disabled.  If enabled, small
1075        allocations have redzones before and after them.  Furthermore, if the
1076        <link linkend="opt.junk"><mallctl>opt.junk</mallctl></link> option is
1077        enabled, the redzones are checked for corruption during deallocation.
1078        However, the primary intended purpose of this feature is to be used in
1079        combination with <ulink url="http://valgrind.org/">Valgrind</ulink>,
1080        which needs redzones in order to do effective buffer overflow/underflow
1081        detection.  This option is intended for debugging and will impact
1082        performance negatively.  This option is disabled by
1083        default unless running inside Valgrind.</para></listitem>
1084      </varlistentry>
1085
1086      <varlistentry id="opt.zero">
1087        <term>
1088          <mallctl>opt.zero</mallctl>
1089          (<type>bool</type>)
1090          <literal>r-</literal>
1091          [<option>--enable-fill</option>]
1092        </term>
1093        <listitem><para>Zero filling enabled/disabled.  If enabled, each byte
1094        of uninitialized allocated memory will be initialized to 0.  Note that
1095        this initialization only happens once for each byte, so
1096        <function>realloc<parameter/></function> and
1097        <function>rallocx<parameter/></function> calls do not zero memory that
1098        was previously allocated.  This is intended for debugging and will
1099        impact performance negatively.  This option is disabled by default.
1100        </para></listitem>
1101      </varlistentry>
1102
1103      <varlistentry id="opt.utrace">
1104        <term>
1105          <mallctl>opt.utrace</mallctl>
1106          (<type>bool</type>)
1107          <literal>r-</literal>
1108          [<option>--enable-utrace</option>]
1109        </term>
1110        <listitem><para>Allocation tracing based on
1111        <citerefentry><refentrytitle>utrace</refentrytitle>
1112        <manvolnum>2</manvolnum></citerefentry> enabled/disabled.  This option
1113        is disabled by default.</para></listitem>
1114      </varlistentry>
1115
1116      <varlistentry id="opt.xmalloc">
1117        <term>
1118          <mallctl>opt.xmalloc</mallctl>
1119          (<type>bool</type>)
1120          <literal>r-</literal>
1121          [<option>--enable-xmalloc</option>]
1122        </term>
1123        <listitem><para>Abort-on-out-of-memory enabled/disabled.  If enabled,
1124        rather than returning failure for any allocation function, display a
1125        diagnostic message on <constant>STDERR_FILENO</constant> and cause the
1126        program to drop core (using
1127        <citerefentry><refentrytitle>abort</refentrytitle>
1128        <manvolnum>3</manvolnum></citerefentry>).  If an application is
1129        designed to depend on this behavior, set the option at compile time by
1130        including the following in the source code:
1131        <programlisting language="C"><![CDATA[
1132malloc_conf = "xmalloc:true";]]></programlisting>
1133        This option is disabled by default.</para></listitem>
1134      </varlistentry>
1135
1136      <varlistentry id="opt.tcache">
1137        <term>
1138          <mallctl>opt.tcache</mallctl>
1139          (<type>bool</type>)
1140          <literal>r-</literal>
1141          [<option>--enable-tcache</option>]
1142        </term>
1143        <listitem><para>Thread-specific caching (tcache) enabled/disabled.  When
1144        there are multiple threads, each thread uses a tcache for objects up to
1145        a certain size.  Thread-specific caching allows many allocations to be
1146        satisfied without performing any thread synchronization, at the cost of
1147        increased memory use.  See the <link
1148        linkend="opt.lg_tcache_max"><mallctl>opt.lg_tcache_max</mallctl></link>
1149        option for related tuning information.  This option is enabled by
1150        default unless running inside <ulink
1151        url="http://valgrind.org/">Valgrind</ulink>, in which case it is
1152        forcefully disabled.</para></listitem>
1153      </varlistentry>
1154
1155      <varlistentry id="opt.lg_tcache_max">
1156        <term>
1157          <mallctl>opt.lg_tcache_max</mallctl>
1158          (<type>size_t</type>)
1159          <literal>r-</literal>
1160          [<option>--enable-tcache</option>]
1161        </term>
1162        <listitem><para>Maximum size class (log base 2) to cache in the
1163        thread-specific cache (tcache).  At a minimum, all small size classes
1164        are cached, and at a maximum all large size classes are cached.  The
1165        default maximum is 32 KiB (2^15).</para></listitem>
1166      </varlistentry>
1167
1168      <varlistentry id="opt.prof">
1169        <term>
1170          <mallctl>opt.prof</mallctl>
1171          (<type>bool</type>)
1172          <literal>r-</literal>
1173          [<option>--enable-prof</option>]
1174        </term>
1175        <listitem><para>Memory profiling enabled/disabled.  If enabled, profile
1176        memory allocation activity.  See the <link
1177        linkend="opt.prof_active"><mallctl>opt.prof_active</mallctl></link>
1178        option for on-the-fly activation/deactivation.  See the <link
1179        linkend="opt.lg_prof_sample"><mallctl>opt.lg_prof_sample</mallctl></link>
1180        option for probabilistic sampling control.  See the <link
1181        linkend="opt.prof_accum"><mallctl>opt.prof_accum</mallctl></link>
1182        option for control of cumulative sample reporting.  See the <link
1183        linkend="opt.lg_prof_interval"><mallctl>opt.lg_prof_interval</mallctl></link>
1184        option for information on interval-triggered profile dumping, the <link
1185        linkend="opt.prof_gdump"><mallctl>opt.prof_gdump</mallctl></link>
1186        option for information on high-water-triggered profile dumping, and the
1187        <link linkend="opt.prof_final"><mallctl>opt.prof_final</mallctl></link>
1188        option for final profile dumping.  Profile output is compatible with
1189        the <command>jeprof</command> command, which is based on the
1190        <command>pprof</command> that is developed as part of the <ulink
1191        url="http://code.google.com/p/gperftools/">gperftools
1192        package</ulink>.  See <link linkend="heap_profile_format">HEAP PROFILE
1193        FORMAT</link> for heap profile format documentation.</para></listitem>
1194      </varlistentry>
1195
1196      <varlistentry id="opt.prof_prefix">
1197        <term>
1198          <mallctl>opt.prof_prefix</mallctl>
1199          (<type>const char *</type>)
1200          <literal>r-</literal>
1201          [<option>--enable-prof</option>]
1202        </term>
1203        <listitem><para>Filename prefix for profile dumps.  If the prefix is
1204        set to the empty string, no automatic dumps will occur; this is
1205        primarily useful for disabling the automatic final heap dump (which
1206        also disables leak reporting, if enabled).  The default prefix is
1207        <filename>jeprof</filename>.</para></listitem>
1208      </varlistentry>
1209
1210      <varlistentry id="opt.prof_active">
1211        <term>
1212          <mallctl>opt.prof_active</mallctl>
1213          (<type>bool</type>)
1214          <literal>r-</literal>
1215          [<option>--enable-prof</option>]
1216        </term>
1217        <listitem><para>Profiling activated/deactivated.  This is a secondary
1218        control mechanism that makes it possible to start the application with
1219        profiling enabled (see the <link
1220        linkend="opt.prof"><mallctl>opt.prof</mallctl></link> option) but
1221        inactive, then toggle profiling at any time during program execution
1222        with the <link
1223        linkend="prof.active"><mallctl>prof.active</mallctl></link> mallctl.
1224        This option is enabled by default.</para></listitem>
1225      </varlistentry>
1226
1227      <varlistentry id="opt.prof_thread_active_init">
1228        <term>
1229          <mallctl>opt.prof_thread_active_init</mallctl>
1230          (<type>bool</type>)
1231          <literal>r-</literal>
1232          [<option>--enable-prof</option>]
1233        </term>
1234        <listitem><para>Initial setting for <link
1235        linkend="thread.prof.active"><mallctl>thread.prof.active</mallctl></link>
1236        in newly created threads.  The initial setting for newly created threads
1237        can also be changed during execution via the <link
1238        linkend="prof.thread_active_init"><mallctl>prof.thread_active_init</mallctl></link>
1239        mallctl.  This option is enabled by default.</para></listitem>
1240      </varlistentry>
1241
1242      <varlistentry id="opt.lg_prof_sample">
1243        <term>
1244          <mallctl>opt.lg_prof_sample</mallctl>
1245          (<type>size_t</type>)
1246          <literal>r-</literal>
1247          [<option>--enable-prof</option>]
1248        </term>
1249        <listitem><para>Average interval (log base 2) between allocation
1250        samples, as measured in bytes of allocation activity.  Increasing the
1251        sampling interval decreases profile fidelity, but also decreases the
1252        computational overhead.  The default sample interval is 512 KiB (2^19
1253        B).</para></listitem>
1254      </varlistentry>
1255
1256      <varlistentry id="opt.prof_accum">
1257        <term>
1258          <mallctl>opt.prof_accum</mallctl>
1259          (<type>bool</type>)
1260          <literal>r-</literal>
1261          [<option>--enable-prof</option>]
1262        </term>
1263        <listitem><para>Reporting of cumulative object/byte counts in profile
1264        dumps enabled/disabled.  If this option is enabled, every unique
1265        backtrace must be stored for the duration of execution.  Depending on
1266        the application, this can impose a large memory overhead, and the
1267        cumulative counts are not always of interest.  This option is disabled
1268        by default.</para></listitem>
1269      </varlistentry>
1270
1271      <varlistentry id="opt.lg_prof_interval">
1272        <term>
1273          <mallctl>opt.lg_prof_interval</mallctl>
1274          (<type>ssize_t</type>)
1275          <literal>r-</literal>
1276          [<option>--enable-prof</option>]
1277        </term>
1278        <listitem><para>Average interval (log base 2) between memory profile
1279        dumps, as measured in bytes of allocation activity.  The actual
1280        interval between dumps may be sporadic because decentralized allocation
1281        counters are used to avoid synchronization bottlenecks.  Profiles are
1282        dumped to files named according to the pattern
1283        <filename>&lt;prefix&gt;.&lt;pid&gt;.&lt;seq&gt;.i&lt;iseq&gt;.heap</filename>,
1284        where <literal>&lt;prefix&gt;</literal> is controlled by the
1285        <link
1286        linkend="opt.prof_prefix"><mallctl>opt.prof_prefix</mallctl></link>
1287        option.  By default, interval-triggered profile dumping is disabled
1288        (encoded as -1).
1289        </para></listitem>
1290      </varlistentry>
1291
1292      <varlistentry id="opt.prof_gdump">
1293        <term>
1294          <mallctl>opt.prof_gdump</mallctl>
1295          (<type>bool</type>)
1296          <literal>r-</literal>
1297          [<option>--enable-prof</option>]
1298        </term>
1299        <listitem><para>Set the initial state of <link
1300        linkend="prof.gdump"><mallctl>prof.gdump</mallctl></link>, which when
1301        enabled triggers a memory profile dump every time the total virtual
1302        memory exceeds the previous maximum.  This option is disabled by
1303        default.</para></listitem>
1304      </varlistentry>
1305
1306      <varlistentry id="opt.prof_final">
1307        <term>
1308          <mallctl>opt.prof_final</mallctl>
1309          (<type>bool</type>)
1310          <literal>r-</literal>
1311          [<option>--enable-prof</option>]
1312        </term>
1313        <listitem><para>Use an
1314        <citerefentry><refentrytitle>atexit</refentrytitle>
1315        <manvolnum>3</manvolnum></citerefentry> function to dump final memory
1316        usage to a file named according to the pattern
1317        <filename>&lt;prefix&gt;.&lt;pid&gt;.&lt;seq&gt;.f.heap</filename>,
1318        where <literal>&lt;prefix&gt;</literal> is controlled by the <link
1319        linkend="opt.prof_prefix"><mallctl>opt.prof_prefix</mallctl></link>
1320        option.  Note that <function>atexit<parameter/></function> may allocate
1321        memory during application initialization and then deadlock internally
1322        when jemalloc in turn calls <function>atexit<parameter/></function>, so
1323        this option is not univerally usable (though the application can
1324        register its own <function>atexit<parameter/></function> function with
1325        equivalent functionality).  This option is disabled by
1326        default.</para></listitem>
1327      </varlistentry>
1328
1329      <varlistentry id="opt.prof_leak">
1330        <term>
1331          <mallctl>opt.prof_leak</mallctl>
1332          (<type>bool</type>)
1333          <literal>r-</literal>
1334          [<option>--enable-prof</option>]
1335        </term>
1336        <listitem><para>Leak reporting enabled/disabled.  If enabled, use an
1337        <citerefentry><refentrytitle>atexit</refentrytitle>
1338        <manvolnum>3</manvolnum></citerefentry> function to report memory leaks
1339        detected by allocation sampling.  See the
1340        <link linkend="opt.prof"><mallctl>opt.prof</mallctl></link> option for
1341        information on analyzing heap profile output.  This option is disabled
1342        by default.</para></listitem>
1343      </varlistentry>
1344
1345      <varlistentry id="thread.arena">
1346        <term>
1347          <mallctl>thread.arena</mallctl>
1348          (<type>unsigned</type>)
1349          <literal>rw</literal>
1350        </term>
1351        <listitem><para>Get or set the arena associated with the calling
1352        thread.  If the specified arena was not initialized beforehand (see the
1353        <link
1354        linkend="arenas.initialized"><mallctl>arenas.initialized</mallctl></link>
1355        mallctl), it will be automatically initialized as a side effect of
1356        calling this interface.</para></listitem>
1357      </varlistentry>
1358
1359      <varlistentry id="thread.allocated">
1360        <term>
1361          <mallctl>thread.allocated</mallctl>
1362          (<type>uint64_t</type>)
1363          <literal>r-</literal>
1364          [<option>--enable-stats</option>]
1365        </term>
1366        <listitem><para>Get the total number of bytes ever allocated by the
1367        calling thread.  This counter has the potential to wrap around; it is
1368        up to the application to appropriately interpret the counter in such
1369        cases.</para></listitem>
1370      </varlistentry>
1371
1372      <varlistentry id="thread.allocatedp">
1373        <term>
1374          <mallctl>thread.allocatedp</mallctl>
1375          (<type>uint64_t *</type>)
1376          <literal>r-</literal>
1377          [<option>--enable-stats</option>]
1378        </term>
1379        <listitem><para>Get a pointer to the the value that is returned by the
1380        <link
1381        linkend="thread.allocated"><mallctl>thread.allocated</mallctl></link>
1382        mallctl.  This is useful for avoiding the overhead of repeated
1383        <function>mallctl*<parameter/></function> calls.</para></listitem>
1384      </varlistentry>
1385
1386      <varlistentry id="thread.deallocated">
1387        <term>
1388          <mallctl>thread.deallocated</mallctl>
1389          (<type>uint64_t</type>)
1390          <literal>r-</literal>
1391          [<option>--enable-stats</option>]
1392        </term>
1393        <listitem><para>Get the total number of bytes ever deallocated by the
1394        calling thread.  This counter has the potential to wrap around; it is
1395        up to the application to appropriately interpret the counter in such
1396        cases.</para></listitem>
1397      </varlistentry>
1398
1399      <varlistentry id="thread.deallocatedp">
1400        <term>
1401          <mallctl>thread.deallocatedp</mallctl>
1402          (<type>uint64_t *</type>)
1403          <literal>r-</literal>
1404          [<option>--enable-stats</option>]
1405        </term>
1406        <listitem><para>Get a pointer to the the value that is returned by the
1407        <link
1408        linkend="thread.deallocated"><mallctl>thread.deallocated</mallctl></link>
1409        mallctl.  This is useful for avoiding the overhead of repeated
1410        <function>mallctl*<parameter/></function> calls.</para></listitem>
1411      </varlistentry>
1412
1413      <varlistentry id="thread.tcache.enabled">
1414        <term>
1415          <mallctl>thread.tcache.enabled</mallctl>
1416          (<type>bool</type>)
1417          <literal>rw</literal>
1418          [<option>--enable-tcache</option>]
1419        </term>
1420        <listitem><para>Enable/disable calling thread's tcache.  The tcache is
1421        implicitly flushed as a side effect of becoming
1422        disabled (see <link
1423        linkend="thread.tcache.flush"><mallctl>thread.tcache.flush</mallctl></link>).
1424        </para></listitem>
1425      </varlistentry>
1426
1427      <varlistentry id="thread.tcache.flush">
1428        <term>
1429          <mallctl>thread.tcache.flush</mallctl>
1430          (<type>void</type>)
1431          <literal>--</literal>
1432          [<option>--enable-tcache</option>]
1433        </term>
1434        <listitem><para>Flush calling thread's thread-specific cache (tcache).
1435        This interface releases all cached objects and internal data structures
1436        associated with the calling thread's tcache.  Ordinarily, this interface
1437        need not be called, since automatic periodic incremental garbage
1438        collection occurs, and the thread cache is automatically discarded when
1439        a thread exits.  However, garbage collection is triggered by allocation
1440        activity, so it is possible for a thread that stops
1441        allocating/deallocating to retain its cache indefinitely, in which case
1442        the developer may find manual flushing useful.</para></listitem>
1443      </varlistentry>
1444
1445      <varlistentry id="thread.prof.name">
1446        <term>
1447          <mallctl>thread.prof.name</mallctl>
1448          (<type>const char *</type>)
1449          <literal>r-</literal> or
1450          <literal>-w</literal>
1451          [<option>--enable-prof</option>]
1452        </term>
1453        <listitem><para>Get/set the descriptive name associated with the calling
1454        thread in memory profile dumps.  An internal copy of the name string is
1455        created, so the input string need not be maintained after this interface
1456        completes execution.  The output string of this interface should be
1457        copied for non-ephemeral uses, because multiple implementation details
1458        can cause asynchronous string deallocation.  Furthermore, each
1459        invocation of this interface can only read or write; simultaneous
1460        read/write is not supported due to string lifetime limitations.  The
1461        name string must be nil-terminated and comprised only of characters in
1462        the sets recognized
1463        by <citerefentry><refentrytitle>isgraph</refentrytitle>
1464        <manvolnum>3</manvolnum></citerefentry> and
1465        <citerefentry><refentrytitle>isblank</refentrytitle>
1466        <manvolnum>3</manvolnum></citerefentry>.</para></listitem>
1467      </varlistentry>
1468
1469      <varlistentry id="thread.prof.active">
1470        <term>
1471          <mallctl>thread.prof.active</mallctl>
1472          (<type>bool</type>)
1473          <literal>rw</literal>
1474          [<option>--enable-prof</option>]
1475        </term>
1476        <listitem><para>Control whether sampling is currently active for the
1477        calling thread.  This is an activation mechanism in addition to <link
1478        linkend="prof.active"><mallctl>prof.active</mallctl></link>; both must
1479        be active for the calling thread to sample.  This flag is enabled by
1480        default.</para></listitem>
1481      </varlistentry>
1482
1483      <varlistentry id="tcache.create">
1484        <term>
1485          <mallctl>tcache.create</mallctl>
1486          (<type>unsigned</type>)
1487          <literal>r-</literal>
1488          [<option>--enable-tcache</option>]
1489        </term>
1490        <listitem><para>Create an explicit thread-specific cache (tcache) and
1491        return an identifier that can be passed to the <link
1492        linkend="MALLOCX_TCACHE"><constant>MALLOCX_TCACHE(<parameter>tc</parameter>)</constant></link>
1493        macro to explicitly use the specified cache rather than the
1494        automatically managed one that is used by default.  Each explicit cache
1495        can be used by only one thread at a time; the application must assure
1496        that this constraint holds.
1497        </para></listitem>
1498      </varlistentry>
1499
1500      <varlistentry id="tcache.flush">
1501        <term>
1502          <mallctl>tcache.flush</mallctl>
1503          (<type>unsigned</type>)
1504          <literal>-w</literal>
1505          [<option>--enable-tcache</option>]
1506        </term>
1507        <listitem><para>Flush the specified thread-specific cache (tcache).  The
1508        same considerations apply to this interface as to <link
1509        linkend="thread.tcache.flush"><mallctl>thread.tcache.flush</mallctl></link>,
1510        except that the tcache will never be automatically discarded.
1511        </para></listitem>
1512      </varlistentry>
1513
1514      <varlistentry id="tcache.destroy">
1515        <term>
1516          <mallctl>tcache.destroy</mallctl>
1517          (<type>unsigned</type>)
1518          <literal>-w</literal>
1519          [<option>--enable-tcache</option>]
1520        </term>
1521        <listitem><para>Flush the specified thread-specific cache (tcache) and
1522        make the identifier available for use during a future tcache creation.
1523        </para></listitem>
1524      </varlistentry>
1525
1526      <varlistentry id="arena.i.purge">
1527        <term>
1528          <mallctl>arena.&lt;i&gt;.purge</mallctl>
1529          (<type>void</type>)
1530          <literal>--</literal>
1531        </term>
1532        <listitem><para>Purge all unused dirty pages for arena &lt;i&gt;, or for
1533        all arenas if &lt;i&gt; equals <link
1534        linkend="arenas.narenas"><mallctl>arenas.narenas</mallctl></link>.
1535        </para></listitem>
1536      </varlistentry>
1537
1538      <varlistentry id="arena.i.decay">
1539        <term>
1540          <mallctl>arena.&lt;i&gt;.decay</mallctl>
1541          (<type>void</type>)
1542          <literal>--</literal>
1543        </term>
1544        <listitem><para>Trigger decay-based purging of unused dirty pages for
1545        arena &lt;i&gt;, or for all arenas if &lt;i&gt; equals <link
1546        linkend="arenas.narenas"><mallctl>arenas.narenas</mallctl></link>.
1547        The proportion of unused dirty pages to be purged depends on the current
1548        time; see <link
1549        linkend="opt.decay_time"><mallctl>opt.decay_time</mallctl></link> for
1550        details.</para></listitem>
1551      </varlistentry>
1552
1553      <varlistentry id="arena.i.dss">
1554        <term>
1555          <mallctl>arena.&lt;i&gt;.dss</mallctl>
1556          (<type>const char *</type>)
1557          <literal>rw</literal>
1558        </term>
1559        <listitem><para>Set the precedence of dss allocation as related to mmap
1560        allocation for arena &lt;i&gt;, or for all arenas if &lt;i&gt; equals
1561        <link
1562        linkend="arenas.narenas"><mallctl>arenas.narenas</mallctl></link>.  See
1563        <link linkend="opt.dss"><mallctl>opt.dss</mallctl></link> for supported
1564        settings.</para></listitem>
1565      </varlistentry>
1566
1567      <varlistentry id="arena.i.lg_dirty_mult">
1568        <term>
1569          <mallctl>arena.&lt;i&gt;.lg_dirty_mult</mallctl>
1570          (<type>ssize_t</type>)
1571          <literal>rw</literal>
1572        </term>
1573        <listitem><para>Current per-arena minimum ratio (log base 2) of active
1574        to dirty pages for arena &lt;i&gt;.  Each time this interface is set and
1575        the ratio is increased, pages are synchronously purged as necessary to
1576        impose the new ratio.  See <link
1577        linkend="opt.lg_dirty_mult"><mallctl>opt.lg_dirty_mult</mallctl></link>
1578        for additional information.</para></listitem>
1579      </varlistentry>
1580
1581      <varlistentry id="arena.i.decay_time">
1582        <term>
1583          <mallctl>arena.&lt;i&gt;.decay_time</mallctl>
1584          (<type>ssize_t</type>)
1585          <literal>rw</literal>
1586        </term>
1587        <listitem><para>Current per-arena approximate time in seconds from the
1588        creation of a set of unused dirty pages until an equivalent set of
1589        unused dirty pages is purged and/or reused.  Each time this interface is
1590        set, all currently unused dirty pages are considered to have fully
1591        decayed, which causes immediate purging of all unused dirty pages unless
1592        the decay time is set to -1 (i.e. purging disabled).  See <link
1593        linkend="opt.decay_time"><mallctl>opt.decay_time</mallctl></link> for
1594        additional information.</para></listitem>
1595      </varlistentry>
1596
1597      <varlistentry id="arena.i.chunk_hooks">
1598        <term>
1599          <mallctl>arena.&lt;i&gt;.chunk_hooks</mallctl>
1600          (<type>chunk_hooks_t</type>)
1601          <literal>rw</literal>
1602        </term>
1603        <listitem><para>Get or set the chunk management hook functions for arena
1604        &lt;i&gt;.  The functions must be capable of operating on all extant
1605        chunks associated with arena &lt;i&gt;, usually by passing unknown
1606        chunks to the replaced functions.  In practice, it is feasible to
1607        control allocation for arenas created via <link
1608        linkend="arenas.extend"><mallctl>arenas.extend</mallctl></link> such
1609        that all chunks originate from an application-supplied chunk allocator
1610        (by setting custom chunk hook functions just after arena creation), but
1611        the automatically created arenas may have already created chunks prior
1612        to the application having an opportunity to take over chunk
1613        allocation.</para>
1614
1615        <programlisting language="C"><![CDATA[
1616typedef struct {
1617	chunk_alloc_t		*alloc;
1618	chunk_dalloc_t		*dalloc;
1619	chunk_commit_t		*commit;
1620	chunk_decommit_t	*decommit;
1621	chunk_purge_t		*purge;
1622	chunk_split_t		*split;
1623	chunk_merge_t		*merge;
1624} chunk_hooks_t;]]></programlisting>
1625        <para>The <type>chunk_hooks_t</type> structure comprises function
1626        pointers which are described individually below.  jemalloc uses these
1627        functions to manage chunk lifetime, which starts off with allocation of
1628        mapped committed memory, in the simplest case followed by deallocation.
1629        However, there are performance and platform reasons to retain chunks for
1630        later reuse.  Cleanup attempts cascade from deallocation to decommit to
1631        purging, which gives the chunk management functions opportunities to
1632        reject the most permanent cleanup operations in favor of less permanent
1633        (and often less costly) operations.  The chunk splitting and merging
1634        operations can also be opted out of, but this is mainly intended to
1635        support platforms on which virtual memory mappings provided by the
1636        operating system kernel do not automatically coalesce and split, e.g.
1637        Windows.</para>
1638
1639        <funcsynopsis><funcprototype>
1640          <funcdef>typedef void *<function>(chunk_alloc_t)</function></funcdef>
1641          <paramdef>void *<parameter>chunk</parameter></paramdef>
1642          <paramdef>size_t <parameter>size</parameter></paramdef>
1643          <paramdef>size_t <parameter>alignment</parameter></paramdef>
1644          <paramdef>bool *<parameter>zero</parameter></paramdef>
1645          <paramdef>bool *<parameter>commit</parameter></paramdef>
1646          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1647        </funcprototype></funcsynopsis>
1648        <literallayout></literallayout>
1649        <para>A chunk allocation function conforms to the
1650        <type>chunk_alloc_t</type> type and upon success returns a pointer to
1651        <parameter>size</parameter> bytes of mapped memory on behalf of arena
1652        <parameter>arena_ind</parameter> such that the chunk's base address is a
1653        multiple of <parameter>alignment</parameter>, as well as setting
1654        <parameter>*zero</parameter> to indicate whether the chunk is zeroed and
1655        <parameter>*commit</parameter> to indicate whether the chunk is
1656        committed.  Upon error the function returns <constant>NULL</constant>
1657        and leaves <parameter>*zero</parameter> and
1658        <parameter>*commit</parameter> unmodified.  The
1659        <parameter>size</parameter> parameter is always a multiple of the chunk
1660        size.  The <parameter>alignment</parameter> parameter is always a power
1661        of two at least as large as the chunk size.  Zeroing is mandatory if
1662        <parameter>*zero</parameter> is true upon function entry.  Committing is
1663        mandatory if <parameter>*commit</parameter> is true upon function entry.
1664        If <parameter>chunk</parameter> is not <constant>NULL</constant>, the
1665        returned pointer must be <parameter>chunk</parameter> on success or
1666        <constant>NULL</constant> on error.  Committed memory may be committed
1667        in absolute terms as on a system that does not overcommit, or in
1668        implicit terms as on a system that overcommits and satisfies physical
1669        memory needs on demand via soft page faults.  Note that replacing the
1670        default chunk allocation function makes the arena's <link
1671        linkend="arena.i.dss"><mallctl>arena.&lt;i&gt;.dss</mallctl></link>
1672        setting irrelevant.</para>
1673
1674        <funcsynopsis><funcprototype>
1675          <funcdef>typedef bool <function>(chunk_dalloc_t)</function></funcdef>
1676          <paramdef>void *<parameter>chunk</parameter></paramdef>
1677          <paramdef>size_t <parameter>size</parameter></paramdef>
1678          <paramdef>bool <parameter>committed</parameter></paramdef>
1679          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1680        </funcprototype></funcsynopsis>
1681        <literallayout></literallayout>
1682        <para>
1683        A chunk deallocation function conforms to the
1684        <type>chunk_dalloc_t</type> type and deallocates a
1685        <parameter>chunk</parameter> of given <parameter>size</parameter> with
1686        <parameter>committed</parameter>/decommited memory as indicated, on
1687        behalf of arena <parameter>arena_ind</parameter>, returning false upon
1688        success.  If the function returns true, this indicates opt-out from
1689        deallocation; the virtual memory mapping associated with the chunk
1690        remains mapped, in the same commit state, and available for future use,
1691        in which case it will be automatically retained for later reuse.</para>
1692
1693        <funcsynopsis><funcprototype>
1694          <funcdef>typedef bool <function>(chunk_commit_t)</function></funcdef>
1695          <paramdef>void *<parameter>chunk</parameter></paramdef>
1696          <paramdef>size_t <parameter>size</parameter></paramdef>
1697          <paramdef>size_t <parameter>offset</parameter></paramdef>
1698          <paramdef>size_t <parameter>length</parameter></paramdef>
1699          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1700        </funcprototype></funcsynopsis>
1701        <literallayout></literallayout>
1702        <para>A chunk commit function conforms to the
1703        <type>chunk_commit_t</type> type and commits zeroed physical memory to
1704        back pages within a <parameter>chunk</parameter> of given
1705        <parameter>size</parameter> at <parameter>offset</parameter> bytes,
1706        extending for <parameter>length</parameter> on behalf of arena
1707        <parameter>arena_ind</parameter>, returning false upon success.
1708        Committed memory may be committed in absolute terms as on a system that
1709        does not overcommit, or in implicit terms as on a system that
1710        overcommits and satisfies physical memory needs on demand via soft page
1711        faults. If the function returns true, this indicates insufficient
1712        physical memory to satisfy the request.</para>
1713
1714        <funcsynopsis><funcprototype>
1715          <funcdef>typedef bool <function>(chunk_decommit_t)</function></funcdef>
1716          <paramdef>void *<parameter>chunk</parameter></paramdef>
1717          <paramdef>size_t <parameter>size</parameter></paramdef>
1718          <paramdef>size_t <parameter>offset</parameter></paramdef>
1719          <paramdef>size_t <parameter>length</parameter></paramdef>
1720          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1721        </funcprototype></funcsynopsis>
1722        <literallayout></literallayout>
1723        <para>A chunk decommit function conforms to the
1724        <type>chunk_decommit_t</type> type and decommits any physical memory
1725        that is backing pages within a <parameter>chunk</parameter> of given
1726        <parameter>size</parameter> at <parameter>offset</parameter> bytes,
1727        extending for <parameter>length</parameter> on behalf of arena
1728        <parameter>arena_ind</parameter>, returning false upon success, in which
1729        case the pages will be committed via the chunk commit function before
1730        being reused.  If the function returns true, this indicates opt-out from
1731        decommit; the memory remains committed and available for future use, in
1732        which case it will be automatically retained for later reuse.</para>
1733
1734        <funcsynopsis><funcprototype>
1735          <funcdef>typedef bool <function>(chunk_purge_t)</function></funcdef>
1736          <paramdef>void *<parameter>chunk</parameter></paramdef>
1737          <paramdef>size_t<parameter>size</parameter></paramdef>
1738          <paramdef>size_t <parameter>offset</parameter></paramdef>
1739          <paramdef>size_t <parameter>length</parameter></paramdef>
1740          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1741        </funcprototype></funcsynopsis>
1742        <literallayout></literallayout>
1743        <para>A chunk purge function conforms to the <type>chunk_purge_t</type>
1744        type and optionally discards physical pages within the virtual memory
1745        mapping associated with <parameter>chunk</parameter> of given
1746        <parameter>size</parameter> at <parameter>offset</parameter> bytes,
1747        extending for <parameter>length</parameter> on behalf of arena
1748        <parameter>arena_ind</parameter>, returning false if pages within the
1749        purged virtual memory range will be zero-filled the next time they are
1750        accessed.</para>
1751
1752        <funcsynopsis><funcprototype>
1753          <funcdef>typedef bool <function>(chunk_split_t)</function></funcdef>
1754          <paramdef>void *<parameter>chunk</parameter></paramdef>
1755          <paramdef>size_t <parameter>size</parameter></paramdef>
1756          <paramdef>size_t <parameter>size_a</parameter></paramdef>
1757          <paramdef>size_t <parameter>size_b</parameter></paramdef>
1758          <paramdef>bool <parameter>committed</parameter></paramdef>
1759          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1760        </funcprototype></funcsynopsis>
1761        <literallayout></literallayout>
1762        <para>A chunk split function conforms to the <type>chunk_split_t</type>
1763        type and optionally splits <parameter>chunk</parameter> of given
1764        <parameter>size</parameter> into two adjacent chunks, the first of
1765        <parameter>size_a</parameter> bytes, and the second of
1766        <parameter>size_b</parameter> bytes, operating on
1767        <parameter>committed</parameter>/decommitted memory as indicated, on
1768        behalf of arena <parameter>arena_ind</parameter>, returning false upon
1769        success.  If the function returns true, this indicates that the chunk
1770        remains unsplit and therefore should continue to be operated on as a
1771        whole.</para>
1772
1773        <funcsynopsis><funcprototype>
1774          <funcdef>typedef bool <function>(chunk_merge_t)</function></funcdef>
1775          <paramdef>void *<parameter>chunk_a</parameter></paramdef>
1776          <paramdef>size_t <parameter>size_a</parameter></paramdef>
1777          <paramdef>void *<parameter>chunk_b</parameter></paramdef>
1778          <paramdef>size_t <parameter>size_b</parameter></paramdef>
1779          <paramdef>bool <parameter>committed</parameter></paramdef>
1780          <paramdef>unsigned <parameter>arena_ind</parameter></paramdef>
1781        </funcprototype></funcsynopsis>
1782        <literallayout></literallayout>
1783        <para>A chunk merge function conforms to the <type>chunk_merge_t</type>
1784        type and optionally merges adjacent chunks,
1785        <parameter>chunk_a</parameter> of given <parameter>size_a</parameter>
1786        and <parameter>chunk_b</parameter> of given
1787        <parameter>size_b</parameter> into one contiguous chunk, operating on
1788        <parameter>committed</parameter>/decommitted memory as indicated, on
1789        behalf of arena <parameter>arena_ind</parameter>, returning false upon
1790        success.  If the function returns true, this indicates that the chunks
1791        remain distinct mappings and therefore should continue to be operated on
1792        independently.</para>
1793        </listitem>
1794      </varlistentry>
1795
1796      <varlistentry id="arenas.narenas">
1797        <term>
1798          <mallctl>arenas.narenas</mallctl>
1799          (<type>unsigned</type>)
1800          <literal>r-</literal>
1801        </term>
1802        <listitem><para>Current limit on number of arenas.</para></listitem>
1803      </varlistentry>
1804
1805      <varlistentry id="arenas.initialized">
1806        <term>
1807          <mallctl>arenas.initialized</mallctl>
1808          (<type>bool *</type>)
1809          <literal>r-</literal>
1810        </term>
1811        <listitem><para>An array of <link
1812        linkend="arenas.narenas"><mallctl>arenas.narenas</mallctl></link>
1813        booleans.  Each boolean indicates whether the corresponding arena is
1814        initialized.</para></listitem>
1815      </varlistentry>
1816
1817      <varlistentry id="arenas.lg_dirty_mult">
1818        <term>
1819          <mallctl>arenas.lg_dirty_mult</mallctl>
1820          (<type>ssize_t</type>)
1821          <literal>rw</literal>
1822        </term>
1823        <listitem><para>Current default per-arena minimum ratio (log base 2) of
1824        active to dirty pages, used to initialize <link
1825        linkend="arena.i.lg_dirty_mult"><mallctl>arena.&lt;i&gt;.lg_dirty_mult</mallctl></link>
1826        during arena creation.  See <link
1827        linkend="opt.lg_dirty_mult"><mallctl>opt.lg_dirty_mult</mallctl></link>
1828        for additional information.</para></listitem>
1829      </varlistentry>
1830
1831      <varlistentry id="arenas.decay_time">
1832        <term>
1833          <mallctl>arenas.decay_time</mallctl>
1834          (<type>ssize_t</type>)
1835          <literal>rw</literal>
1836        </term>
1837        <listitem><para>Current default per-arena approximate time in seconds
1838        from the creation of a set of unused dirty pages until an equivalent set
1839        of unused dirty pages is purged and/or reused, used to initialize <link
1840        linkend="arena.i.decay_time"><mallctl>arena.&lt;i&gt;.decay_time</mallctl></link>
1841        during arena creation.  See <link
1842        linkend="opt.decay_time"><mallctl>opt.decay_time</mallctl></link> for
1843        additional information.</para></listitem>
1844      </varlistentry>
1845
1846      <varlistentry id="arenas.quantum">
1847        <term>
1848          <mallctl>arenas.quantum</mallctl>
1849          (<type>size_t</type>)
1850          <literal>r-</literal>
1851        </term>
1852        <listitem><para>Quantum size.</para></listitem>
1853      </varlistentry>
1854
1855      <varlistentry id="arenas.page">
1856        <term>
1857          <mallctl>arenas.page</mallctl>
1858          (<type>size_t</type>)
1859          <literal>r-</literal>
1860        </term>
1861        <listitem><para>Page size.</para></listitem>
1862      </varlistentry>
1863
1864      <varlistentry id="arenas.tcache_max">
1865        <term>
1866          <mallctl>arenas.tcache_max</mallctl>
1867          (<type>size_t</type>)
1868          <literal>r-</literal>
1869          [<option>--enable-tcache</option>]
1870        </term>
1871        <listitem><para>Maximum thread-cached size class.</para></listitem>
1872      </varlistentry>
1873
1874      <varlistentry id="arenas.nbins">
1875        <term>
1876          <mallctl>arenas.nbins</mallctl>
1877          (<type>unsigned</type>)
1878          <literal>r-</literal>
1879        </term>
1880        <listitem><para>Number of bin size classes.</para></listitem>
1881      </varlistentry>
1882
1883      <varlistentry id="arenas.nhbins">
1884        <term>
1885          <mallctl>arenas.nhbins</mallctl>
1886          (<type>unsigned</type>)
1887          <literal>r-</literal>
1888          [<option>--enable-tcache</option>]
1889        </term>
1890        <listitem><para>Total number of thread cache bin size
1891        classes.</para></listitem>
1892      </varlistentry>
1893
1894      <varlistentry id="arenas.bin.i.size">
1895        <term>
1896          <mallctl>arenas.bin.&lt;i&gt;.size</mallctl>
1897          (<type>size_t</type>)
1898          <literal>r-</literal>
1899        </term>
1900        <listitem><para>Maximum size supported by size class.</para></listitem>
1901      </varlistentry>
1902
1903      <varlistentry id="arenas.bin.i.nregs">
1904        <term>
1905          <mallctl>arenas.bin.&lt;i&gt;.nregs</mallctl>
1906          (<type>uint32_t</type>)
1907          <literal>r-</literal>
1908        </term>
1909        <listitem><para>Number of regions per page run.</para></listitem>
1910      </varlistentry>
1911
1912      <varlistentry id="arenas.bin.i.run_size">
1913        <term>
1914          <mallctl>arenas.bin.&lt;i&gt;.run_size</mallctl>
1915          (<type>size_t</type>)
1916          <literal>r-</literal>
1917        </term>
1918        <listitem><para>Number of bytes per page run.</para></listitem>
1919      </varlistentry>
1920
1921      <varlistentry id="arenas.nlruns">
1922        <term>
1923          <mallctl>arenas.nlruns</mallctl>
1924          (<type>unsigned</type>)
1925          <literal>r-</literal>
1926        </term>
1927        <listitem><para>Total number of large size classes.</para></listitem>
1928      </varlistentry>
1929
1930      <varlistentry id="arenas.lrun.i.size">
1931        <term>
1932          <mallctl>arenas.lrun.&lt;i&gt;.size</mallctl>
1933          (<type>size_t</type>)
1934          <literal>r-</literal>
1935        </term>
1936        <listitem><para>Maximum size supported by this large size
1937        class.</para></listitem>
1938      </varlistentry>
1939
1940      <varlistentry id="arenas.nhchunks">
1941        <term>
1942          <mallctl>arenas.nhchunks</mallctl>
1943          (<type>unsigned</type>)
1944          <literal>r-</literal>
1945        </term>
1946        <listitem><para>Total number of huge size classes.</para></listitem>
1947      </varlistentry>
1948
1949      <varlistentry id="arenas.hchunk.i.size">
1950        <term>
1951          <mallctl>arenas.hchunk.&lt;i&gt;.size</mallctl>
1952          (<type>size_t</type>)
1953          <literal>r-</literal>
1954        </term>
1955        <listitem><para>Maximum size supported by this huge size
1956        class.</para></listitem>
1957      </varlistentry>
1958
1959      <varlistentry id="arenas.extend">
1960        <term>
1961          <mallctl>arenas.extend</mallctl>
1962          (<type>unsigned</type>)
1963          <literal>r-</literal>
1964        </term>
1965        <listitem><para>Extend the array of arenas by appending a new arena,
1966        and returning the new arena index.</para></listitem>
1967      </varlistentry>
1968
1969      <varlistentry id="prof.thread_active_init">
1970        <term>
1971          <mallctl>prof.thread_active_init</mallctl>
1972          (<type>bool</type>)
1973          <literal>rw</literal>
1974          [<option>--enable-prof</option>]
1975        </term>
1976        <listitem><para>Control the initial setting for <link
1977        linkend="thread.prof.active"><mallctl>thread.prof.active</mallctl></link>
1978        in newly created threads.  See the <link
1979        linkend="opt.prof_thread_active_init"><mallctl>opt.prof_thread_active_init</mallctl></link>
1980        option for additional information.</para></listitem>
1981      </varlistentry>
1982
1983      <varlistentry id="prof.active">
1984        <term>
1985          <mallctl>prof.active</mallctl>
1986          (<type>bool</type>)
1987          <literal>rw</literal>
1988          [<option>--enable-prof</option>]
1989        </term>
1990        <listitem><para>Control whether sampling is currently active.  See the
1991        <link
1992        linkend="opt.prof_active"><mallctl>opt.prof_active</mallctl></link>
1993        option for additional information, as well as the interrelated <link
1994        linkend="thread.prof.active"><mallctl>thread.prof.active</mallctl></link>
1995        mallctl.</para></listitem>
1996      </varlistentry>
1997
1998      <varlistentry id="prof.dump">
1999        <term>
2000          <mallctl>prof.dump</mallctl>
2001          (<type>const char *</type>)
2002          <literal>-w</literal>
2003          [<option>--enable-prof</option>]
2004        </term>
2005        <listitem><para>Dump a memory profile to the specified file, or if NULL
2006        is specified, to a file according to the pattern
2007        <filename>&lt;prefix&gt;.&lt;pid&gt;.&lt;seq&gt;.m&lt;mseq&gt;.heap</filename>,
2008        where <literal>&lt;prefix&gt;</literal> is controlled by the
2009        <link
2010        linkend="opt.prof_prefix"><mallctl>opt.prof_prefix</mallctl></link>
2011        option.</para></listitem>
2012      </varlistentry>
2013
2014      <varlistentry id="prof.gdump">
2015        <term>
2016          <mallctl>prof.gdump</mallctl>
2017          (<type>bool</type>)
2018          <literal>rw</literal>
2019          [<option>--enable-prof</option>]
2020        </term>
2021        <listitem><para>When enabled, trigger a memory profile dump every time
2022        the total virtual memory exceeds the previous maximum.  Profiles are
2023        dumped to files named according to the pattern
2024        <filename>&lt;prefix&gt;.&lt;pid&gt;.&lt;seq&gt;.u&lt;useq&gt;.heap</filename>,
2025        where <literal>&lt;prefix&gt;</literal> is controlled by the <link
2026        linkend="opt.prof_prefix"><mallctl>opt.prof_prefix</mallctl></link>
2027        option.</para></listitem>
2028      </varlistentry>
2029
2030      <varlistentry id="prof.reset">
2031        <term>
2032          <mallctl>prof.reset</mallctl>
2033          (<type>size_t</type>)
2034          <literal>-w</literal>
2035          [<option>--enable-prof</option>]
2036        </term>
2037        <listitem><para>Reset all memory profile statistics, and optionally
2038        update the sample rate (see <link
2039        linkend="opt.lg_prof_sample"><mallctl>opt.lg_prof_sample</mallctl></link>
2040        and <link
2041        linkend="prof.lg_sample"><mallctl>prof.lg_sample</mallctl></link>).
2042        </para></listitem>
2043      </varlistentry>
2044
2045      <varlistentry id="prof.lg_sample">
2046        <term>
2047          <mallctl>prof.lg_sample</mallctl>
2048          (<type>size_t</type>)
2049          <literal>r-</literal>
2050          [<option>--enable-prof</option>]
2051        </term>
2052        <listitem><para>Get the current sample rate (see <link
2053        linkend="opt.lg_prof_sample"><mallctl>opt.lg_prof_sample</mallctl></link>).
2054        </para></listitem>
2055      </varlistentry>
2056
2057      <varlistentry id="prof.interval">
2058        <term>
2059          <mallctl>prof.interval</mallctl>
2060          (<type>uint64_t</type>)
2061          <literal>r-</literal>
2062          [<option>--enable-prof</option>]
2063        </term>
2064        <listitem><para>Average number of bytes allocated between
2065        inverval-based profile dumps.  See the
2066        <link
2067        linkend="opt.lg_prof_interval"><mallctl>opt.lg_prof_interval</mallctl></link>
2068        option for additional information.</para></listitem>
2069      </varlistentry>
2070
2071      <varlistentry id="stats.cactive">
2072        <term>
2073          <mallctl>stats.cactive</mallctl>
2074          (<type>size_t *</type>)
2075          <literal>r-</literal>
2076          [<option>--enable-stats</option>]
2077        </term>
2078        <listitem><para>Pointer to a counter that contains an approximate count
2079        of the current number of bytes in active pages.  The estimate may be
2080        high, but never low, because each arena rounds up when computing its
2081        contribution to the counter.  Note that the <link
2082        linkend="epoch"><mallctl>epoch</mallctl></link> mallctl has no bearing
2083        on this counter.  Furthermore, counter consistency is maintained via
2084        atomic operations, so it is necessary to use an atomic operation in
2085        order to guarantee a consistent read when dereferencing the pointer.
2086        </para></listitem>
2087      </varlistentry>
2088
2089      <varlistentry id="stats.allocated">
2090        <term>
2091          <mallctl>stats.allocated</mallctl>
2092          (<type>size_t</type>)
2093          <literal>r-</literal>
2094          [<option>--enable-stats</option>]
2095        </term>
2096        <listitem><para>Total number of bytes allocated by the
2097        application.</para></listitem>
2098      </varlistentry>
2099
2100      <varlistentry id="stats.active">
2101        <term>
2102          <mallctl>stats.active</mallctl>
2103          (<type>size_t</type>)
2104          <literal>r-</literal>
2105          [<option>--enable-stats</option>]
2106        </term>
2107        <listitem><para>Total number of bytes in active pages allocated by the
2108        application.  This is a multiple of the page size, and greater than or
2109        equal to <link
2110        linkend="stats.allocated"><mallctl>stats.allocated</mallctl></link>.
2111        This does not include <link linkend="stats.arenas.i.pdirty">
2112        <mallctl>stats.arenas.&lt;i&gt;.pdirty</mallctl></link>, nor pages
2113        entirely devoted to allocator metadata.</para></listitem>
2114      </varlistentry>
2115
2116      <varlistentry id="stats.metadata">
2117        <term>
2118          <mallctl>stats.metadata</mallctl>
2119          (<type>size_t</type>)
2120          <literal>r-</literal>
2121          [<option>--enable-stats</option>]
2122        </term>
2123        <listitem><para>Total number of bytes dedicated to metadata, which
2124        comprise base allocations used for bootstrap-sensitive internal
2125        allocator data structures, arena chunk headers (see <link
2126        linkend="stats.arenas.i.metadata.mapped"><mallctl>stats.arenas.&lt;i&gt;.metadata.mapped</mallctl></link>),
2127        and internal allocations (see <link
2128        linkend="stats.arenas.i.metadata.allocated"><mallctl>stats.arenas.&lt;i&gt;.metadata.allocated</mallctl></link>).</para></listitem>
2129      </varlistentry>
2130
2131      <varlistentry id="stats.resident">
2132        <term>
2133          <mallctl>stats.resident</mallctl>
2134          (<type>size_t</type>)
2135          <literal>r-</literal>
2136          [<option>--enable-stats</option>]
2137        </term>
2138        <listitem><para>Maximum number of bytes in physically resident data
2139        pages mapped by the allocator, comprising all pages dedicated to
2140        allocator metadata, pages backing active allocations, and unused dirty
2141        pages.  This is a maximum rather than precise because pages may not
2142        actually be physically resident if they correspond to demand-zeroed
2143        virtual memory that has not yet been touched.  This is a multiple of the
2144        page size, and is larger than <link
2145        linkend="stats.active"><mallctl>stats.active</mallctl></link>.</para></listitem>
2146      </varlistentry>
2147
2148      <varlistentry id="stats.mapped">
2149        <term>
2150          <mallctl>stats.mapped</mallctl>
2151          (<type>size_t</type>)
2152          <literal>r-</literal>
2153          [<option>--enable-stats</option>]
2154        </term>
2155        <listitem><para>Total number of bytes in active chunks mapped by the
2156        allocator.  This is a multiple of the chunk size, and is larger than
2157        <link linkend="stats.active"><mallctl>stats.active</mallctl></link>.
2158        This does not include inactive chunks, even those that contain unused
2159        dirty pages, which means that there is no strict ordering between this
2160        and <link
2161        linkend="stats.resident"><mallctl>stats.resident</mallctl></link>.</para></listitem>
2162      </varlistentry>
2163
2164      <varlistentry id="stats.arenas.i.dss">
2165        <term>
2166          <mallctl>stats.arenas.&lt;i&gt;.dss</mallctl>
2167          (<type>const char *</type>)
2168          <literal>r-</literal>
2169        </term>
2170        <listitem><para>dss (<citerefentry><refentrytitle>sbrk</refentrytitle>
2171        <manvolnum>2</manvolnum></citerefentry>) allocation precedence as
2172        related to <citerefentry><refentrytitle>mmap</refentrytitle>
2173        <manvolnum>2</manvolnum></citerefentry> allocation.  See <link
2174        linkend="opt.dss"><mallctl>opt.dss</mallctl></link> for details.
2175        </para></listitem>
2176      </varlistentry>
2177
2178      <varlistentry id="stats.arenas.i.lg_dirty_mult">
2179        <term>
2180          <mallctl>stats.arenas.&lt;i&gt;.lg_dirty_mult</mallctl>
2181          (<type>ssize_t</type>)
2182          <literal>r-</literal>
2183        </term>
2184        <listitem><para>Minimum ratio (log base 2) of active to dirty pages.
2185        See <link
2186        linkend="opt.lg_dirty_mult"><mallctl>opt.lg_dirty_mult</mallctl></link>
2187        for details.</para></listitem>
2188      </varlistentry>
2189
2190      <varlistentry id="stats.arenas.i.decay_time">
2191        <term>
2192          <mallctl>stats.arenas.&lt;i&gt;.decay_time</mallctl>
2193          (<type>ssize_t</type>)
2194          <literal>r-</literal>
2195        </term>
2196        <listitem><para>Approximate time in seconds from the creation of a set
2197        of unused dirty pages until an equivalent set of unused dirty pages is
2198        purged and/or reused.  See <link
2199        linkend="opt.decay_time"><mallctl>opt.decay_time</mallctl></link>
2200        for details.</para></listitem>
2201      </varlistentry>
2202
2203      <varlistentry id="stats.arenas.i.nthreads">
2204        <term>
2205          <mallctl>stats.arenas.&lt;i&gt;.nthreads</mallctl>
2206          (<type>unsigned</type>)
2207          <literal>r-</literal>
2208        </term>
2209        <listitem><para>Number of threads currently assigned to
2210        arena.</para></listitem>
2211      </varlistentry>
2212
2213      <varlistentry id="stats.arenas.i.pactive">
2214        <term>
2215          <mallctl>stats.arenas.&lt;i&gt;.pactive</mallctl>
2216          (<type>size_t</type>)
2217          <literal>r-</literal>
2218        </term>
2219        <listitem><para>Number of pages in active runs.</para></listitem>
2220      </varlistentry>
2221
2222      <varlistentry id="stats.arenas.i.pdirty">
2223        <term>
2224          <mallctl>stats.arenas.&lt;i&gt;.pdirty</mallctl>
2225          (<type>size_t</type>)
2226          <literal>r-</literal>
2227        </term>
2228        <listitem><para>Number of pages within unused runs that are potentially
2229        dirty, and for which <function>madvise<parameter>...</parameter>
2230        <parameter><constant>MADV_DONTNEED</constant></parameter></function> or
2231        similar has not been called.</para></listitem>
2232      </varlistentry>
2233
2234      <varlistentry id="stats.arenas.i.mapped">
2235        <term>
2236          <mallctl>stats.arenas.&lt;i&gt;.mapped</mallctl>
2237          (<type>size_t</type>)
2238          <literal>r-</literal>
2239          [<option>--enable-stats</option>]
2240        </term>
2241        <listitem><para>Number of mapped bytes.</para></listitem>
2242      </varlistentry>
2243
2244      <varlistentry id="stats.arenas.i.metadata.mapped">
2245        <term>
2246          <mallctl>stats.arenas.&lt;i&gt;.metadata.mapped</mallctl>
2247          (<type>size_t</type>)
2248          <literal>r-</literal>
2249          [<option>--enable-stats</option>]
2250        </term>
2251        <listitem><para>Number of mapped bytes in arena chunk headers, which
2252        track the states of the non-metadata pages.</para></listitem>
2253      </varlistentry>
2254
2255      <varlistentry id="stats.arenas.i.metadata.allocated">
2256        <term>
2257          <mallctl>stats.arenas.&lt;i&gt;.metadata.allocated</mallctl>
2258          (<type>size_t</type>)
2259          <literal>r-</literal>
2260          [<option>--enable-stats</option>]
2261        </term>
2262        <listitem><para>Number of bytes dedicated to internal allocations.
2263        Internal allocations differ from application-originated allocations in
2264        that they are for internal use, and that they are omitted from heap
2265        profiles.  This statistic is reported separately from <link
2266        linkend="stats.metadata"><mallctl>stats.metadata</mallctl></link> and
2267        <link
2268        linkend="stats.arenas.i.metadata.mapped"><mallctl>stats.arenas.&lt;i&gt;.metadata.mapped</mallctl></link>
2269        because it overlaps with e.g. the <link
2270        linkend="stats.allocated"><mallctl>stats.allocated</mallctl></link> and
2271        <link linkend="stats.active"><mallctl>stats.active</mallctl></link>
2272        statistics, whereas the other metadata statistics do
2273        not.</para></listitem>
2274      </varlistentry>
2275
2276      <varlistentry id="stats.arenas.i.npurge">
2277        <term>
2278          <mallctl>stats.arenas.&lt;i&gt;.npurge</mallctl>
2279          (<type>uint64_t</type>)
2280          <literal>r-</literal>
2281          [<option>--enable-stats</option>]
2282        </term>
2283        <listitem><para>Number of dirty page purge sweeps performed.
2284        </para></listitem>
2285      </varlistentry>
2286
2287      <varlistentry id="stats.arenas.i.nmadvise">
2288        <term>
2289          <mallctl>stats.arenas.&lt;i&gt;.nmadvise</mallctl>
2290          (<type>uint64_t</type>)
2291          <literal>r-</literal>
2292          [<option>--enable-stats</option>]
2293        </term>
2294        <listitem><para>Number of <function>madvise<parameter>...</parameter>
2295        <parameter><constant>MADV_DONTNEED</constant></parameter></function> or
2296        similar calls made to purge dirty pages.</para></listitem>
2297      </varlistentry>
2298
2299      <varlistentry id="stats.arenas.i.purged">
2300        <term>
2301          <mallctl>stats.arenas.&lt;i&gt;.purged</mallctl>
2302          (<type>uint64_t</type>)
2303          <literal>r-</literal>
2304          [<option>--enable-stats</option>]
2305        </term>
2306        <listitem><para>Number of pages purged.</para></listitem>
2307      </varlistentry>
2308
2309      <varlistentry id="stats.arenas.i.small.allocated">
2310        <term>
2311          <mallctl>stats.arenas.&lt;i&gt;.small.allocated</mallctl>
2312          (<type>size_t</type>)
2313          <literal>r-</literal>
2314          [<option>--enable-stats</option>]
2315        </term>
2316        <listitem><para>Number of bytes currently allocated by small objects.
2317        </para></listitem>
2318      </varlistentry>
2319
2320      <varlistentry id="stats.arenas.i.small.nmalloc">
2321        <term>
2322          <mallctl>stats.arenas.&lt;i&gt;.small.nmalloc</mallctl>
2323          (<type>uint64_t</type>)
2324          <literal>r-</literal>
2325          [<option>--enable-stats</option>]
2326        </term>
2327        <listitem><para>Cumulative number of allocation requests served by
2328        small bins.</para></listitem>
2329      </varlistentry>
2330
2331      <varlistentry id="stats.arenas.i.small.ndalloc">
2332        <term>
2333          <mallctl>stats.arenas.&lt;i&gt;.small.ndalloc</mallctl>
2334          (<type>uint64_t</type>)
2335          <literal>r-</literal>
2336          [<option>--enable-stats</option>]
2337        </term>
2338        <listitem><para>Cumulative number of small objects returned to bins.
2339        </para></listitem>
2340      </varlistentry>
2341
2342      <varlistentry id="stats.arenas.i.small.nrequests">
2343        <term>
2344          <mallctl>stats.arenas.&lt;i&gt;.small.nrequests</mallctl>
2345          (<type>uint64_t</type>)
2346          <literal>r-</literal>
2347          [<option>--enable-stats</option>]
2348        </term>
2349        <listitem><para>Cumulative number of small allocation requests.
2350        </para></listitem>
2351      </varlistentry>
2352
2353      <varlistentry id="stats.arenas.i.large.allocated">
2354        <term>
2355          <mallctl>stats.arenas.&lt;i&gt;.large.allocated</mallctl>
2356          (<type>size_t</type>)
2357          <literal>r-</literal>
2358          [<option>--enable-stats</option>]
2359        </term>
2360        <listitem><para>Number of bytes currently allocated by large objects.
2361        </para></listitem>
2362      </varlistentry>
2363
2364      <varlistentry id="stats.arenas.i.large.nmalloc">
2365        <term>
2366          <mallctl>stats.arenas.&lt;i&gt;.large.nmalloc</mallctl>
2367          (<type>uint64_t</type>)
2368          <literal>r-</literal>
2369          [<option>--enable-stats</option>]
2370        </term>
2371        <listitem><para>Cumulative number of large allocation requests served
2372        directly by the arena.</para></listitem>
2373      </varlistentry>
2374
2375      <varlistentry id="stats.arenas.i.large.ndalloc">
2376        <term>
2377          <mallctl>stats.arenas.&lt;i&gt;.large.ndalloc</mallctl>
2378          (<type>uint64_t</type>)
2379          <literal>r-</literal>
2380          [<option>--enable-stats</option>]
2381        </term>
2382        <listitem><para>Cumulative number of large deallocation requests served
2383        directly by the arena.</para></listitem>
2384      </varlistentry>
2385
2386      <varlistentry id="stats.arenas.i.large.nrequests">
2387        <term>
2388          <mallctl>stats.arenas.&lt;i&gt;.large.nrequests</mallctl>
2389          (<type>uint64_t</type>)
2390          <literal>r-</literal>
2391          [<option>--enable-stats</option>]
2392        </term>
2393        <listitem><para>Cumulative number of large allocation requests.
2394        </para></listitem>
2395      </varlistentry>
2396
2397      <varlistentry id="stats.arenas.i.huge.allocated">
2398        <term>
2399          <mallctl>stats.arenas.&lt;i&gt;.huge.allocated</mallctl>
2400          (<type>size_t</type>)
2401          <literal>r-</literal>
2402          [<option>--enable-stats</option>]
2403        </term>
2404        <listitem><para>Number of bytes currently allocated by huge objects.
2405        </para></listitem>
2406      </varlistentry>
2407
2408      <varlistentry id="stats.arenas.i.huge.nmalloc">
2409        <term>
2410          <mallctl>stats.arenas.&lt;i&gt;.huge.nmalloc</mallctl>
2411          (<type>uint64_t</type>)
2412          <literal>r-</literal>
2413          [<option>--enable-stats</option>]
2414        </term>
2415        <listitem><para>Cumulative number of huge allocation requests served
2416        directly by the arena.</para></listitem>
2417      </varlistentry>
2418
2419      <varlistentry id="stats.arenas.i.huge.ndalloc">
2420        <term>
2421          <mallctl>stats.arenas.&lt;i&gt;.huge.ndalloc</mallctl>
2422          (<type>uint64_t</type>)
2423          <literal>r-</literal>
2424          [<option>--enable-stats</option>]
2425        </term>
2426        <listitem><para>Cumulative number of huge deallocation requests served
2427        directly by the arena.</para></listitem>
2428      </varlistentry>
2429
2430      <varlistentry id="stats.arenas.i.huge.nrequests">
2431        <term>
2432          <mallctl>stats.arenas.&lt;i&gt;.huge.nrequests</mallctl>
2433          (<type>uint64_t</type>)
2434          <literal>r-</literal>
2435          [<option>--enable-stats</option>]
2436        </term>
2437        <listitem><para>Cumulative number of huge allocation requests.
2438        </para></listitem>
2439      </varlistentry>
2440
2441      <varlistentry id="stats.arenas.i.bins.j.nmalloc">
2442        <term>
2443          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.nmalloc</mallctl>
2444          (<type>uint64_t</type>)
2445          <literal>r-</literal>
2446          [<option>--enable-stats</option>]
2447        </term>
2448        <listitem><para>Cumulative number of allocations served by bin.
2449        </para></listitem>
2450      </varlistentry>
2451
2452      <varlistentry id="stats.arenas.i.bins.j.ndalloc">
2453        <term>
2454          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.ndalloc</mallctl>
2455          (<type>uint64_t</type>)
2456          <literal>r-</literal>
2457          [<option>--enable-stats</option>]
2458        </term>
2459        <listitem><para>Cumulative number of allocations returned to bin.
2460        </para></listitem>
2461      </varlistentry>
2462
2463      <varlistentry id="stats.arenas.i.bins.j.nrequests">
2464        <term>
2465          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.nrequests</mallctl>
2466          (<type>uint64_t</type>)
2467          <literal>r-</literal>
2468          [<option>--enable-stats</option>]
2469        </term>
2470        <listitem><para>Cumulative number of allocation
2471        requests.</para></listitem>
2472      </varlistentry>
2473
2474      <varlistentry id="stats.arenas.i.bins.j.curregs">
2475        <term>
2476          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.curregs</mallctl>
2477          (<type>size_t</type>)
2478          <literal>r-</literal>
2479          [<option>--enable-stats</option>]
2480        </term>
2481        <listitem><para>Current number of regions for this size
2482        class.</para></listitem>
2483      </varlistentry>
2484
2485      <varlistentry id="stats.arenas.i.bins.j.nfills">
2486        <term>
2487          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.nfills</mallctl>
2488          (<type>uint64_t</type>)
2489          <literal>r-</literal>
2490          [<option>--enable-stats</option> <option>--enable-tcache</option>]
2491        </term>
2492        <listitem><para>Cumulative number of tcache fills.</para></listitem>
2493      </varlistentry>
2494
2495      <varlistentry id="stats.arenas.i.bins.j.nflushes">
2496        <term>
2497          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.nflushes</mallctl>
2498          (<type>uint64_t</type>)
2499          <literal>r-</literal>
2500          [<option>--enable-stats</option> <option>--enable-tcache</option>]
2501        </term>
2502        <listitem><para>Cumulative number of tcache flushes.</para></listitem>
2503      </varlistentry>
2504
2505      <varlistentry id="stats.arenas.i.bins.j.nruns">
2506        <term>
2507          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.nruns</mallctl>
2508          (<type>uint64_t</type>)
2509          <literal>r-</literal>
2510          [<option>--enable-stats</option>]
2511        </term>
2512        <listitem><para>Cumulative number of runs created.</para></listitem>
2513      </varlistentry>
2514
2515      <varlistentry id="stats.arenas.i.bins.j.nreruns">
2516        <term>
2517          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.nreruns</mallctl>
2518          (<type>uint64_t</type>)
2519          <literal>r-</literal>
2520          [<option>--enable-stats</option>]
2521        </term>
2522        <listitem><para>Cumulative number of times the current run from which
2523        to allocate changed.</para></listitem>
2524      </varlistentry>
2525
2526      <varlistentry id="stats.arenas.i.bins.j.curruns">
2527        <term>
2528          <mallctl>stats.arenas.&lt;i&gt;.bins.&lt;j&gt;.curruns</mallctl>
2529          (<type>size_t</type>)
2530          <literal>r-</literal>
2531          [<option>--enable-stats</option>]
2532        </term>
2533        <listitem><para>Current number of runs.</para></listitem>
2534      </varlistentry>
2535
2536      <varlistentry id="stats.arenas.i.lruns.j.nmalloc">
2537        <term>
2538          <mallctl>stats.arenas.&lt;i&gt;.lruns.&lt;j&gt;.nmalloc</mallctl>
2539          (<type>uint64_t</type>)
2540          <literal>r-</literal>
2541          [<option>--enable-stats</option>]
2542        </term>
2543        <listitem><para>Cumulative number of allocation requests for this size
2544        class served directly by the arena.</para></listitem>
2545      </varlistentry>
2546
2547      <varlistentry id="stats.arenas.i.lruns.j.ndalloc">
2548        <term>
2549          <mallctl>stats.arenas.&lt;i&gt;.lruns.&lt;j&gt;.ndalloc</mallctl>
2550          (<type>uint64_t</type>)
2551          <literal>r-</literal>
2552          [<option>--enable-stats</option>]
2553        </term>
2554        <listitem><para>Cumulative number of deallocation requests for this
2555        size class served directly by the arena.</para></listitem>
2556      </varlistentry>
2557
2558      <varlistentry id="stats.arenas.i.lruns.j.nrequests">
2559        <term>
2560          <mallctl>stats.arenas.&lt;i&gt;.lruns.&lt;j&gt;.nrequests</mallctl>
2561          (<type>uint64_t</type>)
2562          <literal>r-</literal>
2563          [<option>--enable-stats</option>]
2564        </term>
2565        <listitem><para>Cumulative number of allocation requests for this size
2566        class.</para></listitem>
2567      </varlistentry>
2568
2569      <varlistentry id="stats.arenas.i.lruns.j.curruns">
2570        <term>
2571          <mallctl>stats.arenas.&lt;i&gt;.lruns.&lt;j&gt;.curruns</mallctl>
2572          (<type>size_t</type>)
2573          <literal>r-</literal>
2574          [<option>--enable-stats</option>]
2575        </term>
2576        <listitem><para>Current number of runs for this size class.
2577        </para></listitem>
2578      </varlistentry>
2579
2580      <varlistentry id="stats.arenas.i.hchunks.j.nmalloc">
2581        <term>
2582          <mallctl>stats.arenas.&lt;i&gt;.hchunks.&lt;j&gt;.nmalloc</mallctl>
2583          (<type>uint64_t</type>)
2584          <literal>r-</literal>
2585          [<option>--enable-stats</option>]
2586        </term>
2587        <listitem><para>Cumulative number of allocation requests for this size
2588        class served directly by the arena.</para></listitem>
2589      </varlistentry>
2590
2591      <varlistentry id="stats.arenas.i.hchunks.j.ndalloc">
2592        <term>
2593          <mallctl>stats.arenas.&lt;i&gt;.hchunks.&lt;j&gt;.ndalloc</mallctl>
2594          (<type>uint64_t</type>)
2595          <literal>r-</literal>
2596          [<option>--enable-stats</option>]
2597        </term>
2598        <listitem><para>Cumulative number of deallocation requests for this
2599        size class served directly by the arena.</para></listitem>
2600      </varlistentry>
2601
2602      <varlistentry id="stats.arenas.i.hchunks.j.nrequests">
2603        <term>
2604          <mallctl>stats.arenas.&lt;i&gt;.hchunks.&lt;j&gt;.nrequests</mallctl>
2605          (<type>uint64_t</type>)
2606          <literal>r-</literal>
2607          [<option>--enable-stats</option>]
2608        </term>
2609        <listitem><para>Cumulative number of allocation requests for this size
2610        class.</para></listitem>
2611      </varlistentry>
2612
2613      <varlistentry id="stats.arenas.i.hchunks.j.curhchunks">
2614        <term>
2615          <mallctl>stats.arenas.&lt;i&gt;.hchunks.&lt;j&gt;.curhchunks</mallctl>
2616          (<type>size_t</type>)
2617          <literal>r-</literal>
2618          [<option>--enable-stats</option>]
2619        </term>
2620        <listitem><para>Current number of huge allocations for this size class.
2621        </para></listitem>
2622      </varlistentry>
2623    </variablelist>
2624  </refsect1>
2625  <refsect1 id="heap_profile_format">
2626    <title>HEAP PROFILE FORMAT</title>
2627    <para>Although the heap profiling functionality was originally designed to
2628    be compatible with the
2629    <command>pprof</command> command that is developed as part of the <ulink
2630    url="http://code.google.com/p/gperftools/">gperftools
2631    package</ulink>, the addition of per thread heap profiling functionality
2632    required a different heap profile format.  The <command>jeprof</command>
2633    command is derived from <command>pprof</command>, with enhancements to
2634    support the heap profile format described here.</para>
2635
2636    <para>In the following hypothetical heap profile, <constant>[...]</constant>
2637    indicates elision for the sake of compactness.  <programlisting><![CDATA[
2638heap_v2/524288
2639  t*: 28106: 56637512 [0: 0]
2640  [...]
2641  t3: 352: 16777344 [0: 0]
2642  [...]
2643  t99: 17754: 29341640 [0: 0]
2644  [...]
2645@ 0x5f86da8 0x5f5a1dc [...] 0x29e4d4e 0xa200316 0xabb2988 [...]
2646  t*: 13: 6688 [0: 0]
2647  t3: 12: 6496 [0: ]
2648  t99: 1: 192 [0: 0]
2649[...]
2650
2651MAPPED_LIBRARIES:
2652[...]]]></programlisting> The following matches the above heap profile, but most
2653tokens are replaced with <constant>&lt;description&gt;</constant> to indicate
2654descriptions of the corresponding fields.  <programlisting><![CDATA[
2655<heap_profile_format_version>/<mean_sample_interval>
2656  <aggregate>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
2657  [...]
2658  <thread_3_aggregate>: <curobjs>: <curbytes>[<cumobjs>: <cumbytes>]
2659  [...]
2660  <thread_99_aggregate>: <curobjs>: <curbytes>[<cumobjs>: <cumbytes>]
2661  [...]
2662@ <top_frame> <frame> [...] <frame> <frame> <frame> [...]
2663  <backtrace_aggregate>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
2664  <backtrace_thread_3>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
2665  <backtrace_thread_99>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
2666[...]
2667
2668MAPPED_LIBRARIES:
2669</proc/<pid>/maps>]]></programlisting></para>
2670  </refsect1>
2671
2672  <refsect1 id="debugging_malloc_problems">
2673    <title>DEBUGGING MALLOC PROBLEMS</title>
2674    <para>When debugging, it is a good idea to configure/build jemalloc with
2675    the <option>--enable-debug</option> and <option>--enable-fill</option>
2676    options, and recompile the program with suitable options and symbols for
2677    debugger support.  When so configured, jemalloc incorporates a wide variety
2678    of run-time assertions that catch application errors such as double-free,
2679    write-after-free, etc.</para>
2680
2681    <para>Programs often accidentally depend on &ldquo;uninitialized&rdquo;
2682    memory actually being filled with zero bytes.  Junk filling
2683    (see the <link linkend="opt.junk"><mallctl>opt.junk</mallctl></link>
2684    option) tends to expose such bugs in the form of obviously incorrect
2685    results and/or coredumps.  Conversely, zero
2686    filling (see the <link
2687    linkend="opt.zero"><mallctl>opt.zero</mallctl></link> option) eliminates
2688    the symptoms of such bugs.  Between these two options, it is usually
2689    possible to quickly detect, diagnose, and eliminate such bugs.</para>
2690
2691    <para>This implementation does not provide much detail about the problems
2692    it detects, because the performance impact for storing such information
2693    would be prohibitive.  However, jemalloc does integrate with the most
2694    excellent <ulink url="http://valgrind.org/">Valgrind</ulink> tool if the
2695    <option>--enable-valgrind</option> configuration option is enabled.</para>
2696  </refsect1>
2697  <refsect1 id="diagnostic_messages">
2698    <title>DIAGNOSTIC MESSAGES</title>
2699    <para>If any of the memory allocation/deallocation functions detect an
2700    error or warning condition, a message will be printed to file descriptor
2701    <constant>STDERR_FILENO</constant>.  Errors will result in the process
2702    dumping core.  If the <link
2703    linkend="opt.abort"><mallctl>opt.abort</mallctl></link> option is set, most
2704    warnings are treated as errors.</para>
2705
2706    <para>The <varname>malloc_message</varname> variable allows the programmer
2707    to override the function which emits the text strings forming the errors
2708    and warnings if for some reason the <constant>STDERR_FILENO</constant> file
2709    descriptor is not suitable for this.
2710    <function>malloc_message<parameter/></function> takes the
2711    <parameter>cbopaque</parameter> pointer argument that is
2712    <constant>NULL</constant> unless overridden by the arguments in a call to
2713    <function>malloc_stats_print<parameter/></function>, followed by a string
2714    pointer.  Please note that doing anything which tries to allocate memory in
2715    this function is likely to result in a crash or deadlock.</para>
2716
2717    <para>All messages are prefixed by
2718    &ldquo;<computeroutput>&lt;jemalloc&gt;: </computeroutput>&rdquo;.</para>
2719  </refsect1>
2720  <refsect1 id="return_values">
2721    <title>RETURN VALUES</title>
2722    <refsect2>
2723      <title>Standard API</title>
2724      <para>The <function>malloc<parameter/></function> and
2725      <function>calloc<parameter/></function> functions return a pointer to the
2726      allocated memory if successful; otherwise a <constant>NULL</constant>
2727      pointer is returned and <varname>errno</varname> is set to
2728      <errorname>ENOMEM</errorname>.</para>
2729
2730      <para>The <function>posix_memalign<parameter/></function> function
2731      returns the value 0 if successful; otherwise it returns an error value.
2732      The <function>posix_memalign<parameter/></function> function will fail
2733      if:
2734        <variablelist>
2735          <varlistentry>
2736            <term><errorname>EINVAL</errorname></term>
2737
2738            <listitem><para>The <parameter>alignment</parameter> parameter is
2739            not a power of 2 at least as large as
2740            <code language="C">sizeof(<type>void *</type>)</code>.
2741            </para></listitem>
2742          </varlistentry>
2743          <varlistentry>
2744            <term><errorname>ENOMEM</errorname></term>
2745
2746            <listitem><para>Memory allocation error.</para></listitem>
2747          </varlistentry>
2748        </variablelist>
2749      </para>
2750
2751      <para>The <function>aligned_alloc<parameter/></function> function returns
2752      a pointer to the allocated memory if successful; otherwise a
2753      <constant>NULL</constant> pointer is returned and
2754      <varname>errno</varname> is set.  The
2755      <function>aligned_alloc<parameter/></function> function will fail if:
2756        <variablelist>
2757          <varlistentry>
2758            <term><errorname>EINVAL</errorname></term>
2759
2760            <listitem><para>The <parameter>alignment</parameter> parameter is
2761            not a power of 2.
2762            </para></listitem>
2763          </varlistentry>
2764          <varlistentry>
2765            <term><errorname>ENOMEM</errorname></term>
2766
2767            <listitem><para>Memory allocation error.</para></listitem>
2768          </varlistentry>
2769        </variablelist>
2770      </para>
2771
2772      <para>The <function>realloc<parameter/></function> function returns a
2773      pointer, possibly identical to <parameter>ptr</parameter>, to the
2774      allocated memory if successful; otherwise a <constant>NULL</constant>
2775      pointer is returned, and <varname>errno</varname> is set to
2776      <errorname>ENOMEM</errorname> if the error was the result of an
2777      allocation failure.  The <function>realloc<parameter/></function>
2778      function always leaves the original buffer intact when an error occurs.
2779      </para>
2780
2781      <para>The <function>free<parameter/></function> function returns no
2782      value.</para>
2783    </refsect2>
2784    <refsect2>
2785      <title>Non-standard API</title>
2786      <para>The <function>mallocx<parameter/></function> and
2787      <function>rallocx<parameter/></function> functions return a pointer to
2788      the allocated memory if successful; otherwise a <constant>NULL</constant>
2789      pointer is returned to indicate insufficient contiguous memory was
2790      available to service the allocation request.  </para>
2791
2792      <para>The <function>xallocx<parameter/></function> function returns the
2793      real size of the resulting resized allocation pointed to by
2794      <parameter>ptr</parameter>, which is a value less than
2795      <parameter>size</parameter> if the allocation could not be adequately
2796      grown in place.  </para>
2797
2798      <para>The <function>sallocx<parameter/></function> function returns the
2799      real size of the allocation pointed to by <parameter>ptr</parameter>.
2800      </para>
2801
2802      <para>The <function>nallocx<parameter/></function> returns the real size
2803      that would result from a successful equivalent
2804      <function>mallocx<parameter/></function> function call, or zero if
2805      insufficient memory is available to perform the size computation.  </para>
2806
2807      <para>The <function>mallctl<parameter/></function>,
2808      <function>mallctlnametomib<parameter/></function>, and
2809      <function>mallctlbymib<parameter/></function> functions return 0 on
2810      success; otherwise they return an error value.  The functions will fail
2811      if:
2812        <variablelist>
2813          <varlistentry>
2814            <term><errorname>EINVAL</errorname></term>
2815
2816            <listitem><para><parameter>newp</parameter> is not
2817            <constant>NULL</constant>, and <parameter>newlen</parameter> is too
2818            large or too small.  Alternatively, <parameter>*oldlenp</parameter>
2819            is too large or too small; in this case as much data as possible
2820            are read despite the error.</para></listitem>
2821          </varlistentry>
2822          <varlistentry>
2823            <term><errorname>ENOENT</errorname></term>
2824
2825            <listitem><para><parameter>name</parameter> or
2826            <parameter>mib</parameter> specifies an unknown/invalid
2827            value.</para></listitem>
2828          </varlistentry>
2829          <varlistentry>
2830            <term><errorname>EPERM</errorname></term>
2831
2832            <listitem><para>Attempt to read or write void value, or attempt to
2833            write read-only value.</para></listitem>
2834          </varlistentry>
2835          <varlistentry>
2836            <term><errorname>EAGAIN</errorname></term>
2837
2838            <listitem><para>A memory allocation failure
2839            occurred.</para></listitem>
2840          </varlistentry>
2841          <varlistentry>
2842            <term><errorname>EFAULT</errorname></term>
2843
2844            <listitem><para>An interface with side effects failed in some way
2845            not directly related to <function>mallctl*<parameter/></function>
2846            read/write processing.</para></listitem>
2847          </varlistentry>
2848        </variablelist>
2849      </para>
2850
2851      <para>The <function>malloc_usable_size<parameter/></function> function
2852      returns the usable size of the allocation pointed to by
2853      <parameter>ptr</parameter>.  </para>
2854    </refsect2>
2855  </refsect1>
2856  <refsect1 id="environment">
2857    <title>ENVIRONMENT</title>
2858    <para>The following environment variable affects the execution of the
2859    allocation functions:
2860      <variablelist>
2861        <varlistentry>
2862          <term><envar>MALLOC_CONF</envar></term>
2863
2864          <listitem><para>If the environment variable
2865          <envar>MALLOC_CONF</envar> is set, the characters it contains
2866          will be interpreted as options.</para></listitem>
2867        </varlistentry>
2868      </variablelist>
2869    </para>
2870  </refsect1>
2871  <refsect1 id="examples">
2872    <title>EXAMPLES</title>
2873    <para>To dump core whenever a problem occurs:
2874      <screen>ln -s 'abort:true' /etc/malloc.conf</screen>
2875    </para>
2876    <para>To specify in the source a chunk size that is 16 MiB:
2877      <programlisting language="C"><![CDATA[
2878malloc_conf = "lg_chunk:24";]]></programlisting></para>
2879  </refsect1>
2880  <refsect1 id="see_also">
2881    <title>SEE ALSO</title>
2882    <para><citerefentry><refentrytitle>madvise</refentrytitle>
2883    <manvolnum>2</manvolnum></citerefentry>,
2884    <citerefentry><refentrytitle>mmap</refentrytitle>
2885    <manvolnum>2</manvolnum></citerefentry>,
2886    <citerefentry><refentrytitle>sbrk</refentrytitle>
2887    <manvolnum>2</manvolnum></citerefentry>,
2888    <citerefentry><refentrytitle>utrace</refentrytitle>
2889    <manvolnum>2</manvolnum></citerefentry>,
2890    <citerefentry><refentrytitle>alloca</refentrytitle>
2891    <manvolnum>3</manvolnum></citerefentry>,
2892    <citerefentry><refentrytitle>atexit</refentrytitle>
2893    <manvolnum>3</manvolnum></citerefentry>,
2894    <citerefentry><refentrytitle>getpagesize</refentrytitle>
2895    <manvolnum>3</manvolnum></citerefentry></para>
2896  </refsect1>
2897  <refsect1 id="standards">
2898    <title>STANDARDS</title>
2899    <para>The <function>malloc<parameter/></function>,
2900    <function>calloc<parameter/></function>,
2901    <function>realloc<parameter/></function>, and
2902    <function>free<parameter/></function> functions conform to ISO/IEC
2903    9899:1990 (&ldquo;ISO C90&rdquo;).</para>
2904
2905    <para>The <function>posix_memalign<parameter/></function> function conforms
2906    to IEEE Std 1003.1-2001 (&ldquo;POSIX.1&rdquo;).</para>
2907  </refsect1>
2908</refentry>
2909