How does jemalloc work? What are the benefits?

前端 未结 4 1766
深忆病人
深忆病人 2020-12-12 11:46

Firefox 3 came with a new allocator: jemalloc.

I have heard at several places that this new allocator is better. The top Google results don\'t gave any

4条回答
  •  有刺的猬
    2020-12-12 11:49

    There is one interesting source: the C-source itself: https://dxr.mozilla.org/mozilla-central/source/memory/build/mozjemalloc.cpp (old)

    In the beginning, a short summary describes how it works roughly.

    // This allocator implementation is designed to provide scalable performance
    // for multi-threaded programs on multi-processor systems.  The following
    // features are included for this purpose:
    //
    //   + Multiple arenas are used if there are multiple CPUs, which reduces lock
    //     contention and cache sloshing.
    //
    //   + Cache line sharing between arenas is avoided for internal data
    //     structures.
    //
    //   + Memory is managed in chunks and runs (chunks can be split into runs),
    //     rather than as individual pages.  This provides a constant-time
    //     mechanism for associating allocations with particular arenas.
    //
    // Allocation requests are rounded up to the nearest size class, and no record
    // of the original request size is maintained.  Allocations are broken into
    // categories according to size class.  Assuming runtime defaults, 4 kB pages
    // and a 16 byte quantum on a 32-bit system, the size classes in each category
    // are as follows:
    //
    //   |=====================================|
    //   | Category | Subcategory    |    Size |
    //   |=====================================|
    //   | Small    | Tiny           |       4 |
    //   |          |                |       8 |
    //   |          |----------------+---------|
    //   |          | Quantum-spaced |      16 |
    //   |          |                |      32 |
    //   |          |                |      48 |
    //   |          |                |     ... |
    //   |          |                |     480 |
    //   |          |                |     496 |
    //   |          |                |     512 |
    //   |          |----------------+---------|
    //   |          | Sub-page       |    1 kB |
    //   |          |                |    2 kB |
    //   |=====================================|
    //   | Large                     |    4 kB |
    //   |                           |    8 kB |
    //   |                           |   12 kB |
    //   |                           |     ... |
    //   |                           | 1012 kB |
    //   |                           | 1016 kB |
    //   |                           | 1020 kB |
    //   |=====================================|
    //   | Huge                      |    1 MB |
    //   |                           |    2 MB |
    //   |                           |    3 MB |
    //   |                           |     ... |
    //   |=====================================|
    //
    // NOTE: Due to Mozilla bug 691003, we cannot reserve less than one word for an
    // allocation on Linux or Mac.  So on 32-bit *nix, the smallest bucket size is
    // 4 bytes, and on 64-bit, the smallest bucket size is 8 bytes.
    //
    // A different mechanism is used for each category:
    //
    //   Small : Each size class is segregated into its own set of runs.  Each run
    //           maintains a bitmap of which regions are free/allocated.
    //
    //   Large : Each allocation is backed by a dedicated run.  Metadata are stored
    //           in the associated arena chunk header maps.
    //
    //   Huge : Each allocation is backed by a dedicated contiguous set of chunks.
    //          Metadata are stored in a separate red-black tree.
    //
    // *****************************************************************************
    

    Though, a more depth algorithm analysis is missing.

提交回复
热议问题