76d7448925
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/+/3794645 Reviewed-by: Igor Sheludko <ishell@chromium.org> Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Commit-Queue: Samuel Groß <saelo@chromium.org> Cr-Commit-Position: refs/heads/main@{#82484} |
||
---|---|---|
.. | ||
cppgc | ||
libplatform | ||
APIDesign.md | ||
DEPS | ||
DIR_METADATA | ||
js_protocol-1.2.json | ||
js_protocol-1.3.json | ||
js_protocol.pdl | ||
OWNERS | ||
v8-array-buffer.h | ||
v8-callbacks.h | ||
v8-container.h | ||
v8-context.h | ||
v8-cppgc.h | ||
v8-data.h | ||
v8-date.h | ||
v8-debug.h | ||
v8-embedder-heap.h | ||
v8-embedder-state-scope.h | ||
v8-exception.h | ||
v8-extension.h | ||
v8-external.h | ||
v8-fast-api-calls.h | ||
v8-forward.h | ||
v8-function-callback.h | ||
v8-function.h | ||
v8-initialization.h | ||
v8-inspector-protocol.h | ||
v8-inspector.h | ||
v8-internal.h | ||
v8-isolate.h | ||
v8-json.h | ||
v8-local-handle.h | ||
v8-locker.h | ||
v8-maybe.h | ||
v8-memory-span.h | ||
v8-message.h | ||
v8-metrics.h | ||
v8-microtask-queue.h | ||
v8-microtask.h | ||
v8-object.h | ||
v8-persistent-handle.h | ||
v8-platform.h | ||
v8-primitive-object.h | ||
v8-primitive.h | ||
v8-profiler.h | ||
v8-promise.h | ||
v8-proxy.h | ||
v8-regexp.h | ||
v8-script.h | ||
v8-snapshot.h | ||
v8-statistics.h | ||
v8-template.h | ||
v8-traced-handle.h | ||
v8-typed-array.h | ||
v8-unwinder-state.h | ||
v8-unwinder.h | ||
v8-util.h | ||
v8-value-serializer-version.h | ||
v8-value-serializer.h | ||
v8-value.h | ||
v8-version-string.h | ||
v8-version.h | ||
v8-wasm-trap-handler-posix.h | ||
v8-wasm-trap-handler-win.h | ||
v8-wasm.h | ||
v8-weak-callback-info.h | ||
v8.h | ||
v8config.h |