Class AtnManager
- Direct Known Subclasses:
LexerAtnManager,ParserAtnManager
The mutable prediction caches (DFA states, prediction contexts, LL(1) table) live on a
private ATN owned by a softly referenced AtnManager.AtnWrapper, not on the
generated parser's static ATN. That single decision provides the memory-pressure
response: while parsers are active the wrapper is strongly reachable through their
interpreters, and once this copy of the runtime goes idle the whole cache graph is only
softly reachable, so the collector reclaims it directly — no cleaner thread (which
would pin the defining class loader for the life of the JVM, GROOVY-12142), and no
clear-on-next-parse canary (which never fires for an idle copy: a build daemon caches
one runtime copy per distinct classpath, and every idle copy's fully warmed cache
stayed strongly reachable until the daemon spent more time collecting than parsing).
Two deterministic mechanisms bound the cache while a copy is active, and they compose:
- a size ceiling —
groovy.antlr4.cache.sizeDFA states retained across the shared ATN; exceeding it replaces the wrapper with a fresh one. The default scales with the heap so a large daemon keeps a warm working set while a small JVM stays protected. - a parse counter — replaces the wrapper every
groovy.antlr4.cache.thresholdparses, for workloads that want a fixed cadence. Off by default.
-
Nested Class Summary
Nested Classes -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected abstract AtnManager.AtnWrapperorg.antlr.v4.runtime.atn.ATNgetATN()protected AtnManager.AtnWrapperprotected abstract boolean
-
Field Details
-
READ_LOCK
-
-
Constructor Details
-
AtnManager
public AtnManager()
-
-
Method Details
-
getATN
public org.antlr.v4.runtime.atn.ATN getATN() -
createAtnWrapper
-
getAtnWrapper
-
shouldClearDfaCache
protected abstract boolean shouldClearDfaCache()
-