1"use strict";(globalThis.webpackChunkstorm_docs=globalThis.webpackChunkstorm_docs||[]).push([[11479],{42383(e,t,s){s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>c,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"metrics","title":"Metrics","description":"Storm exposes runtime metrics through JMX (Java Management Extensions) MBeans. These metrics give you visibility into template compilation performance, dirty checking behavior, and entity cache efficiency. All MBeans are registered automatically when Storm initializes and aggregate across all ORMTemplate instances in the JVM.","source":"@site/versioned_docs/version-1.11.4/metrics.md","sourceDirName":".","slug":"/metrics","permalink":"/docs/1.11.4/metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/storm-orm/storm-framework/edit/main/docs/metrics.md","tags":[],"version":"1.11.4","frontMatter":{},"sidebar":"docs","previous":{"title":"SQL Logging","permalink":"/docs/1.11.4/sql-logging"},"next":{"title":"Storm vs Other Frameworks","permalink":"/docs/1.11.4/comparison"}}');var r=s(74848),i=s(28453);s(4865),s(19365);const c={},d="Metrics",l={},a=[{value:"Template Metrics",id:"template-metrics",level:2},{value:"Available Attributes",id:"available-attributes",level:3},{value:"Operations",id:"operations",level:3},{value:"Dirty Check Metrics",id:"dirty-check-metrics",level:2},{value:"Entity-Level Counters",id:"entity-level-counters",level:3},{value:"Resolution Path Counters",id:"resolution-path-counters",level:3},{value:"Mode and Strategy Breakdown",id:"mode-and-strategy-breakdown",level:3},{value:"Field-Level Counters",id:"field-level-counters",level:3},{value:"Shape Counters",id:"shape-counters",level:3},{value:"Per-Entity Configuration",id:"per-entity-configuration",level:3},{value:"Operations",id:"operations-1",level:3},{value:"Entity Cache Metrics",id:"entity-cache-metrics",level:2},{value:"Lookup Counters",id:"lookup-counters",level:3},{value:"Intern Counters",id:"intern-counters",level:3},{value:"Lifecycle Counters",id:"lifecycle-counters",level:3},{value:"Per-Entity Configuration",id:"per-entity-configuration-1",level:3},{value:"Operations",id:"operations-2",level:3}];function o(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"metrics",children:"Metrics"})}),"\n",(0,r.jsxs)(t.p,{children:["Storm exposes runtime metrics through JMX (Java Management Extensions) MBeans. These metrics give you visibility into template compilation performance, dirty checking behavior, and entity cache efficiency. All MBeans are registered automatically when Storm initializes and aggregate across all ",(0,r.jsx)(t.code,{children:"ORMTemplate"})," instances in the JVM."]}),"\n",(0,r.jsxs)(t.p,{children:["To view these metrics, connect to the JVM with any JMX client (JConsole, VisualVM, or your monitoring platform) and navigate to the ",(0,r.jsx)(t.code,{children:"st.orm"})," domain. If your application uses Spring Boot Actuator, the MBeans are also accessible through Actuator's JMX endpoint."]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"template-metrics",children:"Template Metrics"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"MBean name:"})," ",(0,r.jsx)(t.code,{children:"st.orm:type=TemplateMetrics"})]}),"\n",(0,r.jsx)(t.p,{children:"Storm compiles SQL templates into reusable prepared statement shapes. This compilation step resolves aliases, derives joins, and expands column lists. The template cache avoids repeating this work for the same query pattern with different parameter values. These metrics help you understand whether the cache is effective."}),"\n",(0,r.jsx)(t.h3,{id:"available-attributes",children:"Available Attributes"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Requests"})}),(0,r.jsx)(t.td,{children:"Total number of template requests"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Hits"})}),(0,r.jsx)(t.td,{children:"Number of cache hits"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Misses"})}),(0,r.jsx)(t.td,{children:"Number of cache misses"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"HitRatioPercent"})}),(0,r.jsx)(t.td,{children:"Hit ratio as a percentage (0-100)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"AvgRequestMicros"})}),(0,r.jsx)(t.td,{children:"Average request duration in microseconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"MaxRequestMicros"})}),(0,r.jsx)(t.td,{children:"Maximum request duration in microseconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"AvgHitMicros"})}),(0,r.jsx)(t.td,{children:"Average cache hit duration in microseconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"MaxHitMicros"})}),(0,r.jsx)(t.td,{children:"Maximum cache hit duration in microseconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"AvgMissMicros"})}),(0,r.jsx)(t.td,{children:"Average cache miss duration in microseconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"MaxMissMicros"})}),(0,r.jsx)(t.td,{children:"Maximum cache miss duration in microseconds"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["A high ",(0,r.jsx)(t.code,{children:"HitRatioPercent"})," (above 95%) indicates the cache is working well. If you see frequent misses, your application may have many dynamically constructed query patterns. Consider increasing the cache size via ",(0,r.jsx)(t.code,{children:"storm.template_cache.size"})," (see ",(0,r.jsx)(t.a,{href:"/docs/1.11.4/configuration#template-cache-properties",children:"Configuration"}),") or reducing the number of distinct query shapes."]}),"\n",(0,r.jsx)(t.h3,{id:"operations",children:"Operations"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Operation"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"reset()"})}),(0,r.jsx)(t.td,{children:"Resets all counters to zero"})]})})]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"dirty-check-metrics",children:"Dirty Check Metrics"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"MBean name:"})," ",(0,r.jsx)(t.code,{children:"st.orm:type=DirtyCheckMetrics"})]}),"\n",(0,r.jsxs)(t.p,{children:["Dirty checking determines whether an UPDATE statement is sent to the database and which columns it includes. These metrics aggregate across all dirty checks performed by entity repositories, giving you visibility into how often updates are skipped, which resolution paths are taken, and how your ",(0,r.jsx)(t.code,{children:"max_shapes"})," budget is being used. For background on how dirty checking works, see ",(0,r.jsx)(t.a,{href:"/docs/1.11.4/dirty-checking",children:"Dirty Checking"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"entity-level-counters",children:"Entity-Level Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Checks"})}),(0,r.jsx)(t.td,{children:"Total number of dirty checks performed"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Clean"})}),(0,r.jsx)(t.td,{children:"Number of checks that found the entity unchanged (update skipped)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Dirty"})}),(0,r.jsx)(t.td,{children:"Number of checks that found the entity changed (update triggered)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"CleanRatioPercent"})}),(0,r.jsx)(t.td,{children:"Percentage of checks where the update was skipped (0-100)"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["A high ",(0,r.jsx)(t.code,{children:"CleanRatioPercent"})," indicates that many updates are avoided because the entity has not changed since it was read. If this ratio is low and your application frequently calls ",(0,r.jsx)(t.code,{children:"update()"})," on unmodified entities, consider reviewing your update logic."]}),"\n",(0,r.jsx)(t.h3,{id:"resolution-path-counters",children:"Resolution Path Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"IdentityMatches"})}),(0,r.jsxs)(t.td,{children:["Checks resolved by identity comparison (",(0,r.jsx)(t.code,{children:"cached == entity"}),"), the cheapest path"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"CacheMisses"})}),(0,r.jsx)(t.td,{children:"Checks where no cached baseline was available, causing a fallback to full-entity update"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["High ",(0,r.jsx)(t.code,{children:"CacheMisses"})," may indicate that the entity cache is being cleared prematurely. Consider switching from ",(0,r.jsx)(t.code,{children:"light"})," to ",(0,r.jsx)(t.code,{children:"default"})," cache retention if cache misses are frequent. See ",(0,r.jsx)(t.a,{href:"/docs/1.11.4/entity-cache",children:"Entity Cache"})," for details."]}),"\n",(0,r.jsx)(t.h3,{id:"mode-and-strategy-breakdown",children:"Mode and Strategy Breakdown"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"EntityModeChecks"})}),(0,r.jsxs)(t.td,{children:["Checks that used ",(0,r.jsx)(t.code,{children:"ENTITY"})," update mode (full-row UPDATE on any change)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"FieldModeChecks"})}),(0,r.jsxs)(t.td,{children:["Checks that used ",(0,r.jsx)(t.code,{children:"FIELD"})," update mode (column-level UPDATE)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"InstanceStrategyChecks"})}),(0,r.jsxs)(t.td,{children:["Checks that used ",(0,r.jsx)(t.code,{children:"INSTANCE"})," strategy (identity-based field comparison)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"ValueStrategyChecks"})}),(0,r.jsxs)(t.td,{children:["Checks that used ",(0,r.jsx)(t.code,{children:"VALUE"})," strategy (equality-based field comparison)"]})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"field-level-counters",children:"Field-Level Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"FieldComparisons"})}),(0,r.jsx)(t.td,{children:"Total number of individual field comparisons across all dirty checks"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"FieldClean"})}),(0,r.jsx)(t.td,{children:"Number of field comparisons where the field was unchanged"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"FieldDirty"})}),(0,r.jsx)(t.td,{children:"Number of field comparisons where the field was different"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"shape-counters",children:"Shape Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"EntityTypes"})}),(0,r.jsx)(t.td,{children:"Number of distinct entity types that have generated UPDATE shapes"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Shapes"})}),(0,r.jsx)(t.td,{children:"Total number of distinct UPDATE statement shapes across all entity types"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"ShapesPerEntity"})}),(0,r.jsx)(t.td,{children:"Map of entity type name to the number of shapes for that type"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["Compare ",(0,r.jsx)(t.code,{children:"ShapesPerEntity"})," values against the configured ",(0,r.jsx)(t.code,{children:"storm.update.max_shapes"})," to determine if any entity type is exhausting its shape budget. When the limit is reached, Storm falls back to full-row updates for that entity type."]}),"\n",(0,r.jsx)(t.h3,{id:"per-entity-configuration",children:"Per-Entity Configuration"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"UpdateModePerEntity"})}),(0,r.jsxs)(t.td,{children:["Map of entity type name to effective update mode (",(0,r.jsx)(t.code,{children:"FIELD"}),", ",(0,r.jsx)(t.code,{children:"ENTITY"}),", ",(0,r.jsx)(t.code,{children:"OFF"}),")"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"DirtyCheckPerEntity"})}),(0,r.jsxs)(t.td,{children:["Map of entity type name to effective dirty check strategy (",(0,r.jsx)(t.code,{children:"INSTANCE"}),", ",(0,r.jsx)(t.code,{children:"VALUE"}),")"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"MaxShapesPerEntity"})}),(0,r.jsx)(t.td,{children:"Map of entity type name to configured max shapes limit"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"operations-1",children:"Operations"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Operation"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"reset()"})}),(0,r.jsx)(t.td,{children:"Resets all counters to zero"})]})})]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h2,{id:"entity-cache-metrics",children:"Entity Cache Metrics"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"MBean name:"})," ",(0,r.jsx)(t.code,{children:"st.orm:type=EntityCacheMetrics"})]}),"\n",(0,r.jsxs)(t.p,{children:["Storm maintains a transaction-scoped entity cache that ensures the same database row maps to the same object instance within a single transaction. These metrics aggregate across all transaction-scoped entity caches, providing visibility into cache hit rates, eviction patterns, and retention behavior. For background on how the cache works, see ",(0,r.jsx)(t.a,{href:"/docs/1.11.4/entity-cache",children:"Entity Cache"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"lookup-counters",children:"Lookup Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Gets"})}),(0,r.jsxs)(t.td,{children:["Total number of ",(0,r.jsx)(t.code,{children:"get()"})," calls (cache lookups)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"GetHits"})}),(0,r.jsx)(t.td,{children:"Number of lookups that returned a cached entity"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"GetMisses"})}),(0,r.jsx)(t.t
1d,{children:"Number of lookups where no cached entity was available"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"GetHitRatioPercent"})}),(0,r.jsx)(t.td,{children:"Get hit ratio as a percentage (0-100)"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["A low ",(0,r.jsx)(t.code,{children:"GetHitRatioPercent"})," in combination with frequent ",(0,r.jsx)(t.code,{children:"update()"})," calls suggests that entities are being evicted before they can serve as dirty-check baselines. Consider switching to ",(0,r.jsx)(t.code,{children:"default"})," cache retention."]}),"\n",(0,r.jsx)(t.h3,{id:"intern-counters",children:"Intern Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Interns"})}),(0,r.jsxs)(t.td,{children:["Total number of ",(0,r.jsx)(t.code,{children:"intern()"})," calls (cache insertions)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"InternHits"})}),(0,r.jsx)(t.td,{children:"Number of intern calls that reused an existing canonical instance"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"InternMisses"})}),(0,r.jsx)(t.td,{children:"Number of intern calls that stored a new or updated instance"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"InternHitRatioPercent"})}),(0,r.jsx)(t.td,{children:"Intern hit ratio as a percentage (0-100)"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"lifecycle-counters",children:"Lifecycle Counters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Removals"})}),(0,r.jsx)(t.td,{children:"Number of cache entries removed due to entity mutations (insert, update, delete)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Clears"})}),(0,r.jsx)(t.td,{children:"Number of full cache clears"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"Evictions"})}),(0,r.jsx)(t.td,{children:"Number of cache entries cleaned up after garbage collection"})]})]})]}),"\n",(0,r.jsxs)(t.p,{children:["High ",(0,r.jsx)(t.code,{children:"Evictions"})," values indicate that entities are being garbage collected while still in the cache. This is expected with ",(0,r.jsx)(t.code,{children:"light"})," retention but unusual with ",(0,r.jsx)(t.code,{children:"default"})," retention unless the JVM is under memory pressure."]}),"\n",(0,r.jsx)(t.h3,{id:"per-entity-configuration-1",children:"Per-Entity Configuration"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Attribute"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"RetentionPerEntity"})}),(0,r.jsxs)(t.td,{children:["Map of entity type name to effective retention mode (",(0,r.jsx)(t.code,{children:"DEFAULT"}),", ",(0,r.jsx)(t.code,{children:"LIGHT"}),")"]})]})})]}),"\n",(0,r.jsx)(t.h3,{id:"operations-2",children:"Operations"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Operation"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"reset()"})}),(0,r.jsx)(t.td,{children:"Resets all counters to zero"})]})})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},19365(e,t,s){s.d(t,{A:()=>l});s(96540);var n=s(34164),r=s(47751);const i="tabItem_Ymn6";var c=s(74848);function d({children:e,className:t,hidden:s}){return(0,c.jsx)("div",{role:"tabpanel",className:(0,n.A)(i,t),hidden:s,children:e})}function l({children:e,className:t,value:s}){const{selectedValue:n,lazy:i}=(0,r.uc)(),l=s===n;return!l&&i?null:(0,c.jsx)(d,{className:t,hidden:!l,children:e})}},4865(e,t,s){s.d(t,{A:()=>j});s(96540);var n=s(34164),r=s(17559),i=s(47751),c=s(23104),d=s(92303);const l="tabList__CuJ",a="tabItem_LNqP";var o=s(74848);function h({className:e}){const{selectedValue:t,selectValue:s,tabValues:r,block:d}=(0,i.uc)(),l=[],{blockElementScrollPositionUntilNextRender:h}=(0,c.a_)(),u=e=>{const n=e.currentTarget,i=l.indexOf(n),c=r[i].value;c!==t&&(h(n),s(c))},x=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;t=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;t=l[s]??l[l.length-1];break}}t?.focus()};return(0,o.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":d},e),children:r.map(({value:e,label:s,attributes:r})=>(0,o.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:x,onClick:u,...r,className:(0,n.A)("tabs__item",a,r?.className,{"tabs__item--active":t===e}),children:s??e},e))})}function u({children:e}){return(0,o.jsx)("div",{className:"margin-top--md",children:e})}function x({className:e,children:t}){return(0,o.jsxs)("div",{className:(0,n.A)(r.G.tabs.container,"tabs-container",l),children:[(0,o.jsx)(h,{className:e}),(0,o.jsx)(u,{children:t})]})}function j(e){const t=(0,d.A)(),s=(0,i.OC)(e);return(0,o.jsx)(i.O_,{value:s,children:(0,o.jsx)(x,{className:e.className,children:(0,i.vT)(e.children)})},String(t))}},47751(e,t,s){s.d(t,{OC:()=>j,O_:()=>f,uc:()=>m,vT:()=>o});var n=s(96540),r=s(56347),i=s(205),c=s(57485),d=s(70679),l=s(31682),a=s(74848);function o(e){return n.Children.toArray(e).filter(e=>"\n"!==e)}function h(e){const{values:t,children:s}=e;return(0,n.useMemo)(()=>{const e=t??function(e){return n.Children.toArray(e).flatMap(e=>{if(!e)return[];if((0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return[e];
1const t="string"==typeof e.type?e.type:e.type.name;throw new Error(`Docusaurus error: Bad <Tabs> child <${t}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.\nIf you do not want to pass on a "value" prop to the direct children of <Tabs>, you can also pass an explicit <Tabs values={...}> prop.`)}).map(({props:{value:e,label:t,attributes:s,default:n}})=>({value:e,label:t,attributes:s,default:n}))}(s);return function(e){const t=(0,l.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,s])}function u({value:e,tabValues:t}){return t.some(t=>t.value===e)}function x({queryString:e=!1,groupId:t}){const s=(0,r.W6)(),i=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,c.aZ)(i),(0,n.useCallback)(e=>{if(!i)return;const t=new URLSearchParams(s.location.search);t.set(i,e),s.replace({...s.location,search:t.toString()})},[i,s])]}function j(e){const{defaultValue:t,queryString:s=!1,groupId:r}=e,c=h(e),[l,a]=(0,n.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!u({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=t.find(e=>e.default)??t[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:t,tabValues:c})),[o,j]=x({queryString:s,groupId:r}),[p,m]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,r]=(0,d.Dv)(t);return[s,(0,n.useCallback)(e=>{t&&r.set(e)},[t,r])]}({groupId:r}),f=(()=>{const e=o??p;return u({value:e,tabValues:c})?e:null})();(0,i.A)(()=>{f&&a(f)},[f]);return{selectedValue:l,selectValue:(0,n.useCallback)(e=>{if(!u({value:e,tabValues:c}))throw new Error(`Can't select invalid tab value=${e}`);a(e),j(e),m(e)},[j,m,c]),tabValues:c,lazy:e.lazy??!1,block:e.block??!1}}const p=(0,n.createContext)(null);function m(){const e=n.useContext(p);if(!e)throw new Error("useTabsContext() must be used within a Tabs component");return e}function f(e){return(0,a.jsx)(p.Provider,{value:e.value,children:e.children})}},28453(e,t,s){s.d(t,{R:()=>c,x:()=>d});var n=s(96540);const r={},i=n.createContext(r);function c(e){const t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.