• Samuel Groß's avatar
    [sandbox] Implement external pointer table compaction · 76d74489
    Samuel Groß authored
    The external pointer table is already to some degree self-compacting: as
    the freelist is sorted in ascending order, free entries at the start of
    the table should quickly fill up. However, any live entry at the end of
    the table makes it impossible to shrink the table, thereby causing
    higher memory consumption. To solve this, this CL implements a simple
    table compaction algorithm, used when the freelist has become
    sufficiently large (currently >= 10% of the table capacity):
     - The goal of the algorithm is to shrink the table by freelist_size/2
       entries at the end of compaction (during sweeping).
     - At the start of the marking phase, the compaction area is computed as
       roughly [capacity - freelist_size/2, capacity).
     - When an entry is marked as alive that lies inside the compaction
       area, a new "relocation entry" is allocated for it from the freelist
       and the address of the handle for that entry is stored in that entry.
       If there are no more free entries before the compaction area,
       compaction is aborted. This is expected to happen rarely and is
       logged into a histogram.
     - During sweeping, all relocation entries are "resolved": the content
       of the old entry is copied into the new entry and the handle is
       updated to point to the new entry.
     - Finally, the table is shrunk and the last initial_freelist_size/2
       entries are decommitted.
    
    See also the comments in the ExternalPointerTable class for more details.
    
    Bug: v8:10391
    Change-Id: I28d475c3596590e860421f0a054e2ad4dbebd487
    Cq-Include-Trybots: luci.v8.try:v8_linux64_heap_sandbox_dbg_ng,v8_linux_arm64_sim_heap_sandbox_dbg_ng
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3794645Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
    Reviewed-by: 's avatarMichael Lippautz <mlippautz@chromium.org>
    Commit-Queue: Samuel Groß <saelo@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#82484}
    76d74489
v8-internal.h 36.2 KB