{
"$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"
}
]
},
"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": []
}
}
},
"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"
}
]
},
"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"
},
"overview": {
"$ref": "#/$defs/SystemOverview"
},
"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
},
"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": []
}
}
},
"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"
]
},
"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"
},
"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"
]
},
"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"
]
},
"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"
}
},
"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
},
"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"
}
},
"required": [
"big_drops",
"immediate_dominators"
]
},
"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 `--dup-strings`.",
"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`--dup-strings` 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 `--dup-strings`.",
"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"
},
"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
}
},
"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"
]
},
"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"
]
},
"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"
}
},
"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"
]
},
"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"
}
}
},
"required": [
"by_kind"
]
},
"HistRow": {
"description": "One row of the System-Overview class histogram (full, one row per class).",
"type": "object",
"properties": {
"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
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"instances",
"shallow",
"retained",
"loader_id"
]
},
"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": {
"rows": {
"description": "Rows sorted by dominated_shallow descending, capped.",
"type": "array",
"items": {
"$ref": "#/$defs/ImmediateDominatorRow"
}
}
},
"required": [
"rows"
]
},
"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"
},
"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"
]
},
"ObjRow": {
"description": "One row of \"Biggest Objects\".",
"type": "object",
"properties": {
"display_class": {
"type": "string"
},
"obj_index_1based": {
"type": "integer",
"format": "uint",
"minimum": 0
},
"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"
]
},
"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"
},
"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"
},
"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
}
}
},
"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
},
"top10_bp": {
"type": "integer",
"format": "uint32",
"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
},
"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"
},
"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 the owning thread's retained heap.",
"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"
]
},
"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": {
"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_strings": {
"description": "Approximate duplicate-String analysis, present only when `--dup-strings`\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"
}
},
"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_count": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"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_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"
]
},
"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"
]
},
"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
},
"obj_index_1based": {
"type": "integer",
"format": "uint64",
"minimum": 0
},
"owner": {
"description": "Primary incoming reference (`Class#field`) that points at this array,\nresolved from the `--collections` holder-edge scan. `None` when\n`--collections` was off or no field edge references it. 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"
]
},
"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"
},
"shallow": {
"type": "integer",
"format": "uint64",
"minimum": 0
}
},
"required": [
"pretty_class",
"objects",
"shallow"
]
},
"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"
]
}
}
}