Skip to content

fix: prevent Metaspace memory leak in dynamic script scenarios#95

Open
pavankadabala-png wants to merge 1 commit into
dromara:masterfrom
pavankadabala-png:fix/metaspace-memory-leak
Open

fix: prevent Metaspace memory leak in dynamic script scenarios#95
pavankadabala-png wants to merge 1 commit into
dromara:masterfrom
pavankadabala-png:fix/metaspace-memory-leak

Conversation

@pavankadabala-png
Copy link
Copy Markdown

Issue

#92 - FlowBus.unloadScriptNode() 无法释放 Metaspace

Problem

When ETL systems dynamically create and destroy script nodes frequently:

  1. FlowBus.unloadScriptNode() removes reference from LiteFlow's map
  2. But underlying Liquor evaluator's tempClassLoader still holds bytecode
  3. JVM can't unload classes until ClassLoader is garbage collected
  4. ClassLoader never replaced (unless 10,000 compilations happen)
  5. Result: Metaspace fills up after 1-2 weeks → OOM crash

Solution

Added ClassLoader reset mechanism:

Changes

  1. JavaxExecutor.resetClassLoader()

    • Forces Liquor to replace its tempClassLoader
    • Uses reflection to trigger natural replacement logic
    • Safe, version-resilient, graceful fallback
  2. FlowBus.unloadScriptNodesAndResetClassLoader()

    • Convenience method for batch cleanup
    • Unloads nodes then resets ClassLoader
    • Recommended for dynamic script scenarios
  3. MemoryLeakTest

    • Simulates customer's ETL scenario (1000+ script node cycles)
    • Monitors Metaspace to verify leak is fixed
    • Passes when growth < 10MB across iterations

Testing

  • MemoryLeakTest passes: verifies < 10MB growth across 1000 node cycles
  • All existing tests pass
  • No regression in performance or functionality

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant