<!--
Copyright 2020 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<!--
This file is used to generate a comprehensive list of V8 histograms
along with a detailed description for each histogram.

For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md

Please follow the instructions in the OWNERS file in this directory to find a
reviewer. If no OWNERS file exists, please consider signing up at
go/reviewing-metrics (Googlers only), as all subdirectories are expected to
have an OWNERS file. As a last resort you can send the CL to
chromium-metrics-reviews@google.com.
-->

<histogram-configuration>

<histograms>

<variants name="V8WasmSeparateAsmAndWasm">
  <variant name=".asm" summary="This histogram contains results for asm.js."/>
  <variant name=".wasm"
      summary="This histogram contains results for wasm modules."/>
</variants>

<histogram name="V8.ArrayBufferLargeAllocations" units="MB"
    expires_after="M120">
  <owner>gdeepti@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@chromium.org</owner>
  <summary>
    Number of bytes requested in array buffer allocations greater than one
    megabyte.
  </summary>
</histogram>

<histogram name="V8.ArrayBufferNewSizeFailures" units="MB" expires_after="M120">
  <owner>gdeepti@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@chromium.org</owner>
  <summary>Array buffer sizes for which V8 failed to allocate memory.</summary>
</histogram>

<histogram name="V8.AsmjsInstantiateResult" enum="AsmJsInstantiateResult"
    expires_after="2027-01-03">
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Counter of succeeded and failed asm.js instantiations with the asm.js
    pipeline. Success means that the asm.js pipeline is used to execute the
    asm.js module. Failure means that the asm.js module gets executed with the
    normal JavaScript pipeline. Reasons for failed instantiations can be that
    the asm.js module gets instantiated with an invalid memory type like a
    WebAssembly memory. Recorded after each attempt to instantiate asm.js module
    with the asm.js pipeline.
  </summary>
</histogram>

<histogram name="V8.CFIPageSizeMismatch" enum="BooleanOccurred"
    expires_after="2027-05-01">
  <owner>emaxx@google.com</owner>
  <owner>sroettger@google.com</owner>
  <owner>v8-security@google.com</owner>
  <summary>
    Whether there's a mismatch between the maximum page size we assume at
    compile time and the page size we assume at runtime.

    This metric is recorded once at renderer startup when the
    ThreadIsolatedAllocator is initialized.
  </summary>
</histogram>

<histogram name="V8.CFIPkeyMprotect" enum="PkeyMprotectResult"
    expires_after="2026-10-01">
  <owner>emaxx@google.com</owner>
  <owner>v8-security@google.com</owner>
  <summary>
    The result of trying to pkey_mprotect the ThreadIsolationData at runtime.

    This metric is recorded once at renderer startup when the
    ThreadIsolatedAllocator is initialized.
  </summary>
</histogram>

<histogram name="V8.CodeCacheRejectReason" enum="V8CodeCacheRejectReason"
    expires_after="2027-01-24">
  <owner>marja@chromium.org</owner>
  <owner>v8-runtime@chromium.org</owner>
  <summary>
    Reason code data has been rejected when attempting to deserialize.
  </summary>
</histogram>

<histogram name="V8.CompileLazyMicroSeconds" units="microseconds"
    expires_after="2028-07-01">
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Aggregated time spent compiling functions lazily during a single script
    execution.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="V8.CompileMicroSeconds" units="microseconds"
    expires_after="2028-07-01">
  <owner>marja@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Time spent in V8 compiler (full codegen) excluding parser.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="V8.CompileScript.CacheBehaviour" enum="V8CacheBehaviour"
    expires_after="2028-07-01">
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    The cache behaviour of compiling a V8 script, including whether we produced
    or consumed a code cache, whether we hit V8's isolate's cache, and if we
    didn't use the code cache, the reason why not.
  </summary>
</histogram>

<histogram name="V8.CompileScriptMicroSeconds.NoCache{Reason}"
    units="microseconds" expires_after="2028-07-01">
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Total time spent in compiling a script (incl. parsing) {Reason}.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
  <token key="Reason">
    <variant name=".CacheTooCold" summary="when the cache is too cold to use."/>
    <variant name=".InlineScript"
        summary="when the script is an inline script."/>
    <variant name=".Other" summary="when we do not want to cache it."/>
    <variant name=".ScriptTooSmall"
        summary="when the script is too small to be cached."/>
  </token>
</histogram>

<histogram name="V8.CompileScriptMicroSeconds{CacheBehavior}"
    units="microseconds" expires_after="2028-07-01">
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Total time spent {CacheBehavior}.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
  <token key="CacheBehavior">
    <variant name="" summary="in compiling a script (incl. parsing/caching)"/>
    <variant name=".BackgroundThread"
        summary="in compiling a script (incl. parsing) on a background
                 thread."/>
    <variant name=".ConsumeCache"
        summary="in compiling a script when the 'compilation' is
                 deserializing it from the code cache"/>
    <variant name=".ConsumeCache.Failed"
        summary="in compiling a script (incl. parsing/caching) when the
                 compilation tried to deserialize it from the code cache, but
                 failed."/>
    <variant name=".IsolateCacheHit"
        summary="in compiling a script (incl. parsing/caching) in the case
                 where the V8 isolate's compilation cache is hit."/>
    <variant name=".ProduceCache"
        summary="in compiling a script (incl. parsing) and serializing it for
                 the code cache"/>
    <variant name=".StreamingFinalization"
        summary="in finalizing a script that was streaming compiled."/>
  </token>
</histogram>

<histogram name="V8.Compile{Action}MicroSeconds" units="microseconds"
    expires_after="2028-07-01">
  <owner>jgruber@chromium.org</owner>
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Time spent {Action} code, used by V8 code caching.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
  <token key="Action">
    <variant name="Deserialize" summary="deserializing"/>
    <variant name="Serialize" summary="serializing"/>
  </token>
</histogram>

<histogram name="V8.Compile{Thread}MicroSeconds.Cumulative.Interactive"
    units="microseconds" expires_after="2028-07-01">
  <owner>marja@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Aggregated time spent in compiling on the {Thread} thread until the page
    turned interactive. Emitted when the page turns interactive.

    Includes samples only from clients with a high-resolution clock.
  </summary>
  <token key="Thread">
    <variant name="Background" summary="background"/>
    <variant name="Foreground" summary="foreground"/>
  </token>
</histogram>

<histogram name="V8.ESMImportGraphDepth" units="depth"
    expires_after="2027-05-01">
  <owner>olivf@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Records the maximum depth of an ES module import graph. Recorded upon
    successful module graph instantiation in V8.
  </summary>
</histogram>

<histogram name="V8.ESMModulesPerPage" units="modules"
    expires_after="2027-05-01">
  <owner>olivf@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Records the total number of ES modules instantiated in a top-level module
    import graph. Recorded upon successful module graph instantiation in V8.
  </summary>
</histogram>

<histogram name="V8.ExecuteMicroSeconds" units="microseconds"
    expires_after="2028-07-01">
  <owner>cbruni@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Time spent in JavaScript Execution, including runtime calls, and lazy
    compilation. This histogram excludes time spent in embedder callbacks.
  </summary>
</histogram>

<histogram name="V8.ExecuteMicroSeconds.Cumulative.Interactive"
    units="microseconds" expires_after="2028-07-01">
  <owner>marja@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Aggregated time spent in executing JavaScript (all compiler tiers) until the
    page turned interactive. Emitted when the page turns interactive.

    Includes samples only from clients with a high-resolution clock.
  </summary>
</histogram>

<histogram name="V8.ExternalPointerTableCompactionOutcome"
    enum="V8ExternalPointerTableCompactionOutcome" expires_after="2027-01-30">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    The outcome of external pointer table compaction.

    External pointer table compaction may only succeed partially or fail
    entirely if the application allocates lots of external pointer table entries
    while the table is being compacted. This histogram records this outcome at
    the end of a table-compacting GC. The frequency of such failures influences
    the heuristics used to decide when to compact the table, and to some degree
    also the compaction algorithm itself.
  </summary>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.CollectionRate.Full{Heap}" units="%"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The percentage of managed C++ memory that was freed after a {Priority}
    garbage collection of the {Heap}. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.CollectionRate.Young" units="%"
    expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The percentage of managed JavaScript memory that survived after a {Priority}
    young generation garbage collection of the JavaScript heap. Reported at the
    end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.CollectionWeight.Full{Heap}"
    units="ms/s" expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of a {Priority} garbage collection of the {Heap},
    normalized by the wall time since the last mark compact cycle. Reported at
    the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.CollectionWeight.MainThread.Full{Heap}"
    units="ms/s" expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of a {Priority} garbage collection of the {Heap} on the
    main thread only, normalized by the wall time since the last mark compact
    cycle. This histogram ignores concurrent garbage collection. Reported at the
    end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Consumed.{Scope}.Current2.Full"
    units="KB" expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Amount of {Scope} consumed memory right before a {Priority} full garbage
    collection of the unified heap. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Scope">
    <variant name="Global" summary="global"/>
    <variant name="OldGeneration" summary="old generation"/>
  </token>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Consumed.{Scope}.Limit2.Full" units="KB"
    expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Allocation limit on {Scope} consumed memory used before a {Priority} full
    garbage collection of the unified heap. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Scope">
    <variant name="Global" summary="global"/>
    <variant name="OldGeneration" summary="old generation"/>
  </token>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Consumed.{Scope}.Max.Full" units="KB"
    expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Hard cap on allocation limit for {Scope} consumed memory used before a
    {Priority} full garbage collection of the unified heap. Reported at the end
    of the garbage collection cycle.
  </summary>
  <token key="Scope">
    <variant name="Global" summary="global"/>
    <variant name="OldGeneration" summary="old generation"/>
  </token>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Efficiency.Full{Heap}" units="KB/ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The speed at which a {Priority} garbage collection of the {Heap} reclaims
    unused memory. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Efficiency.MainThread.Full{Heap}"
    units="KB/ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The speed at which a {Priority} garbage collection of the {Heap} reclaims
    unused memory on the main thread only. This histogram ignores concurrent
    garbage collection. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Efficiency.MainThread.Young"
    units="KB/ms" expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The speed at which a {Priority} young generation garbage collection of the
    JavaScript heap reclaims unused memory on the main thread only. This
    histogram ignores concurrent garbage collection. Reported at the end of the
    garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Efficiency.Young" units="KB/ms"
    expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The speed at which a {Priority} young generation garbage collection of the
    JavaScript heap reclaims unused memory. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.ExternalMemory.Full" units="KB"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The external memory size right before a {Priority} full garbage collection
    of the unified heap. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.FoundJSGlobalProxies.Full" units="count"
    expires_after="M156">
  <owner>hpayer@chromium.org</owner>
  <owner>mlippautz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The number of JSGlobalProxy objects found during a full garbage collection.
    Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Full.Compact{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on compaction during a whole {Priority} garbage collection of the
    {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Full.Mark{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on marking during a whole {Priority} garbage collection of the
    {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Full.Sweep{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on sweeping during a whole {Priority} garbage collection of the
    {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Full.Weak{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on weakness handling during a whole {Priority} garbage collection
    of the {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Full{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of a whole {Priority} garbage collection of the {Heap}.
    Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Full{InputState}" units="MB"
    expires_after="2027-01-03">
  <owner>thiabaud@google.com</owner>
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Same as &quot;V8.GC.Cycle{Priority}.Full&quot;, but split on whether we are
    currently in input-handling mode.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="InputState">
    <variant name=".IsInputHandling" summary="in input mode"/>
    <variant name=".NotInputHandling" summary="not in input mode"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Atomic.Compact{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of compaction on the main thread during the atomic pause of
    a {Priority} garbage collection of the {Heap}. There is only a single atomic
    pause compaction event per cycle but it may cover several sub-events.
    Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Atomic.Mark{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of marking on the main thread during the atomic pause of a
    {Priority} garbage collection of the {Heap}. There is only a single atomic
    pause marking event per cycle but it may cover several sub-events. Reported
    at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Atomic.Sweep{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of sweeping on the main thread during the atomic pasue of a
    {Priority} garbage collection of the {Heap}. There is only a single atomic
    pause sweeping event per cycle but it may cover several sub-events. Reported
    at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Atomic.Weak{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of weakness handling on the main thread during the atomic
    pause of a {Priority} garbage collection of the {Heap}. There is only a
    single atomic pause weakness handling event per cycle but it may cover
    several sub-events. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Atomic{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall main thread duration of the atomic pause of a {Priority} garbage
    collection of the {Heap}. There is only a single atomic pause event per
    cycle but it may cover several sub-events. Reported at the end of the
    garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Compact{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on compaction on the main thread during a whole {Priority}
    garbage collection of the {Heap}. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram
    name="V8.GC.Cycle{Priority}.MainThread.Full.Incremental.Mark.StartStop"
    units="ms" expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Wall time duration of incremental marking during a {Priority} full garbage
    collection of the unified heap. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Incremental.Mark{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of incremental marking steps on the main thread during a
    {Priority} full garbage collection of the {Heap}. Reported at the end of the
    garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Incremental.Sweep{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of incremental sweeping steps on the main thread during a
    {Priority} full garbage collection of the {Heap}. Reported at the end of the
    garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Mark{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on marking on the main thread during a whole {Priority} garbage
    collection of the {Heap}. Reported at the end of the garbage collection
    cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Sweep{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on sweeping on the main thread during a whole {Priority} garbage
    collection of the {Heap}. Reported at the end of the garbage collection
    cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full.Weak{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent on weakness handling on the main thread during a whole {Priority}
    garbage collection of the {Heap}. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Main thread only duration of a whole {Priority} garbage collection of the
    {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Full{InputState}" units="MB"
    expires_after="2027-01-03">
  <owner>thiabaud@google.com</owner>
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Same as &quot;V8.GC.Cycle{Priority}.MainThread.Full&quot;, but split on
    whether we are currently in input-handling mode.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="InputState">
    <variant name=".IsInputHandling" summary="in input mode"/>
    <variant name=".NotInputHandling" summary="not in input mode"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.MainThread.Young" units="ms"
    expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Main-thread only duration of a {Priority} young generation garbage
    collection of the JavaScript heap. Reported at the end of the garbage
    collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Memory.Freed.Full{Heap}" units="KB"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Amount of allocated memory freed by a {Priority} garbage collection of the
    {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Objects.After.Full{Heap}" units="KB"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Amount of used memory after a {Priority} garbage collection of the {Heap}.
    Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Objects.Before.Full{Heap}" units="KB"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Amount of used memory before a {Priority} garbage collection of the {Heap}.
    Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Objects.Freed.Full{Heap}" units="KB"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Amount of used memory freed by a {Priority} garbage collection of the
    {Heap}. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Reason.Full"
    enum="GarbageCollectionReason" expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Reason a {Priority} full garbage collection was started in V8. Reported at
    the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Reason.Full{InputState}"
    enum="GarbageCollectionReason" expires_after="2027-01-03">
  <owner>thiabaud@google.com</owner>
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Same as &quot;V8.GC.Cycle{Priority}.Reason.Full&quot;, but split on whether
    we are currently in input-handling mode.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
  <token key="InputState">
    <variant name=".IsInputHandling" summary="in input mode"/>
    <variant name=".NotInputHandling" summary="not in input mode"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Reason.Young"
    enum="GarbageCollectionReason" expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Reason a {Priority} young generation garbage collection was started in V8.
    Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.TimeSinceLastCycle.Full" units="ms"
    expires_after="M156">
  <owner>etiennep@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time between the start of a {Priority} full garbage collection and the end
    of previous full cycle. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram name="V8.GC.Cycle{Priority}.Young" units="ms" expires_after="M156">
  <owner>nikolaos@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Overall duration of a {Priority} young generation garbage collection of the
    JavaScript heap. Reported at the end of the garbage collection cycle.
  </summary>
  <token key="Priority">
    <variant name="" summary="(aggregated across all priorities)"/>
    <variant name=".BestEffort" summary="best effort"/>
    <variant name=".UserBlocking" summary="user blocking"/>
    <variant name=".UserVisible" summary="user visible"/>
  </token>
</histogram>

<histogram
    name="V8.GC.Event.MainThread.Full.Finalize.{Incrementality}.{Mode}{Visibility}"
    units="ms" expires_after="M156">
  <owner>mlippautz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in the atomic pause of a {Mode} {Incrementality} full garbage
    collection for a V8 Isolate running in {Visibility}. Recorded at the end of
    the garbage collection.
  </summary>
  <token key="Incrementality">
    <variant name="Incremental" summary="incremental"/>
    <variant name="NonIncremental" summary="non-incremental"/>
  </token>
  <token key="Mode">
    <variant name="MeasureMemory" summary="memory-measuring"/>
    <variant name="ReduceMemory" summary="memory-reducing"/>
    <variant name="Regular" summary="regular"/>
  </token>
  <token key="Visibility">
    <variant name="" summary="foreground or background"/>
    <variant name=".Background" summary="background"/>
    <variant name=".Foreground" summary="foreground"/>
  </token>
</histogram>

<histogram name="V8.GC.Event.MainThread.Full.Incremental.Mark{Heap}" units="ms"
    expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Duration of individual incremental marking steps on the main thread during a
    garbage collection of the {Heap}.
  </summary>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.Event.MainThread.Full.Incremental.Sweep{Heap}"
    units="ms" expires_after="M156">
  <owner>omerkatz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Duration of individual incremental sweeping steps on the main thread during
    a garbage collection of the {Heap}.
  </summary>
  <token key="Heap">
    <variant name="" summary="unified heap"/>
    <variant name=".Cpp" summary="managed C++ heap"/>
  </token>
</histogram>

<histogram name="V8.GC.TimeToCollectionOnBackground" units="microseconds"
    expires_after="M156">
  <owner>dinfuehr@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time between requesting GC from background thread and actually starting
    collection on main thread. This is reported each time a background thread
    requests a GC.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="V8.GC.TimeToGlobalSafepoint" units="microseconds"
    expires_after="M156">
  <owner>dinfuehr@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in stopping worker isolates and other threads to reach a
    safepoint. This is reported each time a safepoint is reached.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="V8.GC.TimeToSafepoint" units="microseconds"
    expires_after="M156">
  <owner>dinfuehr@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in stopping other threads to reach a safepoint. This is reported
    each time a safepoint is reached.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="V8.GCFinalizeMC.Clear" units="ms" expires_after="2023-06-11">
  <owner>mlippautz@chromium.org</owner>
  <owner>hpayer@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in the clearing phase of incremental latency-optimized
    Mark-Compact GC.
  </summary>
</histogram>

<histogram name="V8.GCFinalizeMC.Epilogue" units="ms" expires_after="M111">
  <owner>mlippautz@chromium.org</owner>
  <owner>hpayer@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in the epilogue of incremental latency-optimized Mark-Compact GC.
  </summary>
</histogram>

<histogram name="V8.GCFinalizeMC.Finish" units="ms" expires_after="M111">
  <owner>mlippautz@chromium.org</owner>
  <owner>hpayer@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in the finish phase of incremental latency-optimized Mark-Compact
    GC.
  </summary>
</histogram>

<histogram name="V8.GCFinalizeMC.Prologue" units="ms" expires_after="M111">
  <owner>mlippautz@chromium.org</owner>
  <owner>hpayer@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    Time spent in the prologue of incremental latency-optimized Mark-Compact GC.
  </summary>
</histogram>

<histogram name="V8.GCIncrementalMarkingReason" enum="GarbageCollectionReason"
    expires_after="2028-07-01">
  <owner>mlippautz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>Reason an incremental marking was started in V8.</summary>
</histogram>

<histogram name="V8.GCIncrementalMarkingStart" units="ms" expires_after="M156">
  <owner>hpayer@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>Time spent in starting incremental marking.</summary>
</histogram>

<histogram name="V8.GCIncrementalMarkingSum" units="ms" expires_after="M156">
  <owner>mlippautz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>
    The total time spent in incremental marking steps in one GC cycle. It is
    only recorded if the time is non-zero.
  </summary>
</histogram>

<histogram name="V8.GCMarkCompactReason" enum="GarbageCollectionReason"
    expires_after="M156">
  <owner>mlippautz@chromium.org</owner>
  <owner>v8-memory-sheriffs@google.com</owner>
  <summary>Reason a mark-compact garbage collection was started in V8.</summary>
</histogram>

<histogram name="V8.JSDispatchTableEntriesCount" units="count"
    expires_after="2027-01-03">
  <owner>mlippautz@chromium.org</owner>
  <owner>olivf@chromium.org</owner>
  <summary>
    The number of in-use entries in a JSDispatchTable.

    JSFunctions reference their code through an entry in the JSDispatchTable.
    This provides fine-grained CFI for JavaScript function calls and facilitates
    tier-up and tier-down of compiled functions. This histogram records the
    number of active entries in the JSDispatchTable during garbage collection.
  </summary>
</histogram>

<histogram name="V8.LiftoffBailoutReasons" enum="LiftoffBailoutReason"
    expires_after="2027-02-14">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@chromium.org</owner>
  <summary>
    Liftoff (V8's baseline compiler for WebAssembly) bails out if it hits the
    first unsupported feature in a function. The function is recompiled with
    TurboFan then. This histogram records the bailout reason (or success) per
    WebAssembly function compilation in Liftoff.
  </summary>
</histogram>

<histogram name="V8.LocalWindowProxy.CreateContextTime" units="ms"
    expires_after="2026-06-01">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Time spent on creating a new v8 context with the window wrapper, reported
    immediately after creation.
  </summary>
</histogram>

<histogram name="V8.LocalWindowProxy.InitializeTime" units="ms"
    expires_after="2026-06-01">
  <owner>nidhijaju@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Time spent on initializing the local window wrapper, reported immediately
    after initialization. This includes creating the v8 context with the window
    wrapper and updating the document properties.
  </summary>
</histogram>

<histogram name="V8.MaglevOptimize{Phase}" units="microseconds"
    expires_after="2028-07-01">
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@chromium.org</owner>
  <summary>
    {Phase}. Recorded on each regular optimization of a function.

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
  <token key="Phase">
    <variant name="Execute"
        summary="Time spent in the execution phase of Maglev optimization"/>
    <variant name="Finalize"
        summary="Time spent in the finalization phase of Maglev optimization"/>
    <variant name="Prepare"
        summary="Time spent in the preparation phase of Maglev optimization"/>
    <variant name="TotalTime"
        summary="Total time from starting optimizing to installing the code
                 object"/>
  </token>
</histogram>

<histogram name="V8.MemoryHeapSampleTotalCommitted{V8SpecialApps}" units="KB"
    expires_after="2023-08-27">
  <owner>hpayer@chromium.org</owner>
  <summary>
    The total size of committed memory used by V8 after each GC in KB.
    {V8SpecialApps}
  </summary>
  <token key="V8SpecialApps">
    <variant name=""/>
    <variant name=".calendar" summary="Custom histogram for Calendar"/>
    <variant name=".docs" summary="Custom histogram for Google Docs and Drive"/>
    <variant name=".gmail" summary="Custom histogram for GMail"/>
    <variant name=".inbox" summary="Custom histogram for Inbox"/>
    <variant name=".plus" summary="Custom histogram for Google+"/>
    <variant name=".top10"
        summary="Custom histogram for Alexa's Top10 non-Google sites"/>
    <variant name=".youtube" summary="Custom histogram for Youtube"/>
  </token>
</histogram>

<histogram name="V8.RegExpBacktracks" units="backtracks"
    expires_after="2026-01-01">
  <owner>jgruber@chromium.org</owner>
  <owner>pthier@chromium.org</owner>
  <summary>
    The number of backtracks performed in a single regexp execution.
  </summary>
</histogram>

<histogram name="V8.SandboxedCodePointersCount" units="count"
    expires_after="2027-01-30">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    The number of in-use entries in a CodePointerTable.

    When the V8 Sandbox is enabled, code pointers are stored in a
    CodePointerTable instead of on the V8 heap to ensure that they cannot be
    manipulated by an attacker. This histogram records the number of active
    entries in the CodePointerTable during garbage collection.
  </summary>
</histogram>

<histogram name="V8.SandboxedCppHeapPointersCount" units="count"
    expires_after="2027-01-30">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    The number of in-use entries in a CppHeapPointerTable.

    When the V8 Sandbox is enabled, objects in the Cpp Heap (such as C++ DOM
    objects) that are wrapped by a V8 object are referenced through a pointer
    table indirection (via the CppHeapPointerTable) to ensure memory-safe access
    to them. This histogram records the number of active entries in the
    per-Isolate CppHeapPointerTable during garbage collection.
  </summary>
</histogram>

<histogram name="V8.SandboxedExternalPointersCount" units="count"
    expires_after="2027-01-30">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    The number of in-use external pointers in an Isolate's ExternalPointerTable.

    When the V8 Sandbox is enabled, objects located outside of the sandbox are
    referenced through a per-Isolate ExternalPointerTable to ensure memory-safe
    access to them. This histogram records the number of active external
    pointers in a single table, which is determined by counting the number of
    alive entries during garbage collection of an ExternalPointerTable.
  </summary>
</histogram>

<histogram name="V8.SandboxedTrustedPointersCount" units="count"
    expires_after="2027-01-30">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    The number of in-use entries in a TrustedPointerTable.

    When the V8 Sandbox is enabled, &quot;trusted&quot; V8 objects are
    referenced from inside the sandbox through a pointer table indirection (via
    the TrustedPointerTable) to ensure memory-safe access to them. This
    histogram records the number of active entries in the per-Isolate
    TrustedPointerTable during garbage collection.
  </summary>
</histogram>

<histogram name="V8.SandboxMode" enum="V8SandboxMode"
    expires_after="2027-01-17">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    Mode of operation of V8's sandbox.

    By default, the V8 sandbox is fully backed by a large virtual address space
    reservation, ensuring that only V8-related objects are located inside the
    sandbox. In that case, the sandbox is configured securely. However, when it
    is not possible to reserve a sufficient amount of virtual address space
    during initialization (e.g. due to memory or virtual address space
    constraints), the sandbox will instead use a fallback mode where only a part
    of the sandbox's address space is actually reserved. In that case, unrelated
    memory mappings may end up inside the sandbox though, where they could be
    corrupted by an attacker. As such, this mode is considered insecure.

    Recorded as enum value during initialization of V8.
  </summary>
</histogram>

<histogram name="V8.SandboxReservationSizeGB" units="GB"
    expires_after="2027-01-30">
  <owner>mlippautz@chromium.org</owner>
  <owner>ishell@chromium.org</owner>
  <summary>
    Size of the virtual address space reservation backing the V8 sandbox, in GB.

    This value is typically larger than the size of the sandbox as it includes
    the surrounding guard regions. However, in the case of a partially-reserved
    (i.e. insecure) sandbox, this value will be smaller than the sandbox size.

    Recorded during initialization of V8.
  </summary>
</histogram>

<histogram name="V8.SnapshotDeserialize{Part}MicroSeconds" units="microseconds"
    expires_after="2028-07-01">
  <owner>jgruber@chromium.org</owner>
  <owner>leszeks@chromium.org</owner>
  <owner>v8-runtime@google.com</owner>
  <summary>
    Time spent deserializing the {Part} snapshot.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
  <token key="Part">
    <variant name="Context" summary="context"/>
    <variant name="Isolate" summary="isolate"/>
    <variant name="RoSpace" summary="read-only"/>
  </token>
</histogram>

<histogram name="V8.TurboFanOptimizeForOnStackReplacement{Phase}"
    units="microseconds" expires_after="2028-07-01">
  <owner>dmercadier@chromium.org</owner>
  <owner>v8-runtime@chromium.org</owner>
  <summary>
    {Phase} for On Stack Replacement (OSR). Recorded on each optimization for
    on-stack replacement of a function.

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
  <token key="Phase">
    <variant name="Execute"
        summary="Time spent in the execution phase of TurboFan optimization"/>
    <variant name="Finalize"
        summary="Time spent in the finalization phase of TurboFan
                 optimization"/>
    <variant name="Prepare"
        summary="Time spent in the preparation phase of TurboFan optimization"/>
    <variant name="TotalTime"
        summary="Total time from starting optimizing to installing the code
                 object"/>
  </token>
</histogram>

<histogram name="V8.TurboFanOptimizeTotal{Thread}" units="microseconds"
    expires_after="2028-07-01">
  <owner>dmercadier@chromium.org</owner>
  <owner>v8-runtime@chromium.org</owner>
  <summary>
    Total time spent on a {Thread} thread during TurboFan optimization. Recorded
    on each regular optimization of a function.

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
  <token key="Thread">
    <variant name="Background" summary="background"/>
    <variant name="Foreground" summary="main"/>
  </token>
</histogram>

<histogram name="V8.TurboFanOptimize{Phase}" units="microseconds"
    expires_after="2028-07-01">
  <owner>dmercadier@chromium.org</owner>
  <owner>v8-runtime@chromium.org</owner>
  <summary>
    {Phase}. Recorded on each regular optimization of a function.

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
  <token key="Phase">
    <variant name="Execute"
        summary="Time spent in the execution phase of TurboFan optimization"/>
    <variant name="Finalize"
        summary="Time spent in the finalization phase of TurboFan
                 optimization"/>
    <variant name="Prepare"
        summary="Time spent in the preparation phase of TurboFan optimization"/>
    <variant name="TotalTime"
        summary="Total time from starting optimizing to installing the code
                 object"/>
  </token>
</histogram>

<histogram name="V8.UnhandledExceptionCountInMainThread" enum="BooleanOccurred"
    expires_after="2027-02-14">
  <owner>chikamune@chromium.org</owner>
  <owner>sisidovski@chromium.org</owner>
  <owner>hiroshige@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <summary>
    Report true when an unhandled exception is reported in the main thread,
    which may happen when the code has no appropriate exception handling in the
    main thread. The false value is never reported. This histogram is supposed
    to be used in A/B testing to check if unhandled exception count is different
    across experiment groups by counting the true values.
  </summary>
</histogram>

<histogram name="V8.UnhandledExceptionCountInWorker" enum="BooleanOccurred"
    expires_after="2026-12-01">
  <owner>chikamune@chromium.org</owner>
  <owner>sisidovski@chromium.org</owner>
  <owner>hiroshige@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <summary>
    Report true when an unhandled exception is reported in the worker, which may
    happen when the code has no appropriate exception handling in the worker.
    The false value is never reported. This histogram is supposed to be used in
    A/B testing to check if unhandled exception count is different across
    experiment groups by counting the true values.
  </summary>
</histogram>

<histogram name="V8.WasmCacheCount" units="count" expires_after="2027-02-21">
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Number of times a WebAssembly module being added to the browser cache. With
    dynamic tiering, caching is triggered repeatedly whenever the amount of
    generated optimized code reaches a threshold. Recorded every time a new
    version of the WebAssembly module is being added to the cache, and also when
    the module is compiled initially.
  </summary>
</histogram>

<histogram name="V8.WasmCodeCaching" enum="WasmCodeCaching"
    expires_after="2027-02-21">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The result of a Wasm code cache lookup. Recorded once per Wasm streaming
    compilation at the time where we try to get the compiled Wasm module from
    the code cache.
  </summary>
</histogram>

<histogram name="V8.WasmCompilationMethod" enum="WasmCompilationMethod"
    expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    WebAssembly JS API function that triggers compilation. Recorded when
    WebAssembly compilation gets triggered, independently of the compilation
    results, i.e. whether compilation succeeds or fails.
  </summary>
</histogram>

<histogram name="V8.WasmCompileFunctionMicroSeconds{V8WasmSeparateAsmAndWasm}"
    units="microseconds" expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to compile a WebAssembly function. Recorded on each compilation of a
    single function, either synchronous, asynchronous, or lazily.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution. {V8WasmSeparateAsmAndWasm}
  </summary>
  <token key="V8WasmSeparateAsmAndWasm" variants="V8WasmSeparateAsmAndWasm">
    <variant name=""/>
  </token>
</histogram>

<histogram name="V8.WasmCompileHugeFunctionMilliSeconds" units="ms"
    expires_after="2027-01-01">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to compile a huge WebAssembly function. A function is considered huge
    if it is larger than 100kB. Recorded on each compilation of such a function,
    either synchronous, asynchronous, or lazily.
  </summary>
</histogram>

<histogram name="V8.WasmCompileHugeFunctionPeakMemoryBytes" units="bytes"
    expires_after="2027-01-01">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Peak memory used to compile a huge WebAssembly function. A function is
    considered huge if it is larger than 100kB. Recorded for each TurboFan
    compilation of such a function.
  </summary>
</histogram>

<histogram name="V8.WasmCompileModuleAsyncMicroSeconds" units="microseconds"
    expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to asynchronously compile a WebAssembly module (using the
    'WebAssembly.compile' API). Recorded on each asynchronous WebAssembly
    compilation, but only if a high-resolution clock is available.
  </summary>
</histogram>

<histogram name="V8.WasmCompileModuleMicroSeconds{V8WasmSeparateAsmAndWasm}"
    units="microseconds" expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to compile a WebAssembly module. Recorded on each synchronous
    WebAssembly compilation.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution. {V8WasmSeparateAsmAndWasm}
  </summary>
  <token key="V8WasmSeparateAsmAndWasm" variants="V8WasmSeparateAsmAndWasm">
    <variant name=""/>
  </token>
</histogram>

<histogram name="V8.WasmCompileModuleStreamingMicroSeconds"
    units="microseconds" expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to asynchronously compile a WebAssembly module using streaming
    compilation (via the 'WebAssembly.compileStreaming' API). Recorded on each
    streaming WebAssembly compilation, but only if a high-resolution clock is
    available. Note that compilation speed is often limited by the network
    speed, which is also reflected in this metric.
  </summary>
</histogram>

<histogram name="V8.WasmDeoptsExecutedCount" units="deopts"
    expires_after="2027-01-01">
  <owner>mliedtke@chromium.org</owner>
  <owner>dlehmann@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The number of deopts executed by the wasm engine so far. As a baseline, a 0
    sample is added for each function that gets tiered-up with Turbofan if the
    function contains at least one deopt-point, meaning functions which can
    never deopt (or weren't tiered up), do not appear in this histogram at all.
    At each deopt a sample is added, so if there were 2 deopts in total, there
    will be one sample for 0 (for the initial tier-up), one for 1 and one for 2
    deopts. If an optimized function is served from cache, it does not add a new
    0 sample.
  </summary>
</histogram>

<histogram name="V8.WasmDeoptsPerFunction" units="deopts"
    expires_after="2027-01-01">
  <owner>mliedtke@chromium.org</owner>
  <owner>dlehmann@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The number of deopts executed per function (meaning each function has a
    separate counter). Similarly to V8.WasmDeoptsExecutedCount, this will add a
    sample for each deoptimization of each function.
  </summary>
</histogram>

<histogram name="V8.WasmDeserializationTimeMilliSeconds" units="ms"
    expires_after="2026-10-25">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to deserialize a WebAssembly module when the WebAssembly module is
    loaded from the cache. Recorded whenever a WebAssembly module gets
    deserialized during streaming compilation.
  </summary>
</histogram>

<histogram name="V8.WasmEngineMetadataSizeKiB" units="KB"
    expires_after="2027-02-14">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The amount of metadata in KiB used by the overall WebAssembly engine.
    Recorded after each full GC.
  </summary>
</histogram>

<histogram name="V8.WasmFinishModuleStreamingMicroSeconds" units="microseconds"
    expires_after="2027-01-31">
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to asynchronously compile or deserialize a WebAssembly module during
    streaming compilation (via the 'WebAssembly.compileStreaming' API). Recorded
    on each streaming WebAssembly compilation or deserialization from the cache,
    but only if a high-resolution clock is available. Note that compilation
    speed is often limited by the network speed, which is also reflected in this
    metric.
  </summary>
</histogram>

<histogram name="V8.WasmFunctionsPerModule{V8WasmSeparateAsmAndWasm}"
    units="functions" expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Function count per WebAssembly module. Recorded for each WebAssembly module
    which is decoded for validation, compilation, or deserialization.
    {V8WasmSeparateAsmAndWasm}
  </summary>
  <token key="V8WasmSeparateAsmAndWasm" variants="V8WasmSeparateAsmAndWasm">
    <variant name=""/>
  </token>
</histogram>

<histogram name="V8.WasmHugeFunctionSizeBytes{V8WasmSeparateAsmAndWasm}"
    units="bytes" expires_after="2027-01-01">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Size of a huge WebAssembly function in bytes. A function is considered huge
    if it is larger than 100kB. Recorded on each compilation of a single
    function, either synchronous, asynchronous, or lazily.
    {V8WasmSeparateAsmAndWasm}
  </summary>
  <token key="V8WasmSeparateAsmAndWasm" variants="V8WasmSeparateAsmAndWasm">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="V8.WasmInstantiateModuleMicroSeconds{V8WasmSeparateAsmAndWasm}"
    units="microseconds" expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to instantiate a WebAssembly module. Recorded on each instantiation of
    a WebAssembly module.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution. {V8WasmSeparateAsmAndWasm}
  </summary>
  <token key="V8WasmSeparateAsmAndWasm" variants="V8WasmSeparateAsmAndWasm">
    <variant name=""/>
  </token>
</histogram>

<histogram name="V8.WasmLazyCompileTimeMicroSeconds" units="microseconds"
    expires_after="2027-01-17">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time spend for lazily compiling WebAssembly functions. Recorded on each lazy
    compilation event (which typically compiles one function).

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
</histogram>

<histogram name="V8.WasmMemoryAllocationResult" enum="WasmAllocationResult"
    expires_after="2027-08-19">
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The result of attempts to allocate WebAssembly.Memory buffers. Recorded on
    each attempt to allocate a WebAssembly.Memory buffer.
  </summary>
</histogram>

<histogram name="V8.WasmMemoryProtectionKeysSupport" enum="BooleanSupported"
    expires_after="2027-01-31">
  <owner>clemensb@chromium.org</owner>
  <owner>jkummerow@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Whether the system supports memory protection keys in userspace (MPK / PKU /
    PKEY). This is determined once per process and recorded once per isolate
    during isolate creation (startup).

    As we use a Linux-specific API for PKUs, this value is only recorded on
    64-bit Linux machines.
  </summary>
</histogram>

<histogram name="V8.WasmModuleCodeSizeKiB" units="KB"
    expires_after="2027-01-17">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The amount of committed code space in KiB used by individual WebAssembly
    modules. Recorded for each live module after each full GC.
  </summary>
</histogram>

<histogram name="V8.WasmModuleCodeSizeMiB" units="MB"
    expires_after="2026-12-06">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The amount of committed code space in MiB used by individual WebAssembly
    modules. Recorded for each live module after each full GC.
  </summary>
</histogram>

<histogram name="V8.WasmModuleCodeSizePercentFreed" units="%"
    expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The percentage of WebAssembly code freed by garbage collection (ratio of
    total freed code to total generated code so far). Recorded for each live
    module after each full GC.
  </summary>
</histogram>

<histogram name="V8.WasmModuleMetadataSizeKiB" units="KB"
    expires_after="2027-02-07">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The amount of metadata in KiB used by individual WebAssembly modules.
    Recorded for each live module after each full GC.
  </summary>
</histogram>

<histogram name="V8.WasmModuleNumberOfCodeGCsTriggered" units="gcs"
    expires_after="2027-01-24">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Number of code GCs triggered per WebAssembly module. Recorded after each
    code GC.
  </summary>
</histogram>

<histogram name="V8.WasmModuleNumberOfCodeSpaces" units="spaces"
    expires_after="2027-01-31">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    The number of code spaces (i.e. individual reservations) of a WebAssembly
    module. Recorded on every code space allocation.
  </summary>
</histogram>

<histogram name="V8.WasmModuleSizeBytes{V8WasmSeparateAsmAndWasm}"
    units="bytes" expires_after="2027-01-10">
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Size of the wire bytes of a WebAssembly module. Recorded for each
    WebAssembly module which is decoded for validation, compilation, or
    deserialization. {V8WasmSeparateAsmAndWasm}
  </summary>
  <token key="V8WasmSeparateAsmAndWasm" variants="V8WasmSeparateAsmAndWasm">
    <variant name=""/>
  </token>
</histogram>

<histogram name="V8.WasmModulesPerEngine" units="count"
    expires_after="2027-01-31">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Number of WebAssembly native modules live in a Wasm engine (typically per
    process). Recorded whenever a new native module is created.
  </summary>
</histogram>

<histogram name="V8.WasmModulesPerIsolate" units="count"
    expires_after="2027-01-31">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Number of WebAssembly native modules live in an isolate. Recorded whenever a
    new native module is created.
  </summary>
</histogram>

<histogram name="V8.WasmSerializationTimeMilliSeconds" units="ms"
    expires_after="2027-02-21">
  <owner>clemensb@chromium.org</owner>
  <owner>ecmziegler@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to serialize a WebAssembly module for storing it in the cache. Recorded
    on each serialization, which happens after top-tier compilation finished, or
    when a new chunk of functions was compiled (with dynamic tiering).
  </summary>
</histogram>

<histogram name="V8.WasmStreamingInputType" enum="WasmStreamingInputType"
    expires_after="2027-02-21">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Classification of the argument to the streaming WebAssembly APIs
    (WebAssembly.compileStreaming and WebAssembly.instantiateStreaming).
    Recorded on each invocation of this API.
  </summary>
</histogram>

<histogram name="V8.WasmTierUpModuleMicroSeconds" units="microseconds"
    expires_after="2023-06-04">
  <owner>ecmziegler@chromium.org</owner>
  <owner>clemensb@chromium.org</owner>
  <owner>wasm-runtime@google.com</owner>
  <summary>
    Time to tier-up a WebAssembly module, i.e. the time between baseline
    compilation finishes and top-tier compilation finishes. Recorded whenever an
    asynchronously compiled module finishes top-tier compilation, but only if a
    high-resolution clock is available.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
