{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Report",
"description": "Full report data model: only bounded aggregates, never a per-object Vec.",
"type": "object",
"properties": {
"alloc_sites": {
"anyOf": [
{
"$ref": "#/$defs/AllocSites"
},
{
"type": "null"
}
]
},
"analysis_flags": {
"description": "Which opt-in analysis passes were enabled. Additive; defaults to all-false\nfor round-trip with older JSON (which lacks the field).",
"$ref": "#/$defs/AnalysisFlags",
"default": {
"collections": false,
"find_duplicates": false,
"obj_graph": false,
"ref_paths": false
}
},
"arrays_by_size": {
"description": "Power-of-two array-length histogram (object vs primitive arrays).\nAlways-on; additive, defaults to empty for round-trip with older JSON.",
"$ref": "#/$defs/ArraysBySize",
"default": {
"obj_array_buckets": [],
"prim_array_buckets": [],
"zero_length_count": 0
}
},
"biggest_collections": {
"description": "Largest individual collection instances. Additive.",
"anyOf": [
{
"$ref": "#/$defs/BiggestCollections"
},
{
"type": "null"
}
]
},
"collection_attribution": {
"description": "Container attribution by holder `Class#field`, present only when\n`--collections` was passed; `None` otherwise. Additive; not parity-compared.",
"anyOf": [
{
"$ref": "#/$defs/CollectionAttribution"
},
{
"type": "null"
}
]
},
"collection_contents": {
"description": "Global per-collection-class value-type breakdown. Additive.",
"anyOf": [
{
"$ref": "#/$defs/CollectionContents"
},
{
"type": "null"
}
]
},
"collections": {
"description": "Field-decode collection & array analysis (fill ratios, size histogram,\nmap collisions, constant primitive arrays). Always-on; additive,\ndefaults to empty for round-trip with older JSON.",
"$ref": "#/$defs/CollectionsAnalysis",
"default": {
"array_fill_ratio": {
"buckets": [],
"tracked": 0
},
"collection_fill_ratio": {
"buckets": [],
"total": 0,
"tracked": 0
},
"collections_by_size": {
"buckets": [],
"empty_count": 0,
"tracked": 0
},
"constant_primitive_arrays": {
"rows": [],
"truncated": false
},
"kind_summary": {
"kinds": []
},
"map_collision_ratio": {
"buckets": [],
"total": 0,
"tracked": 0
},
"top_obj_arrays": {
"top_by_class": [],
"top_individual": []
},
"top_prim_arrays": {
"top_by_class": [],
"top_individual": []
}
}
},
"dominator_analysis": {
"description": "Dominator-tree analysis: Big Drops + Immediate Dominators. Always-on;\nadditive, defaults to empty for round-trip with older JSON.",
"$ref": "#/$defs/DominatorAnalysis",
"default": {
"big_drops": {
"rows": [],
"threshold": 0
},
"immediate_dominators": {
"rows": []
},
"longest_chain_depth": 0
}
},
"field_stats": {
"description": "Per-class reference-field statistics (null/non-null counts, total retained\nof pointees). Present only when `--field-stats` was passed; `None` otherwise.",
"anyOf": [
{
"$ref": "#/$defs/FieldStats"
},
{
"type": "null"
}
]
},
"fields_by_size": {
"description": "Holder `Class#field` ranked by total retained size of their pointees,\npresent only when `--collections` was passed; `None` otherwise. Additive.",
"anyOf": [
{
"$ref": "#/$defs/FieldsBySize"
},
{
"type": "null"
}
]
},
"framework_analysis": {
"description": "Detected framework aggregate analyses. Empty when no framework classes present.\nAlways-on; each entry is only emitted when its sentinel class is in the heap.\n`#[serde(default)]` keeps older JSON loadable.",
"type": "array",
"items": {
"$ref": "#/$defs/FrameworkAnalysis"
}
},
"generated": {
"type": "string"
},
"leak_indicators": {
"description": "Always-computed scalar leak indicators. Additive; defaults to zero for\nround-trip with older JSON.",
"$ref": "#/$defs/LeakIndicators",
"default": {
"anonymous_class_count": 0,
"direct_byte_buffer_capacity_sum": 0,
"thread_local_null_key_count": 0
}
},
"leaks": {
"$ref": "#/$defs/LeakSuspects"
},
"obj_graph_flat": {
"description": "Flat object graph for V3/V4 navigation. None when --obj-graph not used.",
"anyOf": [
{
"$ref": "#/$defs/ObjGraphFlat"
},
{
"type": "null"
}
]
},
"overview": {
"$ref": "#/$defs/SystemOverview"
},
"queries": {
"description": "Custom OQL query results (empty unless --query/--query-file was given).",
"type": "array",
"items": {
"$ref": "#/$defs/QueryResult"
}
},
"references": {
"description": "Soft/weak/phantom reference statistics. Always-on; additive, defaults to\nempty for round-trip with older JSON.",
"$ref": "#/$defs/ReferencesAnalysis",
"default": {
"phantom": null,
"soft": null,
"weak": null
}
},
"schema_version": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"thread_local_analysis": {
"description": "ThreadLocal Leak Analyzer: per-value-class breakdown of\n`ThreadLocalMap$Entry` objects — entry counts, stale counts (null key),\nand total retained heap. Populated only when `--find-duplicates` (or\n`--full-analysis`) is passed; empty otherwise. Additive; not\nparity-compared. `#[serde(default)]` keeps older JSON loadable.",
"type": "array",
"items": {
"$ref": "#/$defs/ThreadLocalLeakRow"
}
},
"threads": {
"$ref": "#/$defs/ThreadOverview"
},
"top": {
"$ref": "#/$defs/TopConsumers"
},
"top_components": {
"description": "Eclipse-MAT-style retained-heap-by-class-loader components. Additive;\ndefaults to empty for round-trip with older JSON.",
"$ref": "#/$defs/TopComponents",
"default": {
"components": []
}
},
"top_retainers": {
"description": "Merged top-retainers: `Class#field` holders + `Class#method()` stack\nframes, sorted by total retained descending, capped at 20.",
"type": "array",
"items": {
"$ref": "#/$defs/RetainerRow"
}
},
"triage": {
"description": "Fired OOM-triage signals, evaluated once over the finished report by the\nrule framework in `triage.rs`. Order is the registry order (render order).\n`#[serde(default)]` keeps pre-v4 JSON (which lacks the field) loadable.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/TriageSignal"
}
},
"truncated_input": {
"description": "True when the input dump was truncated (gzip stream ended prematurely).\nThe report covers only the records that were decompressed before truncation.",
"type": "boolean"
},
"type_ref_graph": {
"description": "Type-level reference graph (TPFG). Present when --obj-graph is used.",
"type": "array",
"items": {
"$ref": "#/$defs/TypeEdge"
}
},
"waste_summary": {
"description": "One headline \"reclaimable N bytes\" figure folding every quantifiable\nwaste source. Present only when at least one source is nonzero. Additive;\n`#[serde(default)]` keeps older JSON (which lacks the field) loadable.",
"anyOf": [
{
"$ref": "#/$defs/WasteSummary"
},
{
"type": "null"
}
]
}
},
"required": [
"schema_version",
"generated",
"overview",
"leaks",
"top",
"threads"
],
"$defs": {
"AllocSite": {
"description": "One allocation site: a distinct HPROF stack-trace serial, its resolved frame\nlines, and the aggregate footprint of the objects allocated there.",
"type": "object",
"properties": {
"frames": {
"type": "array",
"items": {
"type": "string"
}
},
"object_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained_total": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow_total": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"stack_serial": {
"type": "integer",
"format": "uint32",
"minimum": 0
}
},
"required": [
"stack_serial",
"frames",
"object_count",
"shallow_total",
"retained_total"
]
},
"AllocSites": {
"description": "Aggregate allocation-site view. `traces_present` is `false` (with an empty\n`sites`) when the dump carries no allocation stack-trace info (HotSpot\nwrites serial 0 when allocation tracking is off) — reported honestly rather\nthan faked.",
"type": "object",
"properties": {
"sites": {
"type": "array",
"items": {
"$ref": "#/$defs/AllocSite"
}
},
"traces_present": {
"type": "boolean"
}
},
"required": [
"traces_present",
"sites"
]
},
"AnalysisFlags": {
"description": "Which opt-in analysis passes were enabled when the report was generated.\nUsed by the viewer to show context-appropriate \"not run\" messages.",
"type": "object",
"properties": {
"collections": {
"description": "`--collections` was passed (fill-ratio & waste analysis).",
"type": "boolean",
"default": false
},
"find_duplicates": {
"description": "`--find-duplicates` was passed (duplicate string/array analysis).",
"type": "boolean",
"default": false
},
"obj_graph": {
"description": "`--obj-graph` (or `--full-analysis`) was passed (reference/dominator graph capture).",
"type": "boolean",
"default": false
},
"ref_paths": {
"description": "`--ref-paths` was passed (field-name labels on edges).",
"type": "boolean",
"default": false
}
}
},
"ArrayFillRatio": {
"description": "Fill ratio of raw object arrays (non-null slots / length). Additive.",
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/FillRatioBucket"
}
},
"tracked": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"tracked",
"buckets"
]
},
"ArraysBySize": {
"description": "Array-length histogram, split by object-arrays vs primitive-arrays, bucketed\nby power-of-two element length. Always-on; derived from data already in\nmemory (no extra heap scan). Zero-length arrays are tallied separately.",
"type": "object",
"properties": {
"obj_array_buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/SizeHistogramBucket"
}
},
"prim_array_buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/SizeHistogramBucket"
}
},
"zero_length_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"obj_array_buckets",
"prim_array_buckets",
"zero_length_count"
]
},
"BigDropRow": {
"description": "One \"big drop\" in the dominator tree: a dominator whose retained heap is\nmuch larger than any single child's, i.e. retention concentrates AT this\nnode rather than flowing to one dominated child. A large drop marks a good\nplace to start a leak investigation. Additive; not parity-compared.",
"type": "object",
"properties": {
"child_count": {
"description": "Number of dominator-tree children of this node.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"display_class": {
"type": "string"
},
"drop_bytes": {
"description": "retained - largest_child_retained: the heap that \"drops\" here.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"largest_child_class": {
"description": "display class of the largest child (empty if none).",
"type": "string"
},
"largest_child_retained": {
"description": "Retained heap of the single largest child (0 if no children).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"obj_index_1based": {
"description": "1-based object index of the dominator node.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained": {
"description": "Retained heap of the dominator node.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"obj_index_1based",
"display_class",
"retained",
"child_count",
"largest_child_retained",
"largest_child_class",
"drop_bytes"
]
},
"BigDrops": {
"description": "The \"Big Drops\" view: dominators where retained heap concentrates.",
"type": "object",
"properties": {
"rows": {
"description": "Qualifying drops, sorted by drop_bytes descending, capped.",
"type": "array",
"items": {
"$ref": "#/$defs/BigDropRow"
}
},
"threshold": {
"description": "The retained-heap threshold (bytes) a dominator had to exceed to qualify.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"threshold",
"rows"
]
},
"BiggestCollectionRow": {
"description": "One individual collection instance in the \"biggest collections\" listing.\nBasics (kind/container_class/elements) are always present; the remaining\nfields are filled only under `--collections`. Additive.",
"type": "object",
"properties": {
"container_class": {
"type": "string"
},
"dominant_value_type": {
"type": [
"string",
"null"
]
},
"elements": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"kind": {
"type": "string"
},
"obj_index_1based": {
"description": "1-based dense object index for Object Graph Explorer navigation.",
"type": [
"integer",
"null"
],
"format": "uint32",
"minimum": 0
},
"owner": {
"type": [
"string",
"null"
]
},
"retained": {
"type": [
"integer",
"null"
],
"format": "uint64",
"minimum": 0
},
"value_type_breakdown": {
"description": "Top element/value runtime types by count (Level 2). Empty when\n`--collections` was off or no element types were tallied.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/ValueTypeShare"
}
}
},
"required": [
"kind",
"container_class",
"elements"
]
},
"BiggestCollections": {
"description": "The largest individual collection instances: a combined ranking plus a\nper-kind breakdown. Present whenever collections were classified (basics\nalways; extra columns only under `--collections`). Additive.",
"type": "object",
"properties": {
"by_kind": {
"type": "array",
"items": {
"$ref": "#/$defs/CollectionKindTable"
}
},
"combined": {
"type": "array",
"items": {
"$ref": "#/$defs/BiggestCollectionRow"
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"combined",
"by_kind",
"truncated"
]
},
"BoxedNumberHolder": {
"description": "One holder-class row for the \"who holds the most boxed-number references\" ranking.\nOnly populated when `--collections` is also enabled (FieldPlan available).",
"type": "object",
"properties": {
"boxed_refs": {
"description": "Number of object-reference fields pointing at boxed-number instances across all\nlive instances of this class.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"class_name": {
"description": "Fully-qualified class name whose instances hold the most references to boxed\nprimitive types (Integer, Long, Double, etc.).",
"type": "string"
}
},
"required": [
"class_name",
"boxed_refs"
]
},
"BoxedNumberRow": {
"description": "One boxed-number class row (java.lang.Integer, Long, etc.) surfaced in the\nBoxed Numbers section. Data derived from the histogram at report-build time.",
"type": "object",
"properties": {
"avg_shallow": {
"description": "Average shallow bytes per instance (total_shallow / instances).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pct_of_heap_bp": {
"description": "Share of total reachable shallow heap, in integer basis points (100 bp = 1%).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"pretty_class": {
"type": "string"
},
"total_shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"instances",
"total_shallow",
"pct_of_heap_bp",
"avg_shallow"
]
},
"CaptureParams": {
"description": "Parameters used when capturing the object graph snapshot.",
"type": "object",
"properties": {
"edge_cap": {
"description": "Max edges per object (outbound and inbound).",
"type": "integer",
"format": "uint",
"minimum": 0
},
"size_tier": {
"description": "Human-readable tier name: \"small\", \"medium\", or \"large\".",
"type": "string"
}
},
"required": [
"edge_cap",
"size_tier"
]
},
"CharArrayWaste": {
"description": "Waste in char[]/byte[] arrays backing Strings. `top` sorted by\nwasted_bytes desc, capped. Additive.",
"type": "object",
"properties": {
"arrays_examined": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"top": {
"type": "array",
"items": {
"$ref": "#/$defs/CharArrayWasteRow"
}
},
"total_wasted_bytes": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"wasteful_arrays": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"arrays_examined",
"wasteful_arrays",
"total_wasted_bytes",
"top"
]
},
"CharArrayWasteRow": {
"description": "One wasteful char[] backing a String (String uses fewer bytes than the\narray length). Additive.",
"type": "object",
"properties": {
"array_obj_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"length": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"used": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"wasted_bytes": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"array_obj_1based",
"length",
"used",
"wasted_bytes"
]
},
"ClassFieldStats": {
"description": "Per-class aggregation of reference-field statistics for a single class.",
"type": "object",
"properties": {
"class_name": {
"type": "string"
},
"instance_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"ref_fields": {
"type": "array",
"items": {
"$ref": "#/$defs/FieldRefStat"
}
}
},
"required": [
"class_name",
"instance_count",
"ref_fields"
]
},
"ClassRow": {
"description": "One row of \"Biggest Classes\".",
"type": "object",
"properties": {
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pretty_class": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"instances",
"retained"
]
},
"CollectionAttribution": {
"description": "Container attribution by holder `Class#field`, present only when `--collections` was passed.",
"type": "object",
"properties": {
"biggest_single": {
"type": "array",
"items": {
"$ref": "#/$defs/FieldAttributionBiggestRow"
}
},
"most_overall": {
"type": "array",
"items": {
"$ref": "#/$defs/FieldAttributionRow"
}
},
"tiny_overhead": {
"description": "Class#field pairs owning the most size-{0,1} collections,\nranked by wrapper-overhead bytes.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/TinyCollectionRow"
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"most_overall",
"biggest_single",
"truncated"
]
},
"CollectionContents": {
"description": "Global \"what's in your collections\" breakdown, one row per collection class.\nPresent only under `--collections`. Additive.",
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"$ref": "#/$defs/CollectionContentsRow"
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"rows",
"truncated"
]
},
"CollectionContentsRow": {
"description": "One collection *class* (e.g. `java.util.HashMap`) aggregated across all its\ninstances: instance count, total element/value slots, and the top runtime\nelement/value types globally. Additive.",
"type": "object",
"properties": {
"collection_class": {
"type": "string"
},
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"top_value_types": {
"type": "array",
"items": {
"$ref": "#/$defs/ValueTypeShare"
}
},
"total_values": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"collection_class",
"instances",
"total_values",
"top_value_types"
]
},
"CollectionFillRatio": {
"description": "How full collections are (size vs backing-array capacity). `tracked` =\ncollections actually sampled; `total` = all collections seen (tracked <=\ntotal when a cap was hit). Additive.",
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/FillRatioBucket"
}
},
"total": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"tracked": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"tracked",
"total",
"buckets"
]
},
"CollectionKindStat": {
"description": "One collection-kind's aggregate stats. Additive.",
"type": "object",
"properties": {
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"kind": {
"type": "string"
},
"max_elements": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_elements": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"kind",
"count",
"total_elements",
"total_shallow",
"max_elements"
]
},
"CollectionKindSummary": {
"description": "Per-kind rollup over all classified collections. Additive.",
"type": "object",
"properties": {
"kinds": {
"type": "array",
"items": {
"$ref": "#/$defs/CollectionKindStat"
}
}
},
"required": [
"kinds"
]
},
"CollectionKindTable": {
"description": "Biggest collections of one kind (e.g. all Maps), ranked. Additive.",
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"rows": {
"type": "array",
"items": {
"$ref": "#/$defs/BiggestCollectionRow"
}
}
},
"required": [
"kind",
"rows"
]
},
"CollectionsAnalysis": {
"description": "Groups the five collection/array views. Additive.",
"type": "object",
"properties": {
"array_fill_ratio": {
"$ref": "#/$defs/ArrayFillRatio",
"default": {
"buckets": [],
"tracked": 0
}
},
"collection_fill_ratio": {
"$ref": "#/$defs/CollectionFillRatio",
"default": {
"buckets": [],
"total": 0,
"tracked": 0
}
},
"collections_by_size": {
"$ref": "#/$defs/CollectionsBySize",
"default": {
"buckets": [],
"empty_count": 0,
"tracked": 0
}
},
"constant_primitive_arrays": {
"$ref": "#/$defs/ConstantPrimitiveArrays",
"default": {
"rows": [],
"truncated": false
}
},
"kind_summary": {
"$ref": "#/$defs/CollectionKindSummary",
"default": {
"kinds": []
}
},
"map_collision_ratio": {
"$ref": "#/$defs/MapCollisionRatio",
"default": {
"buckets": [],
"total": 0,
"tracked": 0
}
},
"top_obj_arrays": {
"$ref": "#/$defs/TopArrays",
"default": {
"top_by_class": [],
"top_individual": []
}
},
"top_prim_arrays": {
"$ref": "#/$defs/TopArrays",
"default": {
"top_by_class": [],
"top_individual": []
}
}
}
},
"CollectionsBySize": {
"description": "Histogram of collection element counts (reuses SizeHistogramBucket).\n`empty_count` = collections with size 0. Additive.",
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/SizeHistogramBucket"
}
},
"empty_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"tracked": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"tracked",
"empty_count",
"buckets"
]
},
"Component": {
"description": "One component (class loader) in the Top Components view.",
"type": "object",
"properties": {
"loader_label": {
"description": "Human-readable loader/component label (e.g. `<system class loader>`).",
"type": "string"
},
"pct": {
"description": "Retained heap as a percentage of total reachable retained heap.",
"type": "number",
"format": "double"
},
"retained": {
"description": "Total retained heap attributed to this component.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"top_classes": {
"description": "Top classes within this component by retained heap (capped).",
"type": "array",
"items": {
"$ref": "#/$defs/ComponentClass"
}
}
},
"required": [
"loader_label",
"retained",
"pct",
"top_classes"
]
},
"ComponentClass": {
"description": "One class row inside a component.",
"type": "object",
"properties": {
"pretty_class": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"retained"
]
},
"ConstantArrayRow": {
"description": "One group of primitive arrays that all hold a single repeated value.\nAdditive.",
"type": "object",
"properties": {
"array_class": {
"type": "string"
},
"length": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"owner": {
"description": "Dominant incoming reference (`Class#field`) across the group's member\narrays. `None` when `--collections` was off or no field holds them.",
"type": [
"string",
"null"
],
"default": null
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"value": {
"type": "integer",
"format": "int64"
}
},
"required": [
"array_class",
"length",
"value",
"objects",
"shallow"
]
},
"ConstantPrimitiveArrays": {
"description": "Primitive arrays whose every element is the same constant. `truncated` =\ntrue when the distinct-group cap was hit and remaining groups were folded\ninto one \"other\" row. Additive.",
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"$ref": "#/$defs/ConstantArrayRow"
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"rows",
"truncated"
]
},
"DepthBucket": {
"description": "One bucket of the dominator-depth histogram (B2): how many reachable objects\nsit exactly `depth` idom-hops below the virtual root.",
"type": "object",
"properties": {
"depth": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"depth",
"objects"
]
},
"DomTreeNode": {
"description": "One node of the FULL multi-level dominator subtree rooted at an accumulation\npoint. Children are the nodes immediately dominated by\nthis one, sorted retained-desc (tie: obj index asc), bounded by the\n`--detail` max-nodes / max-depth caps.",
"type": "object",
"properties": {
"children": {
"type": "array",
"items": {
"$ref": "#/$defs/DomTreeNode"
}
},
"display_class": {
"type": "string"
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"obj_index_1based",
"display_class",
"shallow",
"retained",
"children"
]
},
"DominatedRow": {
"description": "One immediately-dominated child of an accumulation point (a row of the\n\"Accumulated Objects in Dominator Tree\" list).",
"type": "object",
"properties": {
"display_class": {
"type": "string"
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"obj_index_1based",
"display_class",
"shallow",
"retained"
]
},
"DominatorAnalysis": {
"description": "Always-on dominator-tree analysis grouping Big Drops (#1) and Immediate\nDominators (#2), mirroring Eclipse MAT's dominator views. Additive.",
"type": "object",
"properties": {
"big_drops": {
"$ref": "#/$defs/BigDrops"
},
"immediate_dominators": {
"$ref": "#/$defs/ImmediateDominators"
},
"longest_chain_depth": {
"description": "Longest path in the dominator tree (number of idom-hops from the virtual\nroot to the deepest node). A value > 10,000 indicates a linked-list-shaped\ndata structure. 0 for an empty heap. V25.",
"type": "integer",
"format": "uint32",
"default": 0,
"minimum": 0
}
},
"required": [
"big_drops",
"immediate_dominators"
]
},
"DupArrayHolder": {
"description": "One holder-class row for the \"who holds the most duplicate arrays\" ranking.\nOnly populated when `--collections` is also enabled (FieldPlan available).",
"type": "object",
"properties": {
"array_refs": {
"description": "Number of object-reference fields pointing at duplicate arrays across all\ninstances of this class.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"class_name": {
"description": "Fully-qualified class name whose instances hold the most references to\nduplicate primitive arrays.",
"type": "string"
}
},
"required": [
"class_name",
"array_refs"
]
},
"DupPrimArrayRow": {
"description": "One element-type row in the duplicate-primitive-array breakdown.",
"type": "object",
"properties": {
"array_class": {
"description": "Element type class name, e.g. `\"byte[]\"`, `\"int[]\"`, `\"long[]\"`.",
"type": "string"
},
"duplicated_groups": {
"description": "Number of distinct content groups that have at least one duplicate.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"wasted_bytes": {
"description": "Total wasted bytes for this element type:\nΣ over duplicated groups of `(count - 1) * shallow`.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"array_class",
"duplicated_groups",
"wasted_bytes"
]
},
"DupPrimArrays": {
"description": "Approximate duplicate-primitive-array analysis. Top-N per-type breakdown\nsorted by wasted bytes descending.",
"type": "object",
"properties": {
"rows": {
"description": "Per-element-type breakdown, sorted by wasted_bytes descending, capped.",
"type": "array",
"items": {
"$ref": "#/$defs/DupPrimArrayRow"
}
},
"top_array_holders": {
"description": "Top-N classes whose instances hold the most references to duplicate arrays.\nPopulated only when `--collections` is also on (requires a FieldPlan scan).",
"type": "array",
"items": {
"$ref": "#/$defs/DupArrayHolder"
}
},
"total_wasted_bytes": {
"description": "Total wasted bytes across all element types.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"total_wasted_bytes",
"rows"
]
},
"DupStringSample": {
"description": "One of the most-duplicated String values: its exact text (truncated to\n`MAX_STR_SAMPLE` bytes), how many String instances share the value, the\ndecoded byte length of the value, and the approximate wasted bytes.",
"type": "object",
"properties": {
"count": {
"description": "Number of String instances sharing this value.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"len": {
"description": "Decoded byte length of the value (pre-truncation).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"text": {
"description": "Exact decoded text, truncated to at most `MAX_STR_SAMPLE` bytes on a char boundary.",
"type": "string"
},
"wasted_bytes": {
"description": "Approx wasted bytes for this value: (count - 1) * len.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"text",
"count",
"len",
"wasted_bytes"
]
},
"DupStrings": {
"description": "Approximate duplicate-`java.lang.String` analysis. Each String value is\ndecoded, hashed to a 64-bit value, and only the hash + length + occurrence\ncount is retained — the decoded bytes are dropped immediately, so RSS stays\nbounded regardless of dump size. Hash collisions merge distinct values (an\naccepted approximation). The unit of dedup is the String INSTANCE: two\nString instances with the same decoded value count as a duplicate even\nthough they usually hold separate backing arrays. Opt-in via `--find-duplicates`.",
"type": "object",
"properties": {
"approx_wasted_bytes": {
"description": "Approx bytes wasted by duplication: Σ over duplicated values of (count-1)*first_seen_len.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"char_array_waste": {
"description": "Wasted space in char[]/byte[] arrays backing Strings. `None` unless\n`--find-duplicates` computed it.",
"anyOf": [
{
"$ref": "#/$defs/CharArrayWaste"
},
{
"type": "null"
}
],
"default": null
},
"distinct_values": {
"description": "Distinct decoded String values (by 64-bit hash; collisions merge — accepted approximation).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"duplicated_values": {
"description": "Distinct values that occur in more than one String instance.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"length_histogram": {
"description": "Power-of-two histogram of decoded String lengths (bytes), one entry per\ndistinct value. Sorted by `upper_len` ascending.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/StrLenBucket"
}
},
"length_stats": {
"description": "Summary stats over distinct-value lengths (bytes).",
"$ref": "#/$defs/StrLenStats",
"default": {
"max": 0,
"median": 0,
"min": 0,
"total": 0
}
},
"top_by_length": {
"description": "Top-N longest distinct String values by decoded byte length, sorted by\nlen desc then text asc. Only populated with `--find-duplicates`.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/DupStringSample"
}
},
"top_duplicated": {
"description": "Top-N most-duplicated String values with exact (truncated) text, sorted by\noccurrence count desc then text asc. Only values with count > 1.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/DupStringSample"
}
},
"top_string_holders": {
"description": "Top-N owning classes by the number of `java.lang.String` instances their\ninstances reference. Sorted by `string_refs` desc then class name asc.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/StringHolder"
}
},
"total_string_instances": {
"description": "Total java.lang.String instances scanned.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"distinct_values",
"duplicated_values",
"total_string_instances",
"approx_wasted_bytes"
]
},
"DuplicateClass": {
"description": "F2: a class name loaded under more than one class loader — a classic\nclass-loader-leak signature (the same class re-loaded per web-app reload,\nper plugin, etc.). Grouped by `pretty_class`; `loaders` is capped.",
"type": "object",
"properties": {
"loader_count": {
"description": "Number of DISTINCT loader ids this class name appears under (>= 2).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loaders": {
"description": "Loader labels (capped) that loaded this class name, for display.",
"type": "array",
"items": {
"type": "string"
}
},
"per_loader": {
"description": "Per-loader breakdown of this duplicated class (capped at the same\nLOADER_CAP as `loaders`), sorted by retained descending. Additive;\n`#[serde(default)]` so older JSON still deserializes.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/DuplicateClassLoaderRow"
}
},
"pretty_class": {
"type": "string"
},
"total_instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"loader_count",
"loaders",
"total_instances",
"total_retained"
]
},
"DuplicateClassLoaderRow": {
"description": "One class-loader's contribution to a duplicated class name (see\n[`DuplicateClass`]). Additive; not parity-compared.",
"type": "object",
"properties": {
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loader_id": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loader_label": {
"description": "Display label for this loader (e.g. `<boot>` or an app loader), or the\nsynthesized `loader@0x…` fallback when no label was resolved.",
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"loader_label",
"loader_id",
"instances",
"shallow",
"retained"
]
},
"FieldAttributionBiggestRow": {
"description": "One holder `Class#field` whose single largest container is ranked by element count.",
"type": "object",
"properties": {
"capacity": {
"description": "Backing-array length (slots) of the single largest container:\n`elements` = used, `capacity` = slots. Real for arrays; for classified\ncollections this equals `elements` (degenerate — see the field-decode\nnote; the backing array's true length is not cheaply joinable). Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"container_class": {
"type": "string"
},
"container_kind": {
"description": "Kind of the single largest container (same labels as `FieldAttributionRow::container_kind`).",
"type": "string",
"default": ""
},
"elements": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"field": {
"type": "string"
},
"holder_class": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"holder_class",
"field",
"container_class",
"elements",
"retained"
]
},
"FieldAttributionRow": {
"description": "One holder `Class#field` ranked by total elements across every container it points at.",
"type": "object",
"properties": {
"container_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"container_kind": {
"type": "string"
},
"field": {
"type": "string"
},
"holder_class": {
"type": "string"
},
"holder_instances": {
"description": "Live-instance count of `holder_class` from the System-Overview class\nhistogram (matched by prettified class name), or `0` when the holder\nclass has no histogram row. Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"total_elements": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_wasted_bytes": {
"description": "`total_wasted_slots × object-reference width (bytes)` — the actual bytes\nof backing-array capacity that is null/unused. More directly comparable\nthan slot count when array types differ. Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"total_wasted_slots": {
"description": "Sum of (capacity - elements) across all distinct containers reached by\nthis field. Counts empty slots, not bytes. Zero for classified\ncollections (their capacity is not cheaply available). Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
}
},
"required": [
"holder_class",
"field",
"container_kind",
"total_elements",
"total_retained",
"container_count"
]
},
"FieldBySizeRow": {
"description": "One holder `Class#field` (with declared field type) ranked by the total\nretained size of everything the field points at, summed over all live\nholder instances. Additive.",
"type": "object",
"properties": {
"category": {
"description": "Pointee category: `\"collection\"`, `\"array\"`, or `\"object\"`, derived from\nthe dominant runtime pointee type. Additive.",
"type": "string",
"default": ""
},
"elements": {
"description": "Total element count over container pointees of this field (`0` for\nnon-container fields). Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"field": {
"description": "Field name.",
"type": "string"
},
"holder_class": {
"description": "Pretty holder class name.",
"type": "string"
},
"holder_instances": {
"description": "Live-instance count of `holder_class` from the class histogram, or `0`.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pointee_type": {
"description": "Runtime class of what the field points at (dominant type by retained\nsize). HPROF does not record declared reference-field types, so this is\nthe concrete pointee class; `varies` when the field points at multiple\ntypes and no single one dominates.",
"type": "string"
},
"pointees": {
"description": "Number of distinct pointees (non-null field slots) for this field.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_retained": {
"description": "Sum of retained size over distinct pointees of this `Class#field`.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"holder_class",
"field",
"pointee_type",
"total_retained",
"pointees",
"holder_instances"
]
},
"FieldRefStat": {
"description": "Per-class reference-field statistics: null/non-null ref counts and total\nretained size of pointees. Populated only when `--field-stats` is passed.",
"type": "object",
"properties": {
"field_name": {
"type": "string"
},
"non_null_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"null_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_retained": {
"description": "Sum of retained[] for all non-null pointees.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"field_name",
"null_count",
"non_null_count",
"total_retained"
]
},
"FieldStats": {
"description": "Collection of per-class reference-field stats, present only when\n`--field-stats` was passed.",
"type": "object",
"properties": {
"classes": {
"type": "array",
"items": {
"$ref": "#/$defs/ClassFieldStats"
}
}
},
"required": [
"classes"
]
},
"FieldsBySize": {
"description": "`Class#field` holders ranked by total retained size of their pointees.\nPresent only when `--collections` was passed. Additive.",
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"$ref": "#/$defs/FieldBySizeRow"
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"rows",
"truncated"
]
},
"FillRatioBucket": {
"description": "One bucket of a fill-ratio (used/capacity) histogram. Ratio expressed in\nbasis points (0..=10000). Additive.",
"type": "object",
"properties": {
"lower_ratio_bp": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"upper_ratio_bp": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"wasted": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"lower_ratio_bp",
"upper_ratio_bp",
"objects",
"shallow",
"wasted"
]
},
"FrameworkAnalysis": {
"description": "One detected framework's aggregate statistics.",
"type": "object",
"properties": {
"framework": {
"description": "Human-readable framework name (e.g. \"Hibernate\", \"Spring\").",
"type": "string"
},
"instance_count": {
"description": "Count of live instances of the sentinel class (or subclasses).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"total_retained": {
"description": "Total retained heap across all sentinel class instances, in bytes.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"framework",
"instance_count",
"total_retained"
]
},
"GcRootClassRow": {
"description": "One class entry within a GC-root-retained-by-type row.",
"type": "object",
"properties": {
"class_name": {
"type": "string"
},
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"class_name",
"count",
"retained"
]
},
"GcRootRetainedRow": {
"description": "One row of the GC-root-retained-by-type table.",
"type": "object",
"properties": {
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"root_type": {
"type": "string"
},
"top_classes": {
"description": "Top-5 retained classes for this root type (class name, count, retained bytes).",
"type": "array",
"items": {
"$ref": "#/$defs/GcRootClassRow"
}
}
},
"required": [
"root_type",
"count",
"retained"
]
},
"GcRootTypeRow": {
"description": "One row of the GC-roots-by-type breakdown: a human-readable root-type label\nand how many roots carry that HPROF type.",
"type": "object",
"properties": {
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"root_type": {
"type": "string"
}
},
"required": [
"root_type",
"count"
]
},
"HeaderOverheadRow": {
"description": "One row of the Object Header Overhead breakdown: classes where object headers\n(12 or 16 bytes each, depending on compressed OOPs) are a significant fraction\nof the class's total shallow heap. Data derived from the histogram.",
"type": "object",
"properties": {
"avg_shallow": {
"description": "Average shallow bytes per instance (class's total shallow / instances).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"header_bytes": {
"description": "Object header size in bytes for this JVM: 12 (compressed OOPs / 32-bit) or 16.",
"type": "integer",
"format": "uint8",
"maximum": 255,
"minimum": 0
},
"header_pct_of_shallow_bp": {
"description": "Header overhead as a share of the class's total shallow heap,\nin integer basis points (100 bp = 1%).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pretty_class": {
"type": "string"
},
"total_header_bytes": {
"description": "`instances * header_bytes` — total bytes consumed by headers for this class.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"instances",
"header_bytes",
"total_header_bytes",
"header_pct_of_shallow_bp",
"avg_shallow"
]
},
"HeapComposition": {
"description": "B5: reachable-heap composition split by object kind (instances vs. arrays\nvs. class objects). Rows are in fixed kind order; empty buckets are omitted.",
"type": "object",
"properties": {
"by_kind": {
"type": "array",
"items": {
"$ref": "#/$defs/KindStat"
}
},
"prim_array_by_type": {
"description": "When primitive arrays are present, further split by element type\n(e.g. \"byte[]\", \"int[]\"). Omitted when empty or only one type.",
"type": "array",
"items": {
"$ref": "#/$defs/KindStat"
}
}
},
"required": [
"by_kind"
]
},
"HistRow": {
"description": "One row of the System-Overview class histogram (full, one row per class).",
"type": "object",
"properties": {
"incoming_ref_count": {
"description": "Total number of inbound references (edges) pointing at instances of this\nclass across all captured objects. Answers \"how many objects hold a ref to\nan instance of this class?\" Same semantics as JProfiler's incoming-ref count\nin the histogram. Always present; `0` for synthetic rows (no backing objects).",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loader_id": {
"description": "Class-loader object address that loaded this class (0 = boot loader).\nDistinct (class, loader) pairs are distinct rows, matching MAT's\nclass-object-identity histogram keying.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loader_label": {
"description": "Human-readable label for `loader_id`: the class NAME of the loader\nobject (e.g. `jdk/internal/loader/ClassLoaders$AppClassLoader`), or\n`<boot>` for the boot loader (address 0). `None` when the loader address\ncould not be resolved (e.g. leak-suspect `dominated_by_class` rows where\nthe histogram-row index is not readily available). Purely descriptive —\nNOT parity-gated and never compared numerically.",
"type": [
"string",
"null"
]
},
"max_instance_shallow": {
"description": "Shallow size of the single largest instance of this class — surfaces a\nlone oversized object hiding behind a small instance count. `0` for\nsynthetic rows that have no backing object (the injected system class\nloader, leak-suspect `dominated_by_class` rows). `#[serde(default)]` so\npre-v5 reports (which lack the field) still deserialize.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"pretty_class": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"root_path": {
"description": "Dominator chain from the highest-retained instance of this class up to its\nGC root. Populated for the top-20 histogram rows by retained heap in the\nSystem Overview. `None` for synthetic rows (no backing objects) and for\nrows outside the top-20. Additive; `#[serde(default)]` so older JSON still\ndeserializes.",
"type": [
"array",
"null"
],
"items": {
"$ref": "#/$defs/RootPathStep"
}
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"instances",
"shallow",
"retained",
"loader_id"
]
},
"ImmDomPair": {
"description": "One (dominator_class, dominated_class) pair for the V5 two-sided sankey.\nPowers \"who holds X\" (rows where dominated_class == target) and\n\"what does X hold\" (rows where dominator_class == target) from a single dataset.",
"type": "object",
"properties": {
"dominated_class": {
"type": "string"
},
"dominated_retained": {
"description": "Aggregate retained heap of the dominated objects.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominated_shallow": {
"description": "Aggregate shallow heap of the dominated objects.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominator_class": {
"type": "string"
},
"pair_count": {
"description": "Number of (dominator, dominated) object pairs counted.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"dominator_class",
"dominated_class",
"pair_count",
"dominated_retained",
"dominated_shallow"
]
},
"ImmediateDominatorRow": {
"description": "One row of the immediate-dominator class rollup: for each dominator class,\nhow many objects it immediately dominates and their aggregate shallow heap.",
"type": "object",
"properties": {
"dominated_count": {
"description": "Number of objects immediately dominated by objects of this class.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominated_shallow": {
"description": "Aggregate shallow heap of the dominated objects.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominator_class": {
"type": "string"
},
"dominator_count": {
"description": "Number of distinct dominator objects of this class (with >=1 dom child).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominator_shallow": {
"description": "Aggregate shallow heap of those dominator objects.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"dominator_class",
"dominator_count",
"dominated_count",
"dominator_shallow",
"dominated_shallow"
]
},
"ImmediateDominators": {
"description": "The \"Immediate Dominators\" view: dominated-object rollup keyed by the\ndominator's class. Additive; not parity-compared.",
"type": "object",
"properties": {
"pairs": {
"description": "Per-(dominator_class, dominated_class) pairs for the two-sided sankey.\nSorted by dominated_retained descending, capped at IMDOM_PAIRS_CAP.\nAdditive; defaults to empty for round-trip with older JSON.",
"type": "array",
"items": {
"$ref": "#/$defs/ImmDomPair"
}
},
"rows": {
"description": "Rows sorted by dominated_shallow descending, capped.",
"type": "array",
"items": {
"$ref": "#/$defs/ImmediateDominatorRow"
}
}
},
"required": [
"rows"
]
},
"InboundEdge": {
"description": "One inbound reference captured in the static report snapshot.",
"type": "object",
"properties": {
"field_name": {
"description": "Field name on `src` that points to this node, or \"\" if unnamed.",
"type": "string"
},
"src_class": {
"description": "Display class of `src`.",
"type": "string"
},
"src_idx": {
"description": "Dense index of the object holding the reference to this node.",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"src_retained": {
"description": "Retained heap of `src`.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"src_shallow": {
"description": "Shallow heap of `src`.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"src_idx",
"field_name",
"src_class",
"src_shallow",
"src_retained"
]
},
"KindStat": {
"description": "One kind-bucket of the heap-composition breakdown (B5).",
"type": "object",
"properties": {
"kind": {
"description": "One of: \"Instances\", \"Object arrays\", \"Primitive arrays\", \"Class objects\".",
"type": "string"
},
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow_heap": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"kind",
"objects",
"shallow_heap"
]
},
"LeakIndicators": {
"description": "Scalar indicators of common Java leak patterns. All fields are always\ncomputed; zero when the corresponding objects are absent.",
"type": "object",
"properties": {
"anonymous_class_count": {
"description": "Count of anonymous/generated class definitions (names matching `$\\d+`,\n`$$Lambda$`, `$$Anon`, or `$Proxy` patterns).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"direct_byte_buffer_capacity_sum": {
"description": "Sum of `capacity` fields across all live `DirectByteBuffer` instances,\nrepresenting total off-heap memory tracked by live NIO buffers.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"thread_local_null_key_count": {
"description": "Count of `ThreadLocal$ThreadLocalMap$Entry` instances whose referent\n(the ThreadLocal key) has been cleared — the classic thread-local leak signal.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"anonymous_class_count",
"thread_local_null_key_count",
"direct_byte_buffer_capacity_sum"
]
},
"LeakSuspects": {
"description": "Aggregates for the \"Leak Suspects\" section.",
"type": "object",
"properties": {
"suspects": {
"type": "array",
"items": {
"$ref": "#/$defs/Suspect"
}
},
"total_shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"total_shallow",
"suspects"
]
},
"LoaderRollup": {
"description": "F2: per-class-loader rollup over the class histogram. One row per distinct\n`loader_id`, aggregating the classes it loaded. A bounded reduction over the\nhistogram (row count <= #loaders), so RSS-safe. Sorted retained-desc.",
"type": "object",
"properties": {
"class_count": {
"description": "Number of distinct classes loaded by this loader.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loader_id": {
"description": "Loader object address (0 = boot loader).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"loader_label": {
"description": "Human-readable loader label (class name of the loader object, or\n`<boot>`); `None` when the label could not be resolved.",
"type": [
"string",
"null"
]
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"loader_id",
"class_count",
"instances",
"shallow",
"retained"
]
},
"MapCollisionRatio": {
"description": "Hash-map collision proxy (occupied slots vs size); `wasted` in its buckets\nis always 0. Additive.",
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/FillRatioBucket"
}
},
"total": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"tracked": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"tracked",
"total",
"buckets"
]
},
"MergedPathNode": {
"description": "One node of a \"merged shortest paths to GC roots\" prefix tree (Eclipse MAT\n\"Merge Shortest Paths\"): the dominator chains of all members of a class-group\nsuspect, collapsed by class-at-each-depth. `object_count` is how many member\nchains pass through this node; `retained` sums those members' retained heap\ncontribution at this node. Additive; not parity-compared.",
"type": "object",
"properties": {
"children": {
"type": "array",
"items": {
"$ref": "#/$defs/MergedPathNode"
}
},
"display_class": {
"type": "string"
},
"field_edge": {
"description": "Field name on the parent node that points to this child; only present\nwhen `--ref-paths` was set and a consistent field name was found across\nall chains that pass through this node.",
"type": [
"string",
"null"
]
},
"object_count": {
"description": "Number of member chains passing through this node.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained": {
"description": "Aggregate retained heap of the objects represented at this node.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"root_type_label": {
"description": "GC-root type label when this node is a root (the chain terminus).",
"type": [
"string",
"null"
]
}
},
"required": [
"display_class",
"object_count",
"retained",
"children"
]
},
"ObjGraphEdge": {
"description": "Outbound edge from one object to another (Reference Graph Explorer / V3).",
"type": "object",
"properties": {
"child_class": {
"type": "string"
},
"child_idx": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"child_retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"field_name": {
"type": "string",
"default": ""
}
},
"required": [
"child_idx",
"child_class",
"child_retained"
]
},
"ObjGraphFlat": {
"description": "Flat lookup table powering V3 + V4 navigation (object graph + dominator explorer).\nOnly present when --obj-graph is used.",
"type": "object",
"properties": {
"capture_params": {
"description": "Capture parameters (tier name, edge_cap) for the UI indicator.",
"$ref": "#/$defs/CaptureParams",
"default": {
"edge_cap": 0,
"size_tier": ""
}
},
"dom_children": {
"description": "Immediate dominator children for all significant nodes. Key = parent dense index.",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^\\d+$": {
"type": "array",
"items": {
"type": "integer",
"format": "uint32",
"minimum": 0
}
}
}
},
"edges": {
"description": "Outbound edges for captured nodes. Key = dense index (u32).",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^\\d+$": {
"type": "array",
"items": {
"$ref": "#/$defs/ObjGraphEdge"
}
}
}
},
"inbound_edges": {
"description": "Inbound reference snapshot (who points to each captured node).\nKey = dense index (as string in JSON). Only present for nodes in the capture set.",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^\\d+$": {
"type": "array",
"items": {
"$ref": "#/$defs/InboundEdge"
}
}
}
},
"inbound_truncated": {
"description": "Dense indices of nodes where inbound edges were truncated at edge_cap.",
"type": "array",
"items": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"uniqueItems": true
},
"nodes": {
"description": "All significant nodes (retained >= sig_floor_bytes). Key = dense index (u32).",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^\\d+$": {
"$ref": "#/$defs/ObjGraphFlatNode"
}
}
},
"root_dom_trees": {
"description": "Pre-built depth-3 dominator trees for top-20 root objects (for SVG mode in V4).",
"type": "array",
"items": {
"type": "array",
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "integer",
"format": "uint32",
"minimum": 0
},
{
"$ref": "#/$defs/DomTreeNode"
}
]
}
},
"roots": {
"description": "Dense indices of dominator roots (idom == vroot).",
"type": "array",
"items": {
"type": "integer",
"format": "uint32",
"minimum": 0
}
},
"sig_floor_bytes": {
"description": "Minimum retained bytes to be included as a significant node.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"nodes",
"edges",
"dom_children",
"roots",
"sig_floor_bytes"
]
},
"ObjGraphFlatNode": {
"description": "One node in the flat object graph lookup table.",
"type": "object",
"properties": {
"display_class": {
"type": "string"
},
"dom_subtree_count": {
"description": "Total number of objects in the dominated subtree rooted here (including self).",
"type": "integer",
"format": "uint32",
"default": 0,
"minimum": 0
},
"edges_truncated": {
"type": "boolean",
"default": false
},
"edges_unknown": {
"type": "boolean",
"default": false
},
"idom": {
"type": [
"integer",
"null"
],
"format": "uint32",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"subtree_classes": {
"description": "Top-10 classes by shallow heap across the entire dominated subtree (including self).\nOmitted when empty (e.g. leaf nodes or small subtrees).",
"type": "array",
"items": {
"$ref": "#/$defs/SubtreeClassRow"
}
}
},
"required": [
"display_class",
"shallow",
"retained"
]
},
"ObjRow": {
"description": "One row of \"Biggest Objects\".",
"type": "object",
"properties": {
"display_class": {
"type": "string"
},
"held_via": {
"description": "Stack-frame holding this object (`ClassName#methodName()`), when the\nobject is a significant local in a thread's stack frame and no field\nowner was found. `None` otherwise.",
"type": [
"string",
"null"
]
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"owner": {
"description": "Dominant incoming reference (`Class#field`) that holds this object.\n`None` when `--collections` was off or no attributed field points at it.",
"type": [
"string",
"null"
],
"default": null
},
"pct_bp": {
"description": "Retained share of total reachable shallow heap, in integer basis\npoints (bp = round(retained / total_shallow * 10000)). Deterministic\ninteger for JSON output; the Markdown renderer uses `pct` instead.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"obj_index_1based",
"display_class",
"shallow",
"retained",
"pct_bp"
]
},
"PackageNode": {
"description": "One node of the pruned package tree (MAT PackageTreeResult parity).\nTotals are CUMULATIVE over all top-level dominators in this node's subtree.",
"type": "object",
"properties": {
"children": {
"description": "Children sorted retained-desc, tie-broken by name-asc.",
"type": "array",
"items": {
"$ref": "#/$defs/PackageNode"
}
},
"name": {
"description": "This segment's name (e.g. \"util\"); the root node's name is \"\".",
"type": "string"
},
"retained_heap": {
"description": "Cumulative retained heap (sum over the top-level dominators under this node).",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow_heap": {
"description": "Sum of shallow heap of the top-level dominators under this node.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"top_dominator_count": {
"description": "Number of top-level dominators under this node (MAT \"# Objects\").",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"name",
"top_dominator_count",
"shallow_heap",
"retained_heap",
"children"
]
},
"PathStep": {
"description": "One step of a single-suspect accumulation path.",
"type": "object",
"properties": {
"depth": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"display_class": {
"type": "string"
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"depth",
"obj_index_1based",
"display_class",
"retained"
]
},
"PropEntry": {
"description": "One decoded JVM system property (`java.lang.System.props` entry). Serialized\nas a stable `{ \"key\": ..., \"value\": ... }` object (rather than a positional\narray) so the JSON schema is self-describing.",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
},
"required": [
"key",
"value"
]
},
"QueryColumn": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": [
"name"
]
},
"QueryResult": {
"type": "object",
"properties": {
"columns": {
"type": "array",
"items": {
"$ref": "#/$defs/QueryColumn"
}
},
"elapsed_ms": {
"description": "Wall-clock milliseconds this query took (parse+plan+run), set by the\nserver pipeline. Omitted from JSON when absent so the analyze report and\nits golden snapshot stay byte-identical.",
"type": [
"integer",
"null"
],
"format": "uint64",
"minimum": 0
},
"error": {
"description": "Set (with rows empty) when the query failed to parse/plan/execute.",
"type": [
"string",
"null"
]
},
"name": {
"description": "Query label (e.g. \"q1\" or a user-supplied name).",
"type": "string"
},
"note": {
"description": "Optional advisory note (e.g. \"edge retention capped\"); populated by later\nphases, harmless (`None`) otherwise. Omitted from JSON when absent.",
"type": [
"string",
"null"
]
},
"oql": {
"description": "The original OQL text.",
"type": "string"
},
"row_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"rows": {
"type": "array",
"items": {
"type": "array",
"items": {
"$ref": "#/$defs/QueryValue"
}
}
},
"truncated": {
"description": "True if a cap was hit and rows are a bounded sample.",
"type": "boolean"
},
"viz": {
"description": "Optional visualization directive (`-- @viz ...`) declared with the query.\n`None` renders a plain table (today's behavior). Omitted from JSON when\nabsent so no-viz reports are byte-identical.",
"anyOf": [
{
"$ref": "#/$defs/VizSpec"
},
{
"type": "null"
}
]
}
},
"required": [
"name",
"oql",
"columns",
"rows",
"row_count",
"truncated"
]
},
"QueryValue": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "null"
}
},
"required": [
"kind"
]
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "bool"
},
"v": {
"type": "boolean"
}
},
"required": [
"kind",
"v"
]
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "int"
},
"v": {
"type": "integer",
"format": "int64"
}
},
"required": [
"kind",
"v"
]
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "float"
},
"v": {
"type": "number",
"format": "double"
}
},
"required": [
"kind",
"v"
]
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "str"
},
"v": {
"type": "string"
}
},
"required": [
"kind",
"v"
]
},
{
"description": "A reference to a heap object: dense index + its class name for display.",
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "obj_ref"
},
"v": {
"type": "object",
"properties": {
"addr": {
"description": "Heap address of the object, when resolvable. Omitted from JSON when\nabsent so the analyze golden snapshot (no obj_ref values) stays\nbyte-identical and non-server callers are unaffected.",
"type": [
"integer",
"null"
],
"format": "uint64",
"minimum": 0
},
"class": {
"type": "string"
},
"index": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"index",
"class"
]
}
},
"required": [
"kind",
"v"
]
}
]
},
"RecordCensus": {
"description": "Raw HPROF record-type census for the dump: top-level record counts plus a\nper-GC-root-tag breakdown. Additive metadata surfaced in System Overview;\nnot parity-compared. Populated from pass1 counters.",
"type": "object",
"properties": {
"class_dumps": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"gc_root_tag_counts": {
"description": "(root sub-tag byte, count), sorted by count desc then tag asc for stable output.",
"type": "array",
"items": {
"type": "array",
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "integer",
"format": "uint8",
"maximum": 255,
"minimum": 0
},
{
"type": "integer",
"format": "uint64",
"minimum": 0
}
]
}
},
"heap_dump_segments": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"instance_dumps": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"load_class_records": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"obj_array_dumps": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"prim_array_dumps": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"stack_frame_records": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"stack_trace_records": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"unload_class_records": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"utf8_records": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"utf8_records",
"load_class_records",
"unload_class_records",
"stack_frame_records",
"stack_trace_records",
"heap_dump_segments",
"instance_dumps",
"obj_array_dumps",
"prim_array_dumps",
"class_dumps",
"gc_root_tag_counts"
]
},
"RefStatClassRow": {
"description": "One class row in a reference-statistics histogram. Additive.",
"type": "object",
"properties": {
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pretty_class": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"objects",
"shallow"
]
},
"ReferenceStats": {
"description": "Statistics for one reference kind (Soft/Weak/Phantom). `kind` is the\nlabel. `referent_histogram` = classes of referents grouped/counted.\n`only_weakly_retained` = referent classes reachable ONLY through the weak\nedge (idom == u32::MAX). Additive.",
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"null_referent_count": {
"description": "Number of reference objects whose referent field is null (referent was GC'd).",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"only_weakly_retained": {
"type": "array",
"items": {
"$ref": "#/$defs/RefStatClassRow"
}
},
"reference_instances": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"referent_histogram": {
"type": "array",
"items": {
"$ref": "#/$defs/RefStatClassRow"
}
}
},
"required": [
"kind",
"reference_instances",
"referent_histogram",
"only_weakly_retained"
]
},
"ReferencesAnalysis": {
"description": "The three reference views, each optional (None when that kind is absent).\nAdditive.",
"type": "object",
"properties": {
"phantom": {
"anyOf": [
{
"$ref": "#/$defs/ReferenceStats"
},
{
"type": "null"
}
],
"default": null
},
"soft": {
"anyOf": [
{
"$ref": "#/$defs/ReferenceStats"
},
{
"type": "null"
}
],
"default": null
},
"weak": {
"anyOf": [
{
"$ref": "#/$defs/ReferenceStats"
},
{
"type": "null"
}
],
"default": null
}
}
},
"RetainerRow": {
"description": "One row of the merged Top Retainers table (§813).",
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"name": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"name",
"kind",
"retained"
]
},
"RetentionSummary": {
"description": "B3: retention concentration over top-level dominators. Basis-point shares\n(of total reachable shallow heap) held by the top-1/10/100 objects, plus how\nmany single objects each hold >=1% of the heap. Answers \"one leak or many?\".",
"type": "object",
"properties": {
"num_objects_ge_1pct": {
"description": "Count of single objects each retaining >=1% of total reachable shallow.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"top100_bp": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"top100_retained": {
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"top10_bp": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"top10_retained": {
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"top1_bp": {
"description": "Retained share of the top-1 / top-10 / top-100 top-level dominators, in\ninteger basis points (100 bp = 1%) of total reachable shallow heap.",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"top1_retained": {
"description": "Exact retained bytes for the top-1 / top-10 / top-100 top-level dominators.\nDerive % from these rather than reconstructing from bp to avoid rounding loss.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"total_retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"total_retained",
"top1_bp",
"top10_bp",
"top100_bp",
"num_objects_ge_1pct"
]
},
"RootPathStep": {
"description": "One hop of the dominator chain from a suspect up toward its GC\nroot. The final hop carries `root_type_label` when the node\nis itself a GC root.",
"type": "object",
"properties": {
"display_class": {
"type": "string"
},
"field_edge": {
"description": "Name of the field on this object that points to the next hop (parent's\nfield → child). Only present when `--ref-paths` was set. Empty string\nmeans \"no field name available\" (class edge, array element, synthetic\nthread-local edge).",
"type": [
"string",
"null"
]
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"root_type_label": {
"type": [
"string",
"null"
]
}
},
"required": [
"obj_index_1based",
"display_class",
"retained"
]
},
"SignificantFrame": {
"description": "One stack frame plus the significant local-variable objects it retains.\nPopulated only under `--thread-locals`.",
"type": "object",
"properties": {
"frame": {
"description": "Rendered frame line `class.method (source:line)`.",
"type": "string"
},
"locals": {
"description": "Significant local objects held at this frame, retained desc.",
"type": "array",
"items": {
"$ref": "#/$defs/SignificantLocal"
}
}
},
"required": [
"frame",
"locals"
]
},
"SignificantLocal": {
"description": "One significant local-variable object held at a frame.",
"type": "object",
"properties": {
"display_class": {
"description": "Class name of the local object.",
"type": "string"
},
"pct": {
"description": "Retained heap as a percentage of total reachable shallow heap (same\nbasis as every other \"% Heap\" figure in the report).",
"type": "number",
"format": "double"
},
"retained": {
"description": "Retained heap of the local object.",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"display_class",
"retained",
"pct"
]
},
"SizeBucket": {
"description": "One power-of-two size bucket of the top-level-dominator retained-size\ndistribution. `upper_bytes` is the inclusive upper bound (a power of two);\na dominator with retained size r falls in the smallest bucket whose\n`upper_bytes >= r`. `count` is how many top-level dominators land here.",
"type": "object",
"properties": {
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"upper_bytes": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"upper_bytes",
"count"
]
},
"SizeHistogramBucket": {
"description": "One power-of-two length bucket in the arrays-by-size histogram. `upper_len`\nis the inclusive upper bound of the bucket (a power of two): a bucket with\n`upper_len = 8` counts arrays whose element length is in `5..=8`. The first\nbucket is `1..=1` (upper_len 1); zero-length arrays are counted separately.",
"type": "object",
"properties": {
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"upper_len": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"upper_len",
"objects",
"shallow"
]
},
"StrLenBucket": {
"description": "One power-of-two bucket of the String-length histogram. `upper_len` is the\ninclusive upper bound (a power of two); a value of length `l` falls in the\nsmallest bucket whose `upper_len >= l`. `count` is the number of distinct\nString values in this bucket.",
"type": "object",
"properties": {
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"upper_len": {
"type": "integer",
"format": "uint32",
"minimum": 0
}
},
"required": [
"upper_len",
"count"
]
},
"StrLenStats": {
"description": "Summary stats over distinct-value String lengths (bytes). `Default` = zeros.",
"type": "object",
"properties": {
"max": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"median": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"min": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"total": {
"description": "Sum of all distinct-value lengths (bytes).",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"min",
"max",
"median",
"total"
]
},
"StringHolder": {
"description": "One owning class and how many `java.lang.String` instances its instances\nreference (across all object-reference fields).",
"type": "object",
"properties": {
"class_name": {
"type": "string"
},
"string_refs": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"class_name",
"string_refs"
]
},
"SubtreeClassRow": {
"description": "One class row in a dominator-subtree class breakdown.",
"type": "object",
"properties": {
"class": {
"type": "string"
},
"instance_count": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"total_shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"class",
"instance_count",
"total_shallow"
]
},
"Suspect": {
"description": "One leak suspect (single large object or class group).",
"type": "object",
"properties": {
"accumulation_class": {
"type": [
"string",
"null"
]
},
"accumulation_obj_1based": {
"description": "The accumulation point object where retained heap piles up (the last\nstep of `path`). `None` for group suspects or when the descent hit\n`MAX_ACCUM_DEPTH` without a big drop.",
"type": [
"integer",
"null"
],
"format": "uint",
"minimum": 0
},
"accumulation_retained": {
"type": [
"integer",
"null"
],
"format": "uint64",
"minimum": 0
},
"dominated": {
"description": "Top immediately-dominated children of the accumulation point, sorted\nretained-desc and capped at the configured cap. Empty for groups.",
"type": "array",
"items": {
"$ref": "#/$defs/DominatedRow"
}
},
"dominated_by_class": {
"description": "By-class histogram (objects/shallow/retained) of the accumulation\npoint's immediately-dominated children, sorted retained-desc and\ncapped. Empty for groups.",
"type": "array",
"items": {
"$ref": "#/$defs/HistRow"
}
},
"dominated_shown": {
"description": "F3: how many rows the `dominated` list actually shows (== dominated.len()),\nso a renderer can say \"showing top M of N\".",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominated_total_count": {
"description": "F3: FULL count of immediately-dominated children of the accumulation\npoint (the dominator-children CSR degree, uncapped). The number the\ncapped `dominated` list cannot convey — \"how many objects does this\naccumulation point directly hold?\". 0 for group suspects / no accum.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"dominator_tree": {
"description": "FULL multi-level dominator subtree rooted at the accumulation point.\n`None` when the suspect has no accumulation point (skipped in JSON).\nBounded by the `--detail` max-nodes / max-depth caps.",
"anyOf": [
{
"$ref": "#/$defs/DomTreeNode"
},
{
"type": "null"
}
]
},
"instance_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"is_single": {
"type": "boolean"
},
"keywords": {
"description": "Class names involved in this suspect (suspect class + accumulation\npoint class), de-duplicated in first-seen order, for search.",
"type": "array",
"items": {
"type": "string"
}
},
"merged_paths": {
"description": "F: merged shortest paths to GC roots for a class-group suspect — the\nmember objects' dominator chains collapsed into a class-keyed prefix\ntree. `None` for single suspects (they already have `root_path`).\nBounded by the `--detail` max-nodes / max-depth caps.",
"anyOf": [
{
"$ref": "#/$defs/MergedPathNode"
},
{
"type": "null"
}
]
},
"path": {
"description": "Descent from the suspect object to the accumulation point (MAT\n`findAccumulationPoint`, big-drop-ratio 0.7). Non-empty only for singles.",
"type": "array",
"items": {
"$ref": "#/$defs/PathStep"
}
},
"pretty_class": {
"type": "string"
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"root_path": {
"description": "Dominator chain from this single suspect up to its GC root. Only\npopulated for single suspects; `None` for group suspects (skipped in\nJSON). Bounded by the `--detail` root-path max-depth cap.",
"type": [
"array",
"null"
],
"items": {
"$ref": "#/$defs/RootPathStep"
}
},
"root_type_label": {
"description": "Human label of the GC-root TYPE holding this suspect (e.g. \"Thread\",\n\"Sticky Class\", \"JNI Global\"), when the suspect's top-level dominator is\nitself an identifiable single GC root. Empty when unknown: the suspect\nis not itself a root, is held by multiple/ambiguous roots, or the root\ntype is `ROOT_UNKNOWN`. Only populated for single suspects.",
"type": "string"
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"is_single",
"pretty_class",
"instance_count",
"retained",
"shallow",
"path",
"dominated",
"dominated_total_count",
"dominated_shown",
"dominated_by_class",
"keywords",
"root_type_label"
]
},
"SystemOverview": {
"description": "Aggregates for the \"System Overview\" section.",
"type": "object",
"properties": {
"boxed_number_holders": {
"description": "Top classes holding the most references to boxed-number objects\n(Integer, Long, etc.). Populated only when `--collections` is on.\nAdditive; not parity-compared.",
"type": "array",
"items": {
"$ref": "#/$defs/BoxedNumberHolder"
}
},
"boxed_numbers": {
"description": "Boxed-number classes (java.lang.Integer, Long, etc.) found in the histogram,\nsorted by total shallow heap descending. Empty when no boxed types appear.\nAdditive; not parity-compared.",
"type": "array",
"items": {
"$ref": "#/$defs/BoxedNumberRow"
}
},
"classes_loaded": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"classloaders_loaded": {
"description": "Count of DISTINCT class-loader addresses among loaded classes (boot\nloader counted once when present). This is \"loaders referenced by loaded\nclasses\", NOT MAT's loader-object count — not a parity-gated scalar.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"compressed_oops": {
"description": "Whether the JVM used compressed ordinary object pointers: true when\nreferences are narrower than identifiers (8-byte id, 4-byte ref). None\nwhen undeterminable. Not applicable (false) for 32-bit dumps.",
"type": [
"boolean",
"null"
]
},
"dominator_depth_histogram": {
"description": "B2: dominator-depth histogram (retention shape). depth = idom-hops to the\nvirtual root. Sorted by depth ascending. Always present; empty only for\nan empty heap. Surfaced in OOM Triage as a synthesized \"Shape\" line; the\nfull histogram lives in JSON. Excludes the synthetic system-classloader\nobject (it has no graph node).",
"type": "array",
"items": {
"$ref": "#/$defs/DepthBucket"
}
},
"dump_creation": {
"description": "Dump creation time in millis since Unix epoch (HPROF header base\ntimestamp). None when the header timestamp is absent/zero.",
"type": [
"integer",
"null"
],
"format": "int64"
},
"duplicate_classes": {
"description": "F2: class names loaded under more than one loader (duplicate-class /\nclass-loader-leak signature), capped. Additive. Not parity-compared.",
"type": "array",
"items": {
"$ref": "#/$defs/DuplicateClass"
}
},
"duplicate_prim_arrays": {
"description": "Approximate duplicate-primitive-array analysis, present only when\n`--find-duplicates` was passed; `None` otherwise. Additive; not parity-compared.",
"anyOf": [
{
"$ref": "#/$defs/DupPrimArrays"
},
{
"type": "null"
}
]
},
"duplicate_strings": {
"description": "Approximate duplicate-String analysis, present only when `--find-duplicates`\nwas passed; `None` otherwise. Additive; not parity-compared.",
"anyOf": [
{
"$ref": "#/$defs/DupStrings"
},
{
"type": "null"
}
]
},
"file_path": {
"description": "Full path the dump was opened from (superset of `source_name`).",
"type": "string"
},
"file_size": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"format": {
"type": "string"
},
"gc_roots": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"gc_roots_by_type": {
"description": "GC roots broken down by HPROF root type (e.g. \"System Class\", \"Thread\",\n\"JNI Global\"), sorted by count descending then label ascending. Excludes\nsynthetic roots the analyzer injects. Empty only when there are no roots.",
"type": "array",
"items": {
"$ref": "#/$defs/GcRootTypeRow"
}
},
"gc_roots_retained_by_type": {
"description": "Retained heap grouped by GC root type. Additive; empty when no roots.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/GcRootRetainedRow"
}
},
"header_overhead": {
"description": "Per-class object-header overhead: classes where headers account for a large\nfraction of shallow heap or represent a large absolute overhead. Top-30\nsorted by total_header_bytes descending. Additive; not parity-compared.",
"type": "array",
"items": {
"$ref": "#/$defs/HeaderOverheadRow"
}
},
"heap_composition": {
"description": "B5: reachable-heap composition by object kind. Always present; empty\nonly for an empty heap.",
"$ref": "#/$defs/HeapComposition"
},
"heap_fragmentation_ratio": {
"description": "Ratio of unreachable shallow heap to total heap (reachable + unreachable).\nRange [0.0, 1.0]. 0.0 for an empty heap.",
"type": "number",
"format": "double",
"default": 0.0
},
"histogram": {
"type": "array",
"items": {
"$ref": "#/$defs/HistRow"
}
},
"histogram_truncated_to": {
"description": "Number of histogram rows the full histogram was capped to, or None when\nthe histogram is complete (never truncated). Always None today.",
"type": [
"integer",
"null"
],
"format": "uint64",
"minimum": 0
},
"identifier_size_bits": {
"description": "HPROF identifier size in BITS (id_size bytes * 8: 32 or 64).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"jvm_version": {
"description": "Derived JVM version (prefers `java.vm.version`, else `java.version`).\nNone when neither property was decoded. Additive: not parity-compared.",
"type": [
"string",
"null"
]
},
"loader_rollup": {
"description": "F2: per-loader rollup over the histogram, top-N by retained heap.\nAdditive bounded reduction (<= #loaders rows). Not parity-compared.",
"type": "array",
"items": {
"$ref": "#/$defs/LoaderRollup"
}
},
"record_census": {
"description": "HPROF record census: raw record-type counts for the dump (UTF8,\nLOAD_CLASS/UNLOAD_CLASS, stack frames/traces, heap segments, per-object\ndumps, per-GC-root-tag). Additive; not parity-compared. Carried from\npass1 counters via the graph. `#[serde(default)]` so pre-v5 reports\n(which lack the field) still deserialize.",
"$ref": "#/$defs/RecordCensus",
"default": {
"class_dumps": 0,
"gc_root_tag_counts": [],
"heap_dump_segments": 0,
"instance_dumps": 0,
"load_class_records": 0,
"obj_array_dumps": 0,
"prim_array_dumps": 0,
"stack_frame_records": 0,
"stack_trace_records": 0,
"unload_class_records": 0,
"utf8_records": 0
}
},
"retention_concentration": {
"description": "B3: retention concentration over top-level dominators. Always present\n(zeroed for an empty heap). Surfaced in OOM Triage as a \"One leak or\nmany\" line.",
"$ref": "#/$defs/RetentionSummary"
},
"source_name": {
"type": "string"
},
"system_properties": {
"description": "Decoded JVM system properties (java.lang.System static `props`), sorted\nby key. Empty when the props object is absent or its layout could not be\nsafely decoded (graceful fallback — never garbage). Additive: not\nparity-compared.",
"type": "array",
"items": {
"$ref": "#/$defs/PropEntry"
}
},
"top_class_concentration_bp": {
"description": "Retained heap share of the single largest class, in integer basis points (100 bp = 1%).\n0 for an empty heap.",
"type": "integer",
"format": "uint32",
"default": 0,
"minimum": 0
},
"total_objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total_shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"unreachable_composition": {
"description": "Composition of the unreachable heap by object kind (instances / object\narrays / primitive arrays / class objects), mirroring `heap_composition`\nfor the reachable heap. Additive; not parity-compared. Empty when there\nare no unreachable objects.",
"$ref": "#/$defs/HeapComposition",
"default": {
"by_kind": []
}
},
"unreachable_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"unreachable_garbage_roots": {
"description": "Top garbage-root dominator subtrees in the unreachable forest, sorted by\nretained desc and capped (top-5 roots × depth-4). Each entry is the root\nof a subtree of unreachable objects with no reachable predecessor; the\ntree structure reflects the dominator relationships within that garbage\ncluster. Additive; not parity-compared.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/UnreachableGarbageRoot"
}
},
"unreachable_histogram": {
"description": "Per-class histogram of unreachable objects (idom == u32::MAX), sorted by\nshallow descending and capped. Additive; not parity-compared.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/UnreachableClassRow"
}
},
"unreachable_retained": {
"description": "Total retained heap held within the unreachable forest, computed by a\ndominator pass over the unreachable subgraph. Equals the sum of shallow\nsizes of all unreachable objects (every unreachable object is dominated\nby exactly one garbage root within the forest). Additive; not parity-\ncompared. 0 when there are no unreachable objects.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"unreachable_shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"source_name",
"file_path",
"format",
"file_size",
"identifier_size_bits",
"total_objects",
"total_shallow",
"gc_roots",
"gc_roots_by_type",
"heap_composition",
"dominator_depth_histogram",
"retention_concentration",
"classes_loaded",
"classloaders_loaded",
"unreachable_count",
"unreachable_shallow",
"histogram",
"system_properties",
"loader_rollup",
"duplicate_classes"
]
},
"ThreadInfo": {
"description": "A single thread's call stack, resolved from HPROF STACK_TRACE/STACK_FRAME\nrecords. Identifies the thread by its heap object (index + class) since the\nthread NAME requires decoding java.lang.Thread fields (a later step).",
"type": "object",
"properties": {
"class_name": {
"description": "Class name of the resolved thread object, or None when the thread\nobject could not be located in the heap.",
"type": [
"string",
"null"
]
},
"context_class_loader": {
"description": "Display label of the thread's `contextClassLoader` (e.g.\n`java.net.URLClassLoader @ 0x…`), or None when absent/unresolved. Additive.",
"type": [
"string",
"null"
]
},
"frames": {
"description": "Stack frames, top-first, each \"class.method (source:line)\".",
"type": "array",
"items": {
"type": "string"
}
},
"is_daemon": {
"description": "`java.lang.Thread.daemon`. Additive.",
"type": "boolean",
"default": false
},
"local_objects": {
"description": "Bounded sample of this thread's GC-thread-local root objects (retained\ndesc), bounded by the `--detail` per-thread cap. Empty vec when the\nthread has no locals. Additive: not part of MAT parity.",
"type": [
"array",
"null"
],
"items": {
"$ref": "#/$defs/ThreadLocalObj"
}
},
"local_root_count": {
"description": "Number of GC-thread-local roots this thread holds that resolve to a live\nobject (from the dominator graph's synthetic thread→local edges). A high\ncount flags a thread pinning many objects alive. Additive field: not part\nof MAT parity comparison. Bounded (per-thread), off the per-object budget.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"max_local_retained": {
"description": "Largest retained heap among this thread's significant local variables\n(0 when frames were not computed). Mirrors MAT's \"Max. Locals' Retained\nHeap\" column. Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"name": {
"description": "Decoded `java.lang.Thread.name`, or None when the name could not be\nresolved (missing thread/String, JDK layout mismatch, or empty name).\nAdditive field: not part of MAT parity comparison.",
"type": [
"string",
"null"
]
},
"priority": {
"description": "`java.lang.Thread.priority`. Additive.",
"type": "integer",
"format": "int32",
"default": 0
},
"retained": {
"description": "Retained heap of the resolved thread object (0 when unresolved). Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"shallow": {
"description": "Shallow heap of the resolved thread object (0 when unresolved). Additive.",
"type": "integer",
"format": "uint64",
"default": 0,
"minimum": 0
},
"significant_frames": {
"description": "Per-frame significant local variables, interleaved top-first. Populated\nonly under the opt-in `--thread-locals` flag; empty otherwise. Additive:\nnot part of MAT parity.",
"type": "array",
"items": {
"$ref": "#/$defs/SignificantFrame"
}
},
"thread_serial": {
"description": "HPROF thread serial (stable within the dump).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"thread_state": {
"description": "Decoded thread state label (e.g. `[alive, runnable]`) from the raw\n`threadStatus` bits. Empty when unknown. Additive.",
"type": "string",
"default": ""
}
},
"required": [
"thread_serial",
"frames",
"local_root_count"
]
},
"ThreadLocalLeakRow": {
"description": "One row of the ThreadLocal Leak Analyzer breakdown: value class name,\nentry counts (total + stale), and total retained heap of the stored values.\nA stale entry is one whose weak referent (the ThreadLocal key) has been\nGC'd but whose value is still strongly held — a classic TL leak signal.",
"type": "object",
"properties": {
"entry_count": {
"description": "Total number of ThreadLocalMap$Entry objects with this value class.",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"retained": {
"description": "Sum of retained heap across all value objects of this class.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"stale_count": {
"description": "Number of entries whose key (referent) has been GC'd (stale entries).",
"type": "integer",
"format": "uint32",
"minimum": 0
},
"value_class": {
"description": "Pretty class name of the stored value object.",
"type": "string"
}
},
"required": [
"value_class",
"entry_count",
"stale_count",
"retained"
]
},
"ThreadLocalObj": {
"description": "One sampled GC-thread-local root object held by a thread: its 1-based object\nindex, class name, and footprint.",
"type": "object",
"properties": {
"display_class": {
"type": "string"
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"retained": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"obj_index_1based",
"display_class",
"shallow",
"retained"
]
},
"ThreadOverview": {
"description": "Aggregates for the \"Threads\" section: one entry per resolved stack trace.",
"type": "object",
"properties": {
"threads": {
"description": "Threads with call stacks, sorted by thread serial for determinism.",
"type": "array",
"items": {
"$ref": "#/$defs/ThreadInfo"
}
}
},
"required": [
"threads"
]
},
"TinyCollectionRow": {
"description": "One row in the tiny-collection overhead ranking (§46.2).",
"type": "object",
"properties": {
"container_kind": {
"type": "string"
},
"empty_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"field": {
"type": "string"
},
"holder_class": {
"type": "string"
},
"overhead_bytes": {
"description": "Estimated overhead bytes: (empty_count + singleton_count) × 80.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"singleton_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"holder_class",
"field",
"container_kind",
"empty_count",
"singleton_count",
"overhead_bytes"
]
},
"TopArrayClassRow": {
"description": "One array class in a \"top array classes by aggregate shallow bytes\" list.\nAdditive.",
"type": "object",
"properties": {
"array_class": {
"type": "string"
},
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"array_class",
"objects",
"shallow"
]
},
"TopArrayRow": {
"description": "One individual array in a \"top arrays by shallow bytes\" list. Additive.",
"type": "object",
"properties": {
"array_class": {
"type": "string"
},
"length": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"non_null": {
"description": "Non-null (occupied) slot count for object arrays; `None` for primitive\narrays (every slot is always occupied). Additive.",
"type": [
"integer",
"null"
],
"format": "uint64",
"default": null,
"minimum": 0
},
"obj_index_1based": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"owner": {
"description": "Primary incoming reference (`Class#field`) that points at this array.\nResolved unconditionally from instance-dump field edges (first-wins).\n`None` when no field edge references this array. Additive.",
"type": [
"string",
"null"
],
"default": null
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"array_class",
"length",
"shallow",
"obj_index_1based"
]
},
"TopArrays": {
"description": "Top arrays for one array category (primitive or object): the largest\nindividual arrays by shallow bytes and the largest array classes by\naggregate shallow bytes. Additive.",
"type": "object",
"properties": {
"top_by_class": {
"type": "array",
"items": {
"$ref": "#/$defs/TopArrayClassRow"
}
},
"top_individual": {
"type": "array",
"items": {
"$ref": "#/$defs/TopArrayRow"
}
}
},
"required": [
"top_individual",
"top_by_class"
]
},
"TopComponents": {
"description": "Eclipse-MAT-style \"Top Components\": retained heap grouped by class loader\n(component), with the top classes inside each. A bounded reduction over the\nper-class retained aggregation (rows <= #loaders), so RSS-safe.",
"type": "object",
"properties": {
"components": {
"description": "Components sorted by retained desc, capped to the top N.",
"type": "array",
"items": {
"$ref": "#/$defs/Component"
}
}
},
"required": [
"components"
]
},
"TopConsumers": {
"description": "Aggregates for the \"Top Consumers\" section.",
"type": "object",
"properties": {
"biggest_classes": {
"type": "array",
"items": {
"$ref": "#/$defs/ClassRow"
}
},
"biggest_objects": {
"type": "array",
"items": {
"$ref": "#/$defs/ObjRow"
}
},
"biggest_packages": {
"description": "Root of the pruned package tree (root name = \"\").",
"$ref": "#/$defs/PackageNode"
},
"size_distribution": {
"description": "Retained-size distribution over ALL top-level dominators (additive;\nnot parity-compared). Empty/zero when there are no top-level dominators.",
"$ref": "#/$defs/TopSizeDistribution",
"default": {
"buckets": [],
"count": 0,
"max": 0,
"median": 0,
"min": 0,
"total": 0
}
},
"threshold_bp": {
"description": "MAT 1%-of-total pruning threshold in basis points (100 bp = 1%).",
"type": "integer",
"format": "uint32",
"minimum": 0
}
},
"required": [
"biggest_objects",
"biggest_classes",
"threshold_bp",
"biggest_packages"
]
},
"TopSizeDistribution": {
"description": "Retained-size distribution over ALL top-level dominators (the biggest\nmemory contributors), bucketed by power-of-two retained size. Additive;\nnot parity-compared. `buckets` empty and stats zero when there are no\ntop-level dominators (empty heap).",
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/$defs/SizeBucket"
}
},
"count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"max": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"median": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"min": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"total": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"buckets",
"count",
"min",
"max",
"median",
"total"
]
},
"TriageSeverity": {
"description": "Severity of a fired OOM-triage signal. Currently carried for future HTML\nstyling (colour per severity); rule order, not severity, drives ordering.",
"type": "string",
"enum": [
"info",
"warning",
"critical"
]
},
"TriageSignal": {
"description": "One fired OOM-triage signal. Rules evaluate the finished `Report` once (see\n`triage.rs`) and emit these; both the Markdown and HTML renderers are dumb\nformatters over `Report.triage`, so rule logic lives in exactly one place.\n\n`detail` may contain `` `code spans` `` in backticks: Markdown keeps them\nverbatim, HTML splits them into `<code>` elements.",
"type": "object",
"properties": {
"anchor": {
"description": "Target section id to link to, e.g. `\"leak-indicators\"`. `None` = no link.",
"type": [
"string",
"null"
]
},
"anchor_label": {
"description": "Link text for `anchor`, e.g. `\"Leak Indicators\"`.",
"type": [
"string",
"null"
]
},
"bytes": {
"description": "Reclaimable/attributable bytes this signal quantifies, when the rule has a\nconcrete figure (e.g. wasted collection bytes, duplicate-String waste). Used\nto rank problem signals by impact; `None` for orientation signals and rules\nwithout a byte figure. Not rendered — ordering only.",
"type": [
"integer",
"null"
],
"format": "uint64",
"minimum": 0
},
"detail": {
"description": "One-sentence explanation; may contain backtick code spans.",
"type": "string"
},
"id": {
"description": "Stable slug identifying the rule, e.g. `\"off-heap\"`.",
"type": "string"
},
"nav_class": {
"description": "Primary class name mentioned in `detail`, when there is exactly one (e.g.\nthe headline retainer class). Enables PivotBtn / OqlBtn in the HTML triage\npanel. `None` when the signal has no single navigable class.",
"type": [
"string",
"null"
]
},
"severity": {
"$ref": "#/$defs/TriageSeverity"
},
"title": {
"description": "Bold label, e.g. `\"Off-heap (DirectByteBuffer)\"`.",
"type": "string"
}
},
"required": [
"id",
"severity",
"title",
"detail"
]
},
"TypeEdge": {
"description": "One aggregated type-level reference edge for the TPFG (V13).",
"type": "object",
"properties": {
"dst_class": {
"type": "string"
},
"edge_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"retained_weight": {
"description": "Sum of src-object retained / out_degree for all instances of this edge type.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"src_class": {
"type": "string"
},
"top_field_names": {
"description": "Top field names (up to 3) through which src references dst, sorted by occurrence.\nEmpty when field-name data was not captured (older dumps or non-instance edges).",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"src_class",
"dst_class",
"edge_count",
"retained_weight"
]
},
"UnreachableClassRow": {
"description": "One row of the unreachable-objects histogram: objects that are not\ndominated by the virtual root (`idom == u32::MAX`), grouped by class.\nAdditive; not parity-compared. Sorted by shallow descending, capped.",
"type": "object",
"properties": {
"objects": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pretty_class": {
"type": "string"
},
"retained": {
"description": "Retained size within the unreachable forest: the sum of shallow sizes of\nevery unreachable object dominated by objects of this class, computed by\na dominator pass over the unreachable subgraph (a synthetic root over the\ngarbage roots). Goes beyond MAT, which discards unreachable objects.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"objects",
"shallow",
"retained"
]
},
"UnreachableGarbageRoot": {
"description": "One node in the per-garbage-root dominator sub-tree. A garbage root is an\nunreachable object that has no unreachable predecessor (entry point of a\ngarbage subtree). Children are capped by depth and fan-out. Additive; not\nparity-compared.",
"type": "object",
"properties": {
"children": {
"description": "Dominated children, sorted retained-desc, capped.",
"type": "array",
"default": [],
"items": {
"$ref": "#/$defs/UnreachableGarbageRoot"
}
},
"objects": {
"description": "Number of real objects in the subtree rooted at this node.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"pretty_class": {
"description": "Human-readable class name of the dominating object at this node.",
"type": "string"
},
"retained": {
"description": "Total retained heap within the subtree rooted at this node (within the\nunreachable forest only).",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"retained",
"objects"
]
},
"ValueTypeShare": {
"description": "One runtime-type share within a collection's element/value tally. Additive.",
"type": "object",
"properties": {
"count": {
"description": "Number of element slots of this type in the group.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"type_name": {
"description": "Pretty runtime class name of the element/value.",
"type": "string"
}
},
"required": [
"type_name",
"count"
]
},
"VizKind": {
"description": "The declared visualization kind. `Table` is the no-op default.",
"type": "string",
"enum": [
"table",
"histogram",
"piechart",
"treemap"
]
},
"VizSpec": {
"description": "A parsed `-- @viz` directive, attached to a `QueryResult`.",
"type": "object",
"properties": {
"cap": {
"description": "Optional top-N cap for the CHART ONLY (table always shows all rows).",
"type": [
"integer",
"null"
],
"format": "uint",
"minimum": 0
},
"kind": {
"$ref": "#/$defs/VizKind"
},
"label_col": {
"description": "Column name (alias or derived) for the label axis; `None` => positional.",
"type": [
"string",
"null"
]
},
"name": {
"description": "Optional display name for the whole query block; overrides the `q{N}`\nauto-label (`name=\"...\"`).",
"type": [
"string",
"null"
]
},
"title": {
"description": "Optional heading rendered above the chart (`title=\"...\"`).",
"type": [
"string",
"null"
]
},
"value_col": {
"description": "Column name for the numeric value axis; `None` => positional.",
"type": [
"string",
"null"
]
}
},
"required": [
"kind"
]
},
"WasteSource": {
"description": "One reclaimable-waste source in the Waste Summary: a human label, the\napproximate reclaimable bytes, and an optional anchor to the section that\ndetails it. Additive.",
"type": "object",
"properties": {
"anchor": {
"description": "Canonical section slug this source drills into (e.g. \"collections\"),\nor None when there is no dedicated section.",
"type": [
"string",
"null"
]
},
"bytes": {
"description": "Approximate reclaimable bytes attributed to this source.",
"type": "integer",
"format": "uint64",
"minimum": 0
},
"label": {
"description": "Human-readable source label, e.g. \"Under-filled collections\".",
"type": "string"
}
},
"required": [
"label",
"bytes"
]
},
"WasteSummary": {
"description": "A single headline \"reclaimable N bytes\" figure folding every waste source\nthe report can quantify (under-filled collections & object arrays, duplicate\nString values, String backing-array slack, duplicate primitive arrays). The\nsources are approximate and may overlap slightly; `total_bytes` is their sum.\nPresent only when at least one source is nonzero. Additive; not part of MAT\nparity comparison.",
"type": "object",
"properties": {
"sources": {
"description": "Per-source breakdown, sorted by bytes desc. Only nonzero sources.",
"type": "array",
"items": {
"$ref": "#/$defs/WasteSource"
}
},
"total_bytes": {
"description": "Sum of every source's bytes (the headline \"reclaimable\" figure).",
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"total_bytes",
"sources"
]
}
}
}