From b7c803f07546f118826b728027927835bda7f49e Mon Sep 17 00:00:00 2001 From: Carl Chesser Date: Thu, 10 Sep 2026 15:56:15 -0500 Subject: [PATCH] Upgrading to Java 25, adding java-heap-mcp, adding slides --- .github/workflows/maven.yml | 4 +- .gitignore | 2 + .tool-versions | 4 +- .vscode/settings.json | 3 +- README.md | 186 ++- docs/.tool-versions | 4 +- docs/content/docs/prereqs/_index.md | 4 +- docs/content/docs/talks/_index.md | 4 +- .../img/heap-space-nine-title.png | Bin 0 -> 186372 bytes .../static/slides/heap-space-nine/img/mcp.png | Bin 0 -> 495245 bytes docs/static/slides/heap-space-nine/img/qr.png | Bin 0 -> 20374 bytes .../img/simple-system-diagram.png | Bin 0 -> 170698 bytes docs/static/slides/heap-space-nine/index.html | 1380 +++++++++++++++++ .../slides/heap-space-nine/og-image.svg | 12 + java-heap-mcp/README.md | 129 ++ java-heap-mcp/THIRD_PARTY_NOTICES.md | 106 ++ java-heap-mcp/docs/architecture.md | 78 + java-heap-mcp/licenses/EPL-2.0.txt | 15 + java-heap-mcp/licenses/MIT-DEFLATE.txt | 25 + java-heap-mcp/pom.xml | 214 +++ java-heap-mcp/scripts/run-server.sh | 33 + .../mcp/cache/CacheMetadataStore.java | 85 + .../mcp/cache/CachedHeapDumpRecord.java | 21 + .../mcp/cache/HeapDumpFingerprint.java | 54 + .../mcp/calcite/CalciteDataSource.java | 124 ++ .../javaperf/mcp/calcite/HeapReference.java | 143 ++ .../javaperf/mcp/calcite/RowSetTable.java | 137 ++ .../javaperf/mcp/calcite/SnapshotHolder.java | 31 + .../collections/CollectionsActions.java | 41 + .../CompactHashMapCollectionExtractor.java | 158 ++ .../DexxHashMapCollectionExtractor.java | 160 ++ .../mcp/calcite/collections/IObjectsPair.java | 34 + .../functions/CollectionsFunctions.java | 187 +++ .../mcp/calcite/functions/HeapFunctions.java | 255 +++ .../calcite/functions/HeapFunctionsBase.java | 52 + .../mcp/calcite/functions/IClassMethods.java | 39 + .../mcp/calcite/functions/IObjectMethods.java | 32 + .../calcite/functions/ISnapshotMethods.java | 45 + .../calcite/functions/SnapshotFunctions.java | 105 ++ .../mcp/calcite/functions/TableFunctions.java | 228 +++ .../mcp/calcite/neo/GroupEnumerator.java | 106 ++ .../mcp/calcite/neo/PackageSchema.java | 159 ++ .../neo/SnapshotThreadStacksTable.java | 122 ++ .../rex/ExecutionRexBuilderContext.java | 67 + .../mcp/calcite/rex/RexBuilderContext.java | 72 + .../mcp/calcite/rules/DefaultRuleConfig.java | 60 + .../calcite/rules/InstanceAccessByIdRule.java | 30 + .../schema/objects/ClassRowTypeCache.java | 228 +++ .../mcp/calcite/schema/objects/Field.java | 50 + .../schema/objects/HeapOperatorTable.java | 113 ++ .../calcite/schema/objects/IClassesList.java | 62 + .../objects/InstanceAccessByClassIdRule.java | 63 + .../schema/objects/InstanceByClassTable.java | 66 + .../objects/InstanceByClassTableScan.java | 42 + .../objects/InstanceIdsByClassTable.java | 79 + .../objects/SnapshotRexExpressions.java | 39 + .../calcite/schema/objects/SpecialFields.java | 12 + .../references/OutboundReferencesTable.java | 71 + .../javaperf/mcp/config/ServerConfig.java | 71 + .../javaperf/mcp/heap/DominatorEntry.java | 10 + .../javaperf/mcp/heap/GcRootPath.java | 9 + .../mcp/heap/HeapAnalysisService.java | 25 + .../javaperf/mcp/heap/HeapDumpManager.java | 295 ++++ .../javaperf/mcp/heap/HeapErrorCode.java | 11 + .../mcp/heap/HeapOperationException.java | 37 + .../javaperf/mcp/heap/HeapOverview.java | 11 + .../javaperf/mcp/heap/HeapSession.java | 17 + .../javaperf/mcp/heap/HistogramEntry.java | 10 + .../javaperf/mcp/heap/LoadedHeap.java | 14 + .../javaperf/mcp/heap/MatHeapService.java | 397 +++++ .../javaperf/mcp/heap/MatLoadedHeap.java | 26 + .../javaperf/mcp/heap/MatRuntime.java | 285 ++++ .../javaperf/mcp/heap/ObjectFieldValue.java | 9 + .../javaperf/mcp/heap/ObjectInspection.java | 18 + .../javaperf/mcp/heap/ObjectReference.java | 9 + .../javaperf/mcp/heap/OqlGrammar.java | 93 ++ .../javaperf/mcp/heap/OqlQueryResult.java | 15 + .../javaperf/mcp/mcp/McpServerEngine.java | 54 + .../cchesser/javaperf/mcp/mcp/McpTool.java | 17 + .../javaperf/mcp/mcp/ToolRegistry.java | 127 ++ .../mcp/server/HeapMcpServerApplication.java | 45 + .../javaperf/mcp/util/JsonSupport.java | 18 + .../cchesser/javaperf/mcp/util/Timeouts.java | 42 + .../javaperf/mcp/web/WebUiServer.java | 354 +++++ .../src/main/resources/web/index.html | 184 +++ .../mcp/cache/CacheMetadataStoreTest.java | 38 + .../mcp/cache/HeapDumpFingerprintTest.java | 28 + .../mcp/heap/HeapDumpManagerTest.java | 110 ++ .../javaperf/mcp/heap/OqlGrammarTest.java | 31 + .../javaperf/mcp/mcp/McpServerEngineTest.java | 112 ++ java-heap-workbench/.gitignore | 4 + java-heap-workbench/README.md | 101 ++ java-heap-workbench/build.mjs | 26 + java-heap-workbench/docs/architecture.md | 90 ++ java-heap-workbench/index.html | 14 + java-heap-workbench/package-lock.json | 12 + java-heap-workbench/package.json | 11 + java-heap-workbench/src/a2ui.js | 197 +++ java-heap-workbench/src/ag-ui.js | 15 + java-heap-workbench/src/agent-prompt.js | 28 + java-heap-workbench/src/logo.svg | 18 + java-heap-workbench/src/main.js | 280 ++++ java-heap-workbench/src/oql.js | 36 + java-heap-workbench/src/styles.css | 16 + .../src/visualization-policy.js | 42 + java-heap-workbench/test/build.test.mjs | 116 ++ java-perf-workshop-server/pom.xml | 2 +- java-perf-workshop-tester/pom.xml | 7 +- pom.xml | 69 +- 109 files changed, 9162 insertions(+), 19 deletions(-) create mode 100644 docs/static/slides/heap-space-nine/img/heap-space-nine-title.png create mode 100644 docs/static/slides/heap-space-nine/img/mcp.png create mode 100644 docs/static/slides/heap-space-nine/img/qr.png create mode 100644 docs/static/slides/heap-space-nine/img/simple-system-diagram.png create mode 100644 docs/static/slides/heap-space-nine/index.html create mode 100644 docs/static/slides/heap-space-nine/og-image.svg create mode 100644 java-heap-mcp/README.md create mode 100644 java-heap-mcp/THIRD_PARTY_NOTICES.md create mode 100644 java-heap-mcp/docs/architecture.md create mode 100644 java-heap-mcp/licenses/EPL-2.0.txt create mode 100644 java-heap-mcp/licenses/MIT-DEFLATE.txt create mode 100644 java-heap-mcp/pom.xml create mode 100755 java-heap-mcp/scripts/run-server.sh create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CacheMetadataStore.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CachedHeapDumpRecord.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprint.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/CalciteDataSource.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/HeapReference.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/RowSetTable.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/SnapshotHolder.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CollectionsActions.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CompactHashMapCollectionExtractor.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/DexxHashMapCollectionExtractor.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/IObjectsPair.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/CollectionsFunctions.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctions.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctionsBase.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IClassMethods.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IObjectMethods.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/ISnapshotMethods.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/SnapshotFunctions.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/TableFunctions.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/GroupEnumerator.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/PackageSchema.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/SnapshotThreadStacksTable.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/ExecutionRexBuilderContext.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/RexBuilderContext.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/DefaultRuleConfig.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/InstanceAccessByIdRule.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/ClassRowTypeCache.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/Field.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/HeapOperatorTable.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/IClassesList.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceAccessByClassIdRule.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTable.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTableScan.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceIdsByClassTable.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SnapshotRexExpressions.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SpecialFields.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/references/OutboundReferencesTable.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/config/ServerConfig.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/DominatorEntry.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/GcRootPath.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapAnalysisService.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapDumpManager.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapErrorCode.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOperationException.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOverview.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapSession.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HistogramEntry.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/LoadedHeap.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatHeapService.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatLoadedHeap.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatRuntime.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectFieldValue.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectInspection.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectReference.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlGrammar.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlQueryResult.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpServerEngine.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpTool.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/ToolRegistry.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/server/HeapMcpServerApplication.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/JsonSupport.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/Timeouts.java create mode 100644 java-heap-mcp/src/main/java/cchesser/javaperf/mcp/web/WebUiServer.java create mode 100644 java-heap-mcp/src/main/resources/web/index.html create mode 100644 java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/CacheMetadataStoreTest.java create mode 100644 java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprintTest.java create mode 100644 java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/HeapDumpManagerTest.java create mode 100644 java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/OqlGrammarTest.java create mode 100644 java-heap-mcp/src/test/java/cchesser/javaperf/mcp/mcp/McpServerEngineTest.java create mode 100644 java-heap-workbench/.gitignore create mode 100644 java-heap-workbench/README.md create mode 100644 java-heap-workbench/build.mjs create mode 100644 java-heap-workbench/docs/architecture.md create mode 100644 java-heap-workbench/index.html create mode 100644 java-heap-workbench/package-lock.json create mode 100644 java-heap-workbench/package.json create mode 100644 java-heap-workbench/src/a2ui.js create mode 100644 java-heap-workbench/src/ag-ui.js create mode 100644 java-heap-workbench/src/agent-prompt.js create mode 100644 java-heap-workbench/src/logo.svg create mode 100644 java-heap-workbench/src/main.js create mode 100644 java-heap-workbench/src/oql.js create mode 100644 java-heap-workbench/src/styles.css create mode 100644 java-heap-workbench/src/visualization-policy.js create mode 100644 java-heap-workbench/test/build.test.mjs diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index ab4e47a..1e2a161 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: - distribution: 'adopt' - java-version: '21' + distribution: 'temurin' + java-version: '25' - name: Build with Maven run: mvn -B verify --file pom.xml diff --git a/.gitignore b/.gitignore index 9b2ff43..95f94cb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .classpath .project .settings +.m2 # IntelliJ project files .idea @@ -24,6 +25,7 @@ pom.xml.versionsBackup .DS_Store *.jar +*.hprof # Eclipse Project files .metadata diff --git a/.tool-versions b/.tool-versions index 7e23f8c..456a106 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -java oracle-21 -maven 3.9.12 +java oracle-25 +maven 3.9.16 diff --git a/.vscode/settings.json b/.vscode/settings.json index e0f15db..0be1c0c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "java.configuration.updateBuildConfiguration": "automatic" + "java.configuration.updateBuildConfiguration": "automatic", + "java.compile.nullAnalysis.mode": "automatic" } \ No newline at end of file diff --git a/README.md b/README.md index e60d408..8f5a65e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,191 @@ -## Java Performance Workshop +# Java Performance Workshop A tutorial workshop that will dive in understanding "what's going on in your JVM". This workshop is utilizing a basic web service that is included, which isn't exactly optimal in how it performs. The goal is to use this service as an interactive example and identify its poor performing elements. To learn more about this web service that is included, see [the site](https://jvmperf.net/). + +## Projects in this repository + +| Project | Purpose | How to run | +| --- | --- | --- | +| `java-perf-workshop-server` | An intentionally inefficient Dropwizard web service used by the performance workshop. | Build the reactor, start WireMock for the remote dependency, then run the shaded server JAR. | +| `java-perf-workshop-tester` | Gatling and Scala simulations for exercising the workshop service under load. | Start the workshop server, then run the Gatling Maven goal. | +| `java-heap-mcp` | A Java MCP server for loading and analyzing `.hprof` heap dumps utilizing components of Eclipse MCP. | Run `scripts/run-server.sh` for MCP stdio, or enable its local HTTP UI. | +| `java-heap-workbench` | A browser UI that connects a local agent to the heap-analysis MCP server and renders visual results. | Build and serve it with the npm scripts after starting `java-heap-mcp`. | +| `java-heap-agent-example` | Reference material for an agent skill that explains how to query heap information with your coding agent | Read the skill documentation; it is not a Maven module or standalone service. | + +The three Java services are part of the root Maven reactor. Build and test them +from the repository root with: + +```bash +mvn test +``` + +The workshop server skips Docker image creation by default. To run the original +performance workshop locally, start the mocked upstream service first: + +```bash +mvn dependency:copy \ + -Dartifact=com.github.tomakehurst:wiremock-standalone:2.27.2 \ + -Dmdep.stripVersion=true \ + -DoutputDirectory=. +java -jar wiremock-standalone.jar \ + --port 9090 \ + --root-dir java-perf-workshop-server/src/test/resources +``` + +In another terminal, build and start the workshop server: + +```bash +mvn -pl java-perf-workshop-server package +java -jar java-perf-workshop-server/target/java-perf-workshop-server-2.0-SNAPSHOT.jar \ + server server.yml +``` + +The service is then available at . With the server and +WireMock running, execute the load simulations with: + +```bash +mvn -pl java-perf-workshop-tester gatling:test +``` + +Results are written under `java-perf-workshop-tester/target/gatling/`. + +## Java Heap Workbench + +Java Heap Workbench combines a Java heap-analysis MCP server with a local-agent web interface. Load a `.hprof` dump, ask questions in natural language, and receive visual analysis such as summary cards, charts, tables, and OQL results. + +### Repository modules + +| Module | Purpose | Documentation | +| --- | --- | --- | +| `java-heap-mcp` | Java 25/Maven server backed by Eclipse Memory Analyzer (MAT). It loads heap dumps, manages cached projects, and exposes OQL and heap-analysis tools over MCP plus a local HTTP API. | [`java-heap-mcp/README.md`](java-heap-mcp/README.md) | +| `java-heap-workbench` | Browser UI that connects Ollama or OpenRouter to the MCP HTTP API, emits AG-UI-compatible run events, and renders A2UI-style cards, charts, and tables. | [`java-heap-workbench/README.md`](java-heap-workbench/README.md) | + +The normal request path is: + +```text +Browser workbench → Ollama or OpenRouter model → MCP HTTP API → Eclipse MAT → heap dump + ↑ ↓ + └──── visual A2UI response + AG-UI run events +``` + +The MCP server also supports its native stdio protocol for MCP clients. The workbench uses the server's local HTTP API because it runs directly in the browser. + +### Prerequisites + +- Java 25 or newer +- Maven (the repository includes a local `.m2` directory configuration) +- Node.js 20 or newer +- [Ollama](https://ollama.com/) with a tool-capable chat model, or an [OpenRouter](https://openrouter.ai/) API key +- A Java `.hprof` heap dump + +### Complete setup + +Run each long-lived process in its own terminal. + +#### 1. Build and test the MCP server + +From the repository root: + +```bash +cd java-heap-mcp +mvn -Dmaven.repo.local=../.m2 test +``` + +The Maven build downloads the required MAT bundles into `java-heap-mcp/target/mat/`. See the [MCP module README](java-heap-mcp/README.md) for supported tools and configuration variables. + +#### 2. Start the MCP HTTP service + +The workbench needs the optional HTTP API enabled: + +```bash +cd java-heap-mcp +JAVA_HEAP_MCP_WEB_UI_ENABLED=true \ +JAVA_HEAP_MCP_WEB_UI_PORT=7777 \ +./scripts/run-server.sh +``` + +This starts the MCP server and makes its local web/API service available at . The server's built-in page can be used to upload and index a heap dump. Keep this process running. + +#### 3. Start Ollama (optional) + +In another terminal: + +```bash +ollama pull nemotron-3-nano:4b +OLLAMA_ORIGINS=http://127.0.0.1:4173 ollama serve +``` + +If Ollama is already running as a system service, configure its allowed origins using the platform-specific Ollama configuration instead. The browser must be allowed to call `http://127.0.0.1:11434` from the workbench origin. + +#### 4. Build and start the workbench + +In a third terminal: + +```bash +cd java-heap-workbench +npm run build +npm run dev +``` + +Open . The workbench has no runtime npm dependencies; `npm install` is not required. The build creates the ignored `java-heap-workbench/dist/` directory. + +#### 5. Connect the pieces + +1. Open . +2. Select a `.hprof` file, optionally enter a project name, and load it. +3. Open . +4. Select the loaded project from the workbench project selector. +5. Open **Connections** if the defaults need changing: + - MCP: `http://127.0.0.1:7777` + - Provider: `Ollama (local)` or `OpenRouter` + - Ollama URL: `http://127.0.0.1:11434` (when using Ollama) + - OpenRouter API URL: `https://openrouter.ai/api/v1` (when using OpenRouter) + - Model: `nemotron-3-nano:4b` for Ollama, or one of the indexed OpenRouter free coding models +6. Use a quick investigation or enter a question in the chat box. + +The agent can call overview, histogram, dominator, leak-suspect, OQL, object inspection, and GC-root path operations. Tool results are returned to the model and also rendered as visual A2UI components. Questions about class attributes are grounded with a valid MAT OQL object selection followed by object inspection, so the response includes actual fields and values when the heap exposes them. + +Agent-generated OQL uses the embedded Apache Calcite SQL dialect. Use one read-only `SELECT` statement with SQL grouping, aggregates, ordering, joins, and other supported clauses; do not generate MAT-only syntax. Heap functions are SQL functions, so use `toString(s.this)`, never Java-like alias method syntax such as `s.toString(s.this)`. The workbench sends a tool-level row limit separately, but SQL `LIMIT`/`OFFSET` may be used when they are part of the query's intended semantics. + +### Testing the complete flow + +Test the frontend build: + +```bash +cd java-heap-workbench +npm test +npm run build +``` + +Test a real interaction after both services are running: + +```text +Show me the top 10 classes by retained heap and visualize them as a bar chart. +``` + +Other useful prompts: + +- `Give me a high-level overview of this heap and highlight the biggest retention risks.` +- `Find leak suspects and summarize the evidence in cards and a table.` +- `Run an OQL query for the most common String values and show the results.` + +The workbench emits AG-UI-compatible `RUN_STARTED`, tool-call, text, state, finish, and error events. The A2UI renderer currently supports summary cards, tables, bar charts, pie charts, and markdown-style text responses. + +### Troubleshooting + +- **MCP offline:** confirm the Java server was started with `JAVA_HEAP_MCP_WEB_UI_ENABLED=true` and that port `7777` is available. +- **No project appears:** load or open a project in the MCP page first; cached projects without active handles must be opened before analysis. +- **Model request fails:** verify the selected provider, endpoint, model name, and (for OpenRouter) API key. Ollama also requires `OLLAMA_ORIGINS=http://127.0.0.1:4173`. +- **Large dump is slow:** MAT indexing and retained-heap calculations can take time. Keep the MCP process running while analysis completes. +- **Browser is using stale settings:** open **Connections**, save the correct URLs/model, and retry. + +For module-specific environment variables, MCP tools, licensing, and implementation details, see the [MCP README](java-heap-mcp/README.md) and [workbench README](java-heap-workbench/README.md). + +## References + +* [mat-calcite-plugin](https://github.com/vlsi/mat-calcite-plugin): Including some of the source files for the java-heap-mcp integration of Apache Calcite. +* diff --git a/docs/.tool-versions b/docs/.tool-versions index f73dda5..85873f0 100644 --- a/docs/.tool-versions +++ b/docs/.tool-versions @@ -1,3 +1,3 @@ -hugo extended_0.162.1 -golang 1.24.12 +hugo extended-0.165.0 +golang 1.27.1 nodejs 23.11.0 diff --git a/docs/content/docs/prereqs/_index.md b/docs/content/docs/prereqs/_index.md index 46ec4a3..9d8dace 100644 --- a/docs/content/docs/prereqs/_index.md +++ b/docs/content/docs/prereqs/_index.md @@ -8,7 +8,7 @@ hide_readingtime: true ## Java Development Kit -Install a Java Development Kit (21+) from Oracle or OpenJDK +Install a Java Development Kit (25+) from Oracle or OpenJDK * [Oracle](https://www.oracle.com/java/technologies/downloads/) * [OpenJDK](https://openjdk.java.net/install/) @@ -31,4 +31,4 @@ Install the standalone version of [Eclipse MAT](https://www.eclipse.org/mat/). ## Rancher Desktop + Docker CLI -Install the [Rancher Desktop](https://rancherdesktop.io/) container runtime environment with the Docker CLI. \ No newline at end of file +Install the [Rancher Desktop](https://rancherdesktop.io/) container runtime environment with the Docker CLI. diff --git a/docs/content/docs/talks/_index.md b/docs/content/docs/talks/_index.md index c9f3cc8..e0a562f 100644 --- a/docs/content/docs/talks/_index.md +++ b/docs/content/docs/talks/_index.md @@ -10,8 +10,8 @@ menu: pre: "" --- - - +* [Heap Space Nine: Explore your Java Memory with AI](/slides/heap-space-nine/) (September 2026): This talk explores how AI and the Model Context Protocol (MCP) can make Java heap dump analysis faster and easier. It covers traditional memory-analysis tools, then shows how an MCP server can let an AI model examine object graphs, find memory hotspots, diagnose issues, and suggest optimizations. + * Check out the code here: [java-perf-workshop](https://github.com/cchesser/java-perf-workshop) * [A Practical Guide to JVM Native Memory in Kubernetes](/slides/jvm-k8s-mem/) (May 2026): A lightning talk on how JVM native memory behaves in Kubernetes, why container limits can be surprising, and what to inspect when memory usage does not match heap settings. * [Hello World Example](/docs/containers/hello-world/): Tiny Hello World service example, with building it as a container, deploying on Kubernetes, and evaluated native memory utilization. * [Open Up your JVM with Open Source Tooling](/slides/jvm-tooling/) (May 2025): A tour of open source JVM observability and troubleshooting tools, including JDK Mission Control, Eclipse Memory Analyzer, VisualVM, and OpenTelemetry. diff --git a/docs/static/slides/heap-space-nine/img/heap-space-nine-title.png b/docs/static/slides/heap-space-nine/img/heap-space-nine-title.png new file mode 100644 index 0000000000000000000000000000000000000000..335eaa71ce807993c4e910082e56af8da5b5d517 GIT binary patch literal 186372 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 Ook^aS0e)E=di8>eg*j&UO8j?sg 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≻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

~W>aTE6?f+# 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
i0bvT9Ryu502j_?fw`pf^Sx658prqL5c< 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 literal 0 HcmV?d00001 diff --git a/docs/static/slides/heap-space-nine/index.html b/docs/static/slides/heap-space-nine/index.html new file mode 100644 index 0000000..b67447d --- /dev/null +++ b/docs/static/slides/heap-space-nine/index.html @@ -0,0 +1,1380 @@ + + + + + + Heap Space Nine: Explore your Java Memory with AI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+
+ Heap Space Nine: Explore your Java Memory with AI + + + + + +
+ Carl Chesser + + Carl Chesser
@che55er | + che55er.io +
+
+
+

Today’s path

+
+
+

+ Capture + +

+

+ Why we take a heap dump and the two common commands. +

+
+
+

+ Understand + +

+

+ What a .hprof contains, and why it can be huge. +

+
+
+

+ Analyze + Extend + +

+

+ How MAT reads, indexes, and queries the snapshot with Calcite + for a richer query engine. +

+
+
+

+ Connect + +

+

+ How MCP exposes heap analysis to an AI application. +

+
+
+

+ Demonstrate + +

+

A live walk through the Java heap workbench.

+
+
+
+
+
Chapter #1
+

Capture the evidence

+

Why capture a heap dump?

+
+
+

Why capture a heap dump?

+
+
+

Reactive: an incident happened

+

OutOfMemoryError

+

+ Find which objects retained the heap and what application path + kept them reachable. +

+
+
+

Proactive: plan capacity

+

Size the container workload

+

+ Understand heap, object, and retention patterns before choosing + memory limits and headroom. +

+
+
+

+ A heap dump shows what the JVM was holding at that moment. +

+
+
+
The map
+

JVM memory is bigger than the heap

+
+
+
+ Java heap
objects, arrays, class instances +
+
+ Native memory
threads, code cache, metaspace, GC structures +
+
+ Process + libraries
JVM, agents, mapped files, runtime overhead +
+
+
+

Heap dump answers

+

+ What objects existed? How large were they? What kept them + reachable? +

+

It does not answer

+

+ What happened first, or which request created every object. +

+
+
+
+
+

Size is not one number

+
+
+

Shallow heap

+

+ The memory occupied by the object itself, excluding the objects + it references. +

+
+
+

Retained heap

+

+ The memory that would become collectible if this object were + removed from the graph. +

+
+
+

GC root

+

+ A runtime-held reference, such as a thread or static field, that + keeps objects reachable. +

+
+
+

Object count

+

+ The number of instances of a class; many small objects can + consume substantial memory in total. +

+
+
+
+
+

jcmd: capture a heap dump

+
jcmd <PID> GC.heap_dump \
+  /tmp/service.hprof
+

+ The target JVM must generally be owned by the same OS user. Choose a + destination with enough free space. +

+
+
+

jmap: the traditional JDK command

+
jmap -dump:format=b,\
+file=/tmp/service.hprof <PID>
+

+ This produces the same kind of binary heap-dump artifact for + analysis. +

+
+
+
Chapter #2
+

Understand the snapshot

+

What is actually inside a .hprof?

+
+
+

+ What is actually inside a .hprof? +

+
    +
  • + A snapshot of the JVM heap at one point in time. +
  • +
  • + Class metadata, object instances, arrays, references, and GC-root + information. +
  • +
  • + Potentially sensitive data, including strings and + application fields. +
  • +
  • + A potentially large binary file, often comparable + to the live heap. +
  • +
+
+
+

+ What can read a .hprof? +

+
+ +
+ VisualVMObject browsing, summaries, references, and OQL.
https://visualvm.github.io/
+
+
+ JOverflowA JDK Mission Control plugin for common heap anti-patterns.
https://github.com/openjdk/jmc
+
+
+

+ These tools are covered in the + memory-analysis guide. +

+
+
+

Why focus on Eclipse MAT?

+

Open source since 2008.

+

+ Mature enough for large production heap dumps. +

+

+ Versatile enough for reports, object graphs, retained sizes, and + OQL. +

+

+ Licensed under the + Eclipse Public License 2.0. +

+ +
+
+

How MAT handles a large .hprof file

+ +
+
+ Object lookup.index
.o2hprof.index
.o2c.index
.idx.index
+
+
+ Reference graph.inbound.index
.outbound.index
.a2s.index
+
+
+ Retention.domIn.index
.domOut.index
.o2ret.index
+
+
Thread data.threads
+
+

+ Creates a file-based index to assist in different forms of lookups. +

+
+
+
Chapter #3
+

Analyze + Extend

+

Read, query, and extend heap analysis.

+
+
+

What MAT already gives us

+

+ A mature engine for reading heap snapshots. +

+

+ Indexes, retained sizes, dominators, references, reports, and OQL. +

+
+
+

+ OQL is the bridge to questions +

+
SELECT c.cacheLimit, c.innerCache.size
+FROM cchesser.javaperf.workshop.cache.CleverCache c
+

OQL is not standard SQL.

+

+ MAT publishes a + BNF grammar + an agent can follow. +

+
+
+

When OQL is not enough

+

+ MAT OQL provides essential capabilities for quering data; however, + it is quite limited. +

+

+ For joins, grouping, sorting, and aggregation, add Apache Calcite + based on the + mat-calcite-plugin. +

+
+
+

MAT + Calcite: a richer query

+
SELECT toString(file) AS url,
+       COUNT(*) AS copies,
+       SUM(retainedSize(this)) AS retained
+FROM java.net.URL
+GROUP BY toString(file)
+HAVING COUNT(*) > 1
+ORDER BY retained DESC
+

+ Now the agent can ask distribution and relationship questions in + SQL. +

+
+
+

Calcite keeps the heap as the data source

+
+
+

MAT provides

+

+ Objects, fields, references, shallow size, retained size. +

+
+
+

Calcite provides

+

+ Stronger relational query layer over MAT’s heap-backed schema. +

+
+
+ Calcite distribution query result +
+
+
Chapter #4
+

Connect analysis to an agent

+

+ The workbench turns tool results into a conversation. +

+
+
+

Why add an agent?

+

Ask a memory question in plain language.

+

+ Let the model choose how to resolve the question with the available + tools. +

+

+ It can further explore the data set through a clearly defined query + language (OQL). +

+
+
+

Model Context Protocol (MCP)

+

+ An AI application is configured with the MCP interface (server). +

+

+ The MCP server describes inputs and outputs. +

+

+ The model understands this protocol and then can utilize this to + utilize specific tools for specific use-cases. +

+
+ Model Context Protocol diagram +
+
+
+

+ Meet java-heap-mcp +

+
+
AI application
+
+
MCP over stdio
+
+
MAT + Calcite
+
+
+
+

Server owns the session

+

+ Load a hprof file into a named project, build or reuse MAT indexes, + and return a stable heap handle. +

+
+
+

Responses stay bounded

+

+ Tools return focused JSON summaries and rows instead of sending + the raw .hprof to the model. +

+
+
+
+
+

A request through the server

+
+
heap_open_project
+
+
heap_get_overview
+
+
MAT snapshot
+
+
Results!
+
+

+ The model never needs direct access to the raw heap file, it is able to access + through well-defined MCP tools. +

+
+
+

13 tools, three jobs

+
+
+

Lifecycle

+

heap_load_dump
load/index a dump

+

heap_open_project
resume a cached project

+

+ heap_list_projects · heap_list_dumps
discover cached state +

+

heap_unload_dump
release an active handle

+
+
+

Orient

+

+ heap_get_overview
summary, top classes, + dominators +

+

+ heap_get_histogram
sort by + retained/shallow/count +

+

+ heap_get_dominators
find retained-memory roots +

+

+ heap_get_oql_grammar
learn the supported + SQL/OQL +

+
+
+

Investigate

+

heap_run_oql
query with limit + offset

+

heap_inspect_object
fields and references

+

+ heap_find_path_to_gc_roots
trace reachability +

+

+ heap_find_leak_suspects
run MAT leak analysis +

+
+
+
+
+

A tool chain follows the evidence

+
+
+ heap_get_overview
What is large? +
+
+ heap_get_histogram
Which classes dominate? +
+
+ heap_inspect_object
What does this object + retain? +
+
+
+
+ heap_find_path_to_gc_roots
Why is it alive? +
+
+ heap_run_oql
Can we test a pattern? +
+
+ heap_find_leak_suspects
What does MAT flag? +
+
+

+ The model chooses the next tool from the returned evidence. +

+
+
+

Natural language becomes a traceable run

+
+
Browser
+
+
local or frontier model
+
+
MCP
+
+
MAT
+
+
+
+
+

A2UI: Agent-to-UI

+
+
+
+

A2UI keeps the workbench simple

+
+
tool result
+
+
components[]
+
+
browser renderer
+
+

The model returns declarative JSON.

+

+ The UI renders summaries, tables, charts, and graphs. +

+
+
+

What A2UI makes possible

+

The same tool result can become a table.

+

Numeric rows can become a chart.

+

References can become a graph.

+
+
+

Utilize your local filesystem for heap analysis

+

+ Browser local model (via ollama) + MCP + MAT + heap dump. +

+

+ You can also use any frontier model and coding agent to interact with this MCP server. +

+ + Just remember, your heap file contains sensitive data. + +
+
+ +
+
+
Chapter #5
+

+ Demo Time + +

+
+
+

Lessons Learned

+
    +
  • MCP server functions be fast, but having an agent iterated with it can be slow.
  • +
  • OQL can still be confusing to an agent without alot of sufficient guidance (system prompt, grammar context).
  • +
  • Enabling advanced querying capabilities with Apache Calcite can expand how you can answer general questions.
  • +
  • Utilizing local models help isolate what content is being analyzed, but it can be too slow on some simple operations.
  • +
+
+
+ Heap Space Nine: Explore your Java Memory with AI +
+

Thank You!

+ + + + + +
+ Carl Chesser + + Carl Chesser
@che55er · + che55er.io
jvmperf.net
+
+
+ QR code linking to more information +
+
+
+ + + + + + + diff --git a/docs/static/slides/heap-space-nine/og-image.svg b/docs/static/slides/heap-space-nine/og-image.svg new file mode 100644 index 0000000..026188b --- /dev/null +++ b/docs/static/slides/heap-space-nine/og-image.svg @@ -0,0 +1,12 @@ + + Heap Space Nine: Explore your Java Memory with AI + Opening slide for Heap Space Nine by Carl Chesser. + + diff --git a/java-heap-mcp/README.md b/java-heap-mcp/README.md new file mode 100644 index 0000000..fe6c581 --- /dev/null +++ b/java-heap-mcp/README.md @@ -0,0 +1,129 @@ +# java-heap-mcp + +`java-heap-mcp` is a Java MCP server for loading and analyzing Java heap dumps with Eclipse Memory Analyzer (MAT) components. It exposes focused MCP tools for dump lifecycle, OQL/SQL, histograms, dominators, object inspection, GC-root paths, and leak-suspect analysis. + +## Add the MCP server to Codex + +The server speaks MCP over stdio, so it can be registered directly with the local Codex CLI. From the repository root, run: + +```bash +codex mcp add javaHeapMcp -- /absolute/path/to/java-heap-mcp/scripts/run-server.sh +``` + +Use the real absolute path to this repository. Verify the registration with `codex mcp list`, then start a new Codex session if needed. Codex can use the heap tools through stdio; the workbench uses the same server's optional HTTP API instead. + +The equivalent `~/.codex/config.toml` entry is: + +```toml +[mcp_servers.javaHeapMcp] +command = "/absolute/path/to/java-heap-mcp/scripts/run-server.sh" +args = [] +``` + +If the server is not executable, run `chmod +x scripts/run-server.sh` once. The server writes diagnostics to stderr and keeps protocol responses on stdout. + +## Current Shape + +- Java 25+ Maven project +- Long-lived multi-dump cache with stable dump handles +- Service-managed cache under `~/.cache/java-heap-mcp` by default +- Named project workflow (each project tracks its cached heap dump + active handle) +- MAT plugin jars downloaded from the official Eclipse distribution during the Maven build +- Headless Apache Calcite heap schema embedded from `mat-calcite-plugin` +- Official MCP Java SDK server with stdio transport and tool/schema negotiation +- Optional built-in web UI for local loading and analysis + +## Engineering Governance + +- Project principles and quality gates are defined in `.specify/memory/constitution.md`. +- Feature specs, plans, and tasks are expected to align with those constitution requirements. + +## Tools + +- `heap_load_dump` +- `heap_open_project` +- `heap_list_projects` +- `heap_list_dumps` +- `heap_unload_dump` +- `heap_get_overview` +- `heap_run_oql` +- `heap_get_oql_grammar` (no heap handle required; returns the supported Calcite SQL grammar, heap schema, functions, and examples) +- `heap_get_histogram` +- `heap_get_dominators` +- `heap_inspect_object` +- `heap_find_path_to_gc_roots` +- `heap_find_leak_suspects` + +## Build + +```bash +mvn -Dmaven.repo.local=.m2 test +``` + +## Run + +```bash +./scripts/run-server.sh +``` + +Environment variables: + +- `JAVA_HEAP_MCP_CACHE_DIR` +- `JAVA_HEAP_MCP_DEFAULT_LIMIT` +- `JAVA_HEAP_MCP_MAX_LIMIT` +- `JAVA_HEAP_MCP_TOOL_TIMEOUT_SECONDS` +- `JAVA_HEAP_MCP_GC_ROOT_PATH_LIMIT` +- `JAVA_HEAP_MCP_WEB_UI_ENABLED` (`true`/`false`, default `false`) +- `JAVA_HEAP_MCP_WEB_UI_PORT` (default `7777`) +- `JAVA_HEAP_MCP_WEB_UI_MAX_UPLOAD_BYTES` (default `0` = unlimited) + +To enable the web UI: + +```bash +JAVA_HEAP_MCP_WEB_UI_ENABLED=true JAVA_HEAP_MCP_WEB_UI_PORT=7777 ./scripts/run-server.sh +``` + +Then open: `http://127.0.0.1:7777/` + +The HTTP API includes CORS headers and browser preflight support so the separate `java-heap-workbench` dev server can connect from `http://127.0.0.1:4173`. + +If MAT reports `NoClassDefFoundError: Could not initialize class` for `QueryRegistry` or `Icons`, stop and restart the MCP server after any runtime/classpath change. These are JVM-level class-initialization failures and cannot be repaired by refreshing the browser. + +`heap_run_oql` first executes queries through the embedded Calcite engine. This enables SQL joins, filters, grouping, ordering, lateral table functions, and MAT-aware functions such as `retainedSize`, `shallowSize`, `getField`, `getValues`, and `getMapEntries`. For example: + +```sql +select toString(file) as file_name, count(*) as count +from java.net.URL +group by toString(file) +order by count(*) desc +``` + +Calcite uses double-quoted identifiers for fully qualified Java class names when needed (for example, `from "java.util.HashMap"`). Existing MAT OQL remains supported as a fallback. OQL diagnostics are written to the MCP process stderr. Each request logs the normalized single-line query plus its limit and offset; parse/runtime failures log the same query with the full exception. + +Agents can call `heap_get_oql_grammar` before writing a query. The same read-only description is available from the HTTP API at `GET /api/oql-grammar` (also `GET /api/oql/grammar`). It describes the server's one-`SELECT` contract, the MAT Calcite heap schema, reference/table/collection functions, and working examples. The payload links to the [Apache Calcite SQL reference](https://calcite.apache.org/docs/reference.html) and [MAT Calcite plugin](https://github.com/vlsi/mat-calcite-plugin) for complete background. + +## Project Workflow + +1. Load a heap into a named project: + - MCP: `heap_load_dump` with `{ "project": "my-service", "path": "/abs/path/dump.hprof" }` + - Web UI: choose the `.hprof` file with the browser file picker and click **Load** + - If no project is supplied, the service assigns a short Docker-style name such as `calm_tesla`. +2. Re-open an existing cached project: + - MCP: `heap_open_project` with `{ "project": "my-service" }` +3. List projects and active handles: + - MCP: `heap_list_projects` +4. Analyze with overview, dominators, leak suspects, histogram, and OQL using the returned handle. + +## Notes + +- MAT is downloaded and unpacked into `target/mat/` by Maven because the bundles are published through Eclipse update-site/RCP distribution artifacts rather than Maven Central. +- Web UI uploads are streamed directly to disk in fixed-size chunks before indexing/load (not buffered fully in memory). +- The current automated tests cover cache metadata, fingerprinting, and manager/tooling behavior. End-to-end MAT integration tests against real HPROF dumps are the next step. + +## Licensing + +- Eclipse Memory Analyzer (MAT) JARs are build outputs under `target/mat/` and are not stored in source control. +- Third-party licensing details are documented in [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md). +- Included license texts are in `licenses/`: + - `licenses/EPL-2.0.txt` + - `licenses/MIT-DEFLATE.txt` diff --git a/java-heap-mcp/THIRD_PARTY_NOTICES.md b/java-heap-mcp/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..bedfcd3 --- /dev/null +++ b/java-heap-mcp/THIRD_PARTY_NOTICES.md @@ -0,0 +1,106 @@ +# Third-Party Notices + +## Compliance assessment + +The project is using the third-party components in a way that is generally +consistent with their published permissive/open-source license terms: + +1. MAT is redistributed as unmodified vendor JARs. Their manifests identify + EPL-2.0; the HPROF bundle also contains the separately identified MIT + DEFLATE code. The corresponding license texts are retained in `licenses/`. +2. The MAT Calcite implementation is copied into this repository as source. + It is attributed to the upstream project and identified as Apache-2.0 below. +3. Calcite and the other Maven libraries are declared as dependencies rather + than copied into this repository or shaded into the application JAR. Maven + resolves them at build/run time, and `scripts/run-server.sh` places those + JARs on the runtime classpath. Their original artifact metadata and license + files therefore remain with the resolved artifacts. +4. This file records the direct dependencies and the license families of their + resolved transitive dependencies. If a release starts bundling those Maven + JARs into a distribution archive, the release process must include the + license/NOTICE files from each resolved artifact as well; this repository + does not currently create such a bundle. + +This is a practical project-level inventory, not legal advice. License terms +can change between dependency versions, so the exact resolved dependency tree +and each artifact's `META-INF/LICENSE*`/`META-INF/NOTICE*` files should be +checked as part of a release review. + +## Maven dependencies + +The following are the notable direct dependencies declared in `pom.xml`. +Links point to the upstream project or its license information. + +| Component | Version | License / attribution | Why it is present | +| --- | --- | --- | --- | +| Jackson Databind, Core, Annotations, JSR310 | 2.18.3 | Apache-2.0 | MCP and JSON serialization | +| Eclipse Platform Runtime, Resources, Commands | 3.31.0 / 3.22.0 / 3.12.0 | EPL-2.0 | MAT runtime services | +| ICU4J | 76.1 | ICU License | Eclipse/MAT internationalization support | +| Apache Calcite Core | 1.41.0 | Apache-2.0 | SQL parser, planner, and execution engine | +| Guava | 33.5.0-jre | Apache-2.0 | Embedded MAT Calcite implementation | +| Janino and Commons Compiler | 3.1.12 | BSD-3-Clause | Calcite enumerable code generation | +| JUnit Jupiter | 5.12.2 | EPL-2.0 | Tests only | +| AssertJ Core | 3.27.3 | Apache-2.0 | Tests only | + +Calcite brings additional runtime artifacts, including Avatica, JTS, Proj4J, +Jackson YAML, SnakeYAML, SLF4J, Apache Commons components, protobuf, +json-path/json-smart, ASM, and related support libraries. These are transitive +dependencies resolved from Maven Central; their license metadata must be +retained if the artifacts are redistributed. The versions actually resolved +can be inspected with: + +```bash +mvn dependency:tree -Dscope=runtime +``` + +The project does not claim that one license applies to all Calcite +transitives: each artifact remains under its own upstream license. + +Useful upstream license references: + +- [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) +- [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/) +- [ICU License](https://icu.unicode.org/license) +- [Apache Calcite](https://calcite.apache.org/) and its [license](https://github.com/apache/calcite/blob/main/LICENSE) +- [Guava](https://github.com/google/guava/blob/master/LICENSE) +- [Janino](https://github.com/janino-compiler/janino/blob/master/LICENSE) +- [JUnit](https://github.com/junit-team/junit5/blob/main/LICENSE.md) +- [AssertJ](https://github.com/assertj/assertj/blob/main/LICENSE) + +## Redistributed source and artifacts + +The Maven build downloads Eclipse Memory Analyzer (MAT) plugin JARs into `target/mat/`. + +It also incorporates the headless MAT schema and function implementation from +[`vlsi/mat-calcite-plugin`](https://github.com/vlsi/mat-calcite-plugin), used under +the Apache License 2.0. The embedded sources are under +`src/main/java/com/github/vlsi/mat/calcite/`; the upstream project and license +are available at the linked repository. + +## Included Artifacts + +1. `org.eclipse.mat.api.jar` (Bundle-Version `1.16.1.202501091339`) + - Declared license: `EPL-2.0` +2. `org.eclipse.mat.parser.jar` (Bundle-Version `1.16.1.202501091339`) + - Declared license: `EPL-2.0` +3. `org.eclipse.mat.report.jar` (Bundle-Version `1.16.1.202501091339`) + - Declared license: `EPL-2.0` +4. `org.eclipse.mat.hprof.jar` (Bundle-Version `1.16.1.202501091339`) + - Declared licenses: `EPL-2.0`, `MIT` (for bundled DEFLATE library code) + +License declarations above are sourced from each JAR's `META-INF/MANIFEST.MF` (`Bundle-License`) and `about.html`. + +## License Texts and Links + +1. Eclipse Public License 2.0 (EPL-2.0) + - Local copy: `licenses/EPL-2.0.txt` + - Upstream: https://www.eclipse.org/legal/epl-2.0/ +2. MIT License notice for DEFLATE library code included in `org.eclipse.mat.hprof.jar` + - Local copy: `licenses/MIT-DEFLATE.txt` + - Upstream notice location in bundled artifact: `about_files/DEFLATE-mit.html` + +## Upstream Project + +- Eclipse Memory Analyzer (MAT): https://eclipse.dev/mat/ +- MAT Calcite plugin: https://github.com/vlsi/mat-calcite-plugin +- Apache License 2.0: https://www.apache.org/licenses/LICENSE-2.0 diff --git a/java-heap-mcp/docs/architecture.md b/java-heap-mcp/docs/architecture.md new file mode 100644 index 0000000..80bc4c5 --- /dev/null +++ b/java-heap-mcp/docs/architecture.md @@ -0,0 +1,78 @@ +# `java-heap-mcp` open-source dependencies + +`java-heap-mcp` is a Java 25+ Maven service. Dependency versions are managed in the repository parent [`pom.xml`](../../pom.xml). Eclipse MAT bundles are downloaded and unpacked into Maven's `target/mat/` directory during the build; no MAT JARs are stored in source control. + +## Runtime architecture + +```mermaid +flowchart LR + Client["MCP client\n(Codex / agent)"] -->|JSON-RPC over stdio| Engine["McpServerEngine"] + Browser["Local browser /\njava-heap-workbench"] -->|HTTP JSON\n127.0.0.1:7777| Web["WebUiServer\noptional"] + Web --> Manager["HeapDumpManager"] + Engine --> Registry["ToolRegistry"] + Registry --> Manager + Manager --> Cache["CacheMetadataStore\nproject + dump metadata"] + Manager --> Analysis["MatHeapService"] + Analysis --> Session["HeapSession /\nMatLoadedHeap"] + Session --> MAT["Eclipse MAT runtime\nSnapshotFactory + ISnapshot"] + Analysis --> Calcite["Apache Calcite\nembedded SQL/OQL engine"] + Calcite --> MAT + MAT --> Dumps[(".hprof / heap dumps")] + Manager --> Disk[("cache directory\nindexes + uploads")] + Cache --> Disk + Session --> Disk + Web -->|serves optional embedded page| WebAsset["src/main/resources/web/index.html"] + + classDef app fill:#1f6feb,color:#fff,stroke:#58a6ff; + classDef library fill:#238636,color:#fff,stroke:#3fb950; + classDef storage fill:#6e40c9,color:#fff,stroke:#bc8cff; + class Engine,Registry,Manager,Analysis,Web app; + class MAT,Calcite library; + class Cache,Session,Dumps,Disk,WebAsset storage; +``` + +The MCP client uses the stdio path; the workbench uses the optional HTTP path. Both routes converge on the same project, cache, and heap-analysis services. + +## Dependency relationships + +```mermaid +flowchart TB + App["java-heap-mcp"] --> MATAPI["Eclipse MAT API"] + App --> MATParser["MAT parser + HPROF"] + App --> MATReport["MAT reporting"] + App --> Eclipse["Eclipse Platform runtime"] + App --> Calcite["Apache Calcite"] + App --> Janino["Janino"] + App --> Jackson["Jackson"] + App --> ICU["ICU4J"] + MATAPI --> Service["MatHeapService"] + MATParser --> Service + MATReport --> Service + Eclipse --> MATAPI + Calcite --> Service + Janino --> Calcite + Jackson --> Boundary["MCP + HTTP JSON boundaries"] + Service --> Boundary +``` + +| Dependency | Why it is used | Value to the project | +| --- | --- | --- | +| [Eclipse Memory Analyzer (MAT) API](https://www.eclipse.org/mat/) — `org.eclipse.mat.api` | Provides the snapshot model and heap-analysis APIs. | Enables overviews, histograms, dominators, object inspection, GC-root paths, and leak-suspect analysis. | +| Eclipse MAT parser and HPROF support — `org.eclipse.mat.parser`, `org.eclipse.mat.hprof` | Reads heap-dump files and builds or reuses MAT indexes. | Makes `.hprof` dumps available as queryable `ISnapshot` instances. | +| Eclipse MAT reporting — `org.eclipse.mat.report` | Supplies MAT report and query infrastructure. | Supports MAT-native analysis and leak-hunter operations in headless mode. | +| Eclipse Platform — `org.eclipse.core.runtime`, `org.eclipse.core.resources`, `org.eclipse.core.commands` | Provides the runtime/plugin services expected by MAT’s OSGi bundles. | Allows MAT to run inside this standalone server rather than only inside the MAT desktop application. | +| [Apache Calcite](https://calcite.apache.org/) — `calcite-core` | Provides the embedded SQL planner and execution engine used for the Calcite-backed OQL dialect. | Adds read-only SQL capabilities such as filtering, joins, grouping, ordering, pagination, heap tables, and MAT-aware functions. | +| [Janino](https://janino-compiler.github.io/janino/) — `janino`, `commons-compiler` | Compiles expressions used by Calcite at runtime. | Makes dynamic query expressions executable without adding a separate compiler process. | +| [Jackson](https://github.com/FasterXML/jackson) — `jackson-databind`, `jackson-datatype-jsr310` | Serializes MCP messages, HTTP payloads, configuration data, and result records. | Provides the JSON boundary for MCP clients and the optional web API, including Java time values. | +| [Google Guava](https://github.com/google/guava) — `guava` | Supplies general-purpose collection and utility APIs used by the Calcite/MAT integration. | Reduces supporting code and provides well-tested collection utilities. | +| [ICU4J](https://icu.unicode.org/) — `icu4j` | Supplies Unicode and internationalization support required by the Eclipse/MAT runtime. | Keeps the embedded MAT runtime compatible with its platform dependencies. | +| [MCP Java SDK](https://github.com/modelcontextprotocol/java-sdk) — `mcp-core`, `mcp-json-jackson2` | Provides the MCP server model, stdio transport, protocol negotiation, tool registration, and schema validation. | Replaces the hand-rolled JSON-RPC transport with the official MCP implementation while preserving the project’s Jackson 2 stack. | + +## Test dependencies + +| Dependency | Why it is used | Value to the project | +| --- | --- | --- | +| [JUnit 5](https://junit.org/junit5/) — `junit-jupiter` | Defines and runs the Java unit tests. | Verifies MCP protocol handling, heap lifecycle behavior, caching, and OQL validation. | +| [AssertJ](https://assertj.github.io/doc/) — `assertj-core` | Provides fluent assertions in tests. | Keeps test expectations readable, especially for structured heap and JSON results. | + +The server’s own Java packages provide the application layer around these projects: `McpServerEngine` handles MCP JSON-RPC, `WebUiServer` exposes the optional HTTP API, `HeapDumpManager` owns project/handle/cache lifecycle, and `MatHeapService` coordinates MAT and Calcite analysis. diff --git a/java-heap-mcp/licenses/EPL-2.0.txt b/java-heap-mcp/licenses/EPL-2.0.txt new file mode 100644 index 0000000..cd86520 --- /dev/null +++ b/java-heap-mcp/licenses/EPL-2.0.txt @@ -0,0 +1,15 @@ +Eclipse Public License - v 2.0 (EPL-2.0) + +Official canonical text: +https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt + +Project-local notice: +The Eclipse Memory Analyzer (MAT) artifacts downloaded during the build declare +EPL-2.0 in their bundle metadata (`Bundle-License`) and plugin `about.html` +files. + +Relevant artifacts: +- org.eclipse.mat.api.jar +- org.eclipse.mat.parser.jar +- org.eclipse.mat.report.jar +- org.eclipse.mat.hprof.jar diff --git a/java-heap-mcp/licenses/MIT-DEFLATE.txt b/java-heap-mcp/licenses/MIT-DEFLATE.txt new file mode 100644 index 0000000..d6795ef --- /dev/null +++ b/java-heap-mcp/licenses/MIT-DEFLATE.txt @@ -0,0 +1,25 @@ +DEFLATE library (Java) License + +Copyright (c) 2016 Project Nayuki. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Source of this notice: +- org.eclipse.mat.hprof downloaded into `target/mat/` +- about_files/DEFLATE-mit.html diff --git a/java-heap-mcp/pom.xml b/java-heap-mcp/pom.xml new file mode 100644 index 0000000..ca613b3 --- /dev/null +++ b/java-heap-mcp/pom.xml @@ -0,0 +1,214 @@ + + 4.0.0 + + + cchesser.javaperf + java-perf-workshop-parent + 2.0-SNAPSHOT + + + java-heap-mcp + java-heap-mcp + MCP server for Java heap dump analysis backed by Eclipse MAT. + + + + + io.modelcontextprotocol.sdk + mcp-core + ${mcp.sdk.version} + + + io.modelcontextprotocol.sdk + mcp-json-jackson2 + ${mcp.sdk.version} + + + + org.slf4j + slf4j-simple + 1.7.12 + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + org.eclipse.platform + org.eclipse.core.runtime + + + org.eclipse.platform + org.eclipse.core.resources + + + org.eclipse.platform + org.eclipse.core.commands + + + com.ibm.icu + icu4j + + + + org.apache.calcite + calcite-core + + + com.google.guava + guava + + + org.codehaus.janino + janino + + + org.codehaus.janino + commons-compiler + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.0 + + + default-compile + + + -classpath + ${compile.classpath}${path.separator}${project.build.directory}/mat/org.eclipse.mat.api_${mat.distribution}.jar${path.separator}${project.build.directory}/mat/org.eclipse.mat.hprof_${mat.distribution}.jar${path.separator}${project.build.directory}/mat/org.eclipse.mat.parser_${mat.distribution}.jar${path.separator}${project.build.directory}/mat/org.eclipse.mat.report_${mat.distribution}.jar + + + + + default-testCompile + + + -classpath + ${test.classpath}${path.separator}${project.build.outputDirectory}${path.separator}${project.build.directory}/mat/org.eclipse.mat.api_${mat.distribution}.jar${path.separator}${project.build.directory}/mat/org.eclipse.mat.hprof_${mat.distribution}.jar${path.separator}${project.build.directory}/mat/org.eclipse.mat.parser_${mat.distribution}.jar${path.separator}${project.build.directory}/mat/org.eclipse.mat.report_${mat.distribution}.jar + + + + + + + com.googlecode.maven-download-plugin + download-maven-plugin + 1.6.8 + + + download-mat-distribution + generate-resources + wget + + https://download.eclipse.org/mat/1.16.1/MemoryAnalyzer-${mat.distribution}.zip + ${project.build.directory} + mat-${mat.distribution}.zip + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.1.0 + + + unpack-mat-bundles + generate-resources + run + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.8.1 + + + build-compile-classpath + generate-resources + build-classpath + + compile + compile.classpath + + + + build-test-classpath + generate-resources + build-classpath + + test + test.classpath + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.2 + + false + + ${project.build.directory}/mat/org.eclipse.mat.api_${mat.distribution}.jar + ${project.build.directory}/mat/org.eclipse.mat.hprof_${mat.distribution}.jar + ${project.build.directory}/mat/org.eclipse.mat.parser_${mat.distribution}.jar + ${project.build.directory}/mat/org.eclipse.mat.report_${mat.distribution}.jar + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + + cchesser.javaperf.mcp.server.HeapMcpServerApplication + + + + + + + diff --git a/java-heap-mcp/scripts/run-server.sh b/java-heap-mcp/scripts/run-server.sh new file mode 100755 index 0000000..7141739 --- /dev/null +++ b/java-heap-mcp/scripts/run-server.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +CLASSPATH_FILE="$ROOT_DIR/target/runtime.classpath" + +log() { + printf '[java-heap-mcp] %s\n' "$*" >&2 +} + +WEB_UI_ENABLED="${JAVA_HEAP_MCP_WEB_UI_ENABLED:-false}" +WEB_UI_PORT="${JAVA_HEAP_MCP_WEB_UI_PORT:-7777}" + +cd "$ROOT_DIR" + +log "Preparing the runtime dependency classpath..." +mvn -q -Dmaven.repo.local=.m2 -DincludeScope=runtime -Dmdep.outputFile="$CLASSPATH_FILE" dependency:build-classpath + +log "Compiling the server..." +mvn -q -Dmaven.repo.local=.m2 -DskipTests compile + +CLASSPATH="target/classes:target/mat/*:$(cat "$CLASSPATH_FILE")" + +log "Starting the MCP server (stdio transport)." +if [[ "$WEB_UI_ENABLED" =~ ^[Tt][Rr][Uu][Ee]$ ]]; then + log "Web UI: http://127.0.0.1:${WEB_UI_PORT}/" + log "HTTP API base: http://127.0.0.1:${WEB_UI_PORT}/api/" + log "Available API routes: /projects, /dumps, /load, /load-upload, /open-project, /unload, /overview, /histogram, /dominators, /leaks, /oql" +else + log "Web UI and HTTP APIs are disabled (set JAVA_HEAP_MCP_WEB_UI_ENABLED=true to enable them)." +fi +log "Server is launching 🚀..." +exec java -cp "$CLASSPATH" cchesser.javaperf.mcp.server.HeapMcpServerApplication diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CacheMetadataStore.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CacheMetadataStore.java new file mode 100644 index 0000000..b265cc8 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CacheMetadataStore.java @@ -0,0 +1,85 @@ +package cchesser.javaperf.mcp.cache; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.time.Instant; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Optional; + +public final class CacheMetadataStore { + private static final TypeReference> TYPE = new TypeReference<>() { }; + + private final Path metadataFile; + private final ObjectMapper mapper; + + public CacheMetadataStore(Path cacheRoot, ObjectMapper mapper) { + this.metadataFile = cacheRoot.resolve("metadata.json"); + this.mapper = mapper; + } + + public synchronized Optional get(String fingerprint) { + return readAll().values().stream() + .filter(record -> record.fingerprint().equals(fingerprint)) + .findFirst(); + } + + public synchronized Optional getByProject(String projectName) { + return Optional.ofNullable(readAll().get(projectName)); + } + + public synchronized Collection list() { + return readAll().values(); + } + + public synchronized CachedHeapDumpRecord upsert(CachedHeapDumpRecord record) { + Map all = readAll(); + all.put(record.projectName(), record); + writeAll(all); + return record; + } + + public synchronized CachedHeapDumpRecord touchLoaded(CachedHeapDumpRecord existing) { + CachedHeapDumpRecord updated = new CachedHeapDumpRecord( + existing.projectName(), + existing.fingerprint(), + existing.sourcePath(), + existing.cacheFileName(), + existing.fileSizeBytes(), + existing.lastModifiedTime(), + existing.createdAt(), + Instant.now(), + existing.fullFileHash(), + existing.cachedDumpSizeBytes() + ); + return upsert(updated); + } + + private Map readAll() { + try { + if (!Files.exists(metadataFile)) { + return new LinkedHashMap<>(); + } + return mapper.readValue(metadataFile.toFile(), TYPE); + } catch (IOException exception) { + throw new IllegalStateException("Failed to read cache metadata from " + metadataFile, exception); + } + } + + private void writeAll(Map records) { + try { + Files.createDirectories(metadataFile.getParent()); + Path tempFile = metadataFile.resolveSibling(metadataFile.getFileName() + ".tmp"); + mapper.writerWithDefaultPrettyPrinter().writeValue(tempFile.toFile(), records); + Files.move(tempFile, metadataFile, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + } catch (IOException exception) { + throw new IllegalStateException("Failed to write cache metadata to " + metadataFile, exception); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CachedHeapDumpRecord.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CachedHeapDumpRecord.java new file mode 100644 index 0000000..01c3fea --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/CachedHeapDumpRecord.java @@ -0,0 +1,21 @@ +package cchesser.javaperf.mcp.cache; + +import java.nio.file.Path; +import java.time.Instant; + +public record CachedHeapDumpRecord( + String projectName, + String fingerprint, + String sourcePath, + String cacheFileName, + long fileSizeBytes, + Instant lastModifiedTime, + Instant createdAt, + Instant lastLoadedAt, + String fullFileHash, + long cachedDumpSizeBytes +) { + public Path sourcePathAsPath() { + return Path.of(sourcePath); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprint.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprint.java new file mode 100644 index 0000000..720da36 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprint.java @@ -0,0 +1,54 @@ +package cchesser.javaperf.mcp.cache; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.HexFormat; + +public record HeapDumpFingerprint( + String fingerprint, + Path sourcePath, + long fileSizeBytes, + Instant lastModifiedTime +) { + public static HeapDumpFingerprint from(Path sourcePath) throws IOException { + Path normalized = sourcePath.toAbsolutePath().normalize(); + long fileSize = Files.size(normalized); + Instant lastModified = Files.getLastModifiedTime(normalized).toInstant(); + String payload = normalized + "|" + fileSize + "|" + lastModified.toEpochMilli(); + return new HeapDumpFingerprint(sha256(payload.getBytes()), normalized, fileSize, lastModified); + } + + public String sourceFileName() { + return sourcePath.getFileName().toString(); + } + + public static String sha256File(Path path) throws IOException { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + try (InputStream inputStream = Files.newInputStream(path)) { + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) >= 0) { + digest.update(buffer, 0, bytesRead); + } + } + return HexFormat.of().formatHex(digest.digest()); + } catch (NoSuchAlgorithmException exception) { + throw new IllegalStateException("SHA-256 algorithm is unavailable", exception); + } + } + + private static String sha256(byte[] data) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + return HexFormat.of().formatHex(digest.digest(data)); + } catch (NoSuchAlgorithmException exception) { + throw new IllegalStateException("SHA-256 algorithm is unavailable", exception); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/CalciteDataSource.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/CalciteDataSource.java new file mode 100644 index 0000000..698d54c --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/CalciteDataSource.java @@ -0,0 +1,124 @@ +package cchesser.javaperf.mcp.calcite; + +import cchesser.javaperf.mcp.calcite.neo.PackageSchema; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import org.apache.calcite.jdbc.CalciteConnection; +import org.apache.calcite.schema.Schema; +import org.apache.calcite.schema.SchemaPlus; +import org.codehaus.commons.compiler.CompilerFactoryFactory; +import org.codehaus.janino.CompilerFactory; +import org.eclipse.mat.snapshot.ISnapshot; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; +import java.util.concurrent.ExecutionException; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.CalciteDataSource}. + */ +public class CalciteDataSource { + + private static final LoadingCache SCHEMA_CACHE = CacheBuilder + .newBuilder() + .weakKeys().build(new CacheLoader() { + @Override + public Schema load(ISnapshot key) throws Exception { +// return new HeapSchema(key); + return PackageSchema.resolveSchema(key); + } + }); + + private static boolean initCompilerDone; + + public static Connection getConnection(ISnapshot snapshot) + throws SQLException { + initJanino(); + + try { + Class.forName("org.apache.calcite.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new SQLException( + "Unable to load Calcite JDBC driver", e); + } + Properties info = new Properties(); + info.put("lex", "JAVA"); + info.put("quoting", "DOUBLE_QUOTE"); + info.put("conformance", "LENIENT"); // enable cross apply, etc + Connection connection = DriverManager.getConnection( + "jdbc:calcite:", info); + CalciteConnection con = connection + .unwrap(CalciteConnection.class); + + if (snapshot == null) { + return connection; + } + + if ("HEAP".equals(con.getSchema())) { + return connection; + } + + SchemaPlus root = con.getRootSchema(); + Schema heapSchema; + try { + heapSchema = SCHEMA_CACHE.get(snapshot); + } catch (ExecutionException e) { + throw new SQLException("Unable to create heap schema", e); + } + root.add("HEAP", heapSchema); + con.setSchema("HEAP"); + + return connection; + } + + private static void initJanino() throws SQLException { + // For unknown reason, threadContextClassLoader.getResource("org.codehaus.commons.compiler.properties") + // returns null when accessed via BundleClassLoader + // We make a shortcut + // Some OSGi WA might probably exist + if (initCompilerDone) { + return; + } + initCompilerDone = true; + try { + if (CompilerFactoryFactory.getDefaultCompilerFactory(CompilerFactory.class.getClassLoader()) == null) { + throw new SQLException("Janino compiler is not initialized: CompilerFactoryFactory.getDefaultCompilerFactory" + + "() == null"); + } + } catch (Exception e) { + throw new SQLException("Unable to load Janino compiler", e); + } + } + + public static void close(ResultSet rs, Statement st, Connection con) { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (st != null) { + try { + st.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (con != null) { + try { + con.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/HeapReference.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/HeapReference.java new file mode 100644 index 0000000..93f6cca --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/HeapReference.java @@ -0,0 +1,143 @@ +package cchesser.javaperf.mcp.calcite; + +import cchesser.javaperf.mcp.calcite.functions.HeapFunctions; + +import org.eclipse.mat.snapshot.model.IArray; +import org.eclipse.mat.snapshot.model.IObject; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.HeapReference}. + */ +public class HeapReference implements Comparable, Map { + private final IObject o; + + public HeapReference(IObject o) { + this.o = o; + } + + public static HeapReference valueOf(IObject o) { + return o == null ? null : new HeapReference(o); + } + + public IObject getIObject() { + return o; + } + + @Override + public boolean equals(Object o1) { + if (this == o1) { + return true; + } + if (o1 == null || getClass() != o1.getClass()) { + return false; + } + + HeapReference that = (HeapReference) o1; + + return o.equals(that.o); + } + + @Override + public int hashCode() { + return o.hashCode(); + } + + @Override + public String toString() { + String classSpecific = o.getClassSpecificName(); + if (classSpecific != null) { + return classSpecific; + } + return o.getDisplayName(); + } + + @Override + public int compareTo(HeapReference o) { + int cmp = this.toString().compareTo(o.toString()); + if (cmp != 0) { + return cmp; + } + return getIObject().getObjectId() - o.getIObject().getObjectId(); + } + + @Override + public Object get(Object key) { + // This Map.get is called by Calcite when this['fieldA'] SQL syntax is used + if (key == null) { + return null; + } + if (key instanceof Number && getIObject() instanceof IArray) { + return HeapFunctions.getField(this, "[" + key + "]"); + } + String fieldName = String.valueOf(key); + if (fieldName.charAt(0) == '@') { + if ("@shallow".equalsIgnoreCase(fieldName)) { + return HeapFunctions.shallowSize(this); + } + if ("@retained".equalsIgnoreCase(fieldName)) { + return HeapFunctions.retainedSize(this); + } + } + return HeapFunctions.getField(this, fieldName); + } + + @Override + public int size() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isEmpty() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean containsKey(Object key) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean containsValue(Object value) { + throw new UnsupportedOperationException(); + } + + @Override + public Object put(Object key, Object value) { + throw new UnsupportedOperationException(); + } + + @Override + public Object remove(Object key) { + throw new UnsupportedOperationException(); + } + + @Override + public void putAll(Map m) { + throw new UnsupportedOperationException(); + } + + @Override + public void clear() { + throw new UnsupportedOperationException(); + } + + @Override + public Set keySet() { + throw new UnsupportedOperationException(); + } + + @Override + public Collection values() { + throw new UnsupportedOperationException(); + } + + @Override + public Set entrySet() { + throw new UnsupportedOperationException(); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/RowSetTable.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/RowSetTable.java new file mode 100644 index 0000000..962cd38 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/RowSetTable.java @@ -0,0 +1,137 @@ +package cchesser.javaperf.mcp.calcite; + +import org.eclipse.mat.query.Column; +import org.eclipse.mat.query.ContextProvider; +import org.eclipse.mat.query.IContextObject; +import org.eclipse.mat.query.IResultTable; +import org.eclipse.mat.query.ResultMetaData; + +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Types; + +import javax.sql.rowset.CachedRowSet; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.RowSetTable}. + */ +public class RowSetTable implements IResultTable { + + private final ResultMetaData metaData; + private final CachedRowSet rowSet; + Column[] columns; + int idColumnPosition = -1; + + public RowSetTable(CachedRowSet rowSet) throws SQLException { + this.rowSet = rowSet; + ResultSetMetaData md = rowSet.getMetaData(); + + Column[] columns = new Column[md.getColumnCount()]; + + ResultMetaData.Builder mdBuilder = new ResultMetaData.Builder(); + for (int i = 0; i < columns.length; i++) { + String className = md.getColumnClassName(i + 1); + Class clazz; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + clazz = String.class; + } + String columnName = md.getColumnName(i + 1); + columns[i] = new Column(columnName, clazz); + if (md.getColumnType(i + 1) == Types.JAVA_OBJECT) { + // Most likely a HeapReference + final int columnPosition = i; + String tableName = md.getTableName(i + 1); + final String label; + if (tableName == null || tableName.isEmpty()) { + label = columnName; + } else { + label = tableName + "." + columnName; + } + mdBuilder.addContext(new ContextProvider(label) { + @Override + public IContextObject getContext(Object row) { + return RowSetTable.getContext(row, columnPosition); + } + }); + if (idColumnPosition == -1) { + // Use first object column as context provider (e.g. in case "this" column is missing) + idColumnPosition = i; + } + } + if (idColumnPosition == -1 && "this".equals(columns[i].getLabel())) { + idColumnPosition = i; + } + } + this.metaData = mdBuilder.build(); + this.columns = columns; + } + + @Override + public ResultMetaData getResultMetaData() { + return metaData; + } + + @Override + public Object getColumnValue(Object row, int columnIndex) { + if (row == null) { + return "null"; + } + return ((Object[]) row)[columnIndex]; + } + + @Override + public Column[] getColumns() { + return columns; + } + + @Override + public IContextObject getContext(final Object row) { + if (idColumnPosition == -1) { + return null; + } + return getContext(row, idColumnPosition); + } + + private static IContextObject getContext(final Object row, final int columnPosition) { + if (!(row instanceof Object[])) { + return null; + } + final Object[] data = (Object[]) row; + if (columnPosition >= data.length) { + return null; + } + final Object ref = data[columnPosition]; + if (!(ref instanceof HeapReference)) { + return null; + } + return () -> ((HeapReference) ref).getIObject().getObjectId(); + } + + @Override + public Object getRow(int rowId) { + try { + rowSet.absolute(rowId + 1); + } catch (SQLException e1) { + e1.printStackTrace(); + return null; + } + Object[] row = new Object[columns.length]; + for (int i = 0; i < row.length; i++) { + try { + row[i] = rowSet.getObject(i + 1); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return row; + } + + @Override + public int getRowCount() { + System.out.println("size: " + rowSet.size()); + return rowSet.size(); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/SnapshotHolder.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/SnapshotHolder.java new file mode 100644 index 0000000..de8717e --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/SnapshotHolder.java @@ -0,0 +1,31 @@ +package cchesser.javaperf.mcp.calcite; + +import org.eclipse.mat.snapshot.ISnapshot; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.SnapshotHolder}. + */ +public class SnapshotHolder { + private static final List> SNAPSHOTS = new CopyOnWriteArrayList<>(); + + public static ISnapshot get(int index) { + return SNAPSHOTS.get(index).get(); + } + + public static synchronized int put(ISnapshot snapshot) { + for (int i = 0; i < SNAPSHOTS.size(); i++) { + Reference ref = SNAPSHOTS.get(i); + if (ref.get() == snapshot) { + return i; + } + } + SNAPSHOTS.add(new WeakReference<>(snapshot)); + return SNAPSHOTS.size() - 1; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CollectionsActions.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CollectionsActions.java new file mode 100644 index 0000000..679b349 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CollectionsActions.java @@ -0,0 +1,41 @@ +package cchesser.javaperf.mcp.calcite.collections; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.collectionextract.CollectionExtractionUtils; +import org.eclipse.mat.inspections.collectionextract.ExtractedMap; +import org.eclipse.mat.inspections.collectionextract.IMapExtractor; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IObject; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.collections.CollectionsActions}. + */ +public class CollectionsActions { + + private static class MapExtractorInfo { + final String className; + final IMapExtractor extractor; + + MapExtractorInfo(String className, IMapExtractor extractor) { + this.className = className; + this.extractor = extractor; + } + } + + private static final MapExtractorInfo[] knownExtractors = new MapExtractorInfo[] + { + new MapExtractorInfo("com.github.andrewoma.dexx.collection.HashMap", new DexxHashMapCollectionExtractor()), + new MapExtractorInfo("vlsi.utils.CompactHashMap", new CompactHashMapCollectionExtractor()) + }; + + public static ExtractedMap extractMap(IObject object) throws SnapshotException { + IClass clazz = object.getClazz(); + for (MapExtractorInfo info : knownExtractors) { + if (clazz.doesExtend(info.className)) { + return CollectionExtractionUtils.extractMap(object, info.className, info.extractor); + } + } + return CollectionExtractionUtils.extractMap(object); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CompactHashMapCollectionExtractor.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CompactHashMapCollectionExtractor.java new file mode 100644 index 0000000..3d1f3d5 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/CompactHashMapCollectionExtractor.java @@ -0,0 +1,158 @@ +package cchesser.javaperf.mcp.calcite.collections; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.collectionextract.IMapExtractor; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IObject; +import org.eclipse.mat.snapshot.model.IObjectArray; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.collections.CompactHashMapCollectionExtractor}. + */ +public class CompactHashMapCollectionExtractor implements IMapExtractor { + @Override + public boolean hasSize() { + return true; + } + + @Override + public Integer getSize(IObject iObject) throws SnapshotException { + // TODO more efficient + int size = 0; + for (Iterator> it = extractMapEntries(iObject); it.hasNext(); it.next()) { + size++; + } + return size; + } + + @Override + public boolean hasExtractableContents() { + return true; + } + + @Override + public Iterator> extractMapEntries(IObject iObject) throws SnapshotException { + List> result = new ArrayList<>(); + + ISnapshot snapshot = iObject.getSnapshot(); + IObject v1 = (IObject) iObject.resolveValue("v1"); + IObject v2 = (IObject) iObject.resolveValue("v2"); + IObject v3 = (IObject) iObject.resolveValue("v3"); + HashSet explicitNames = new HashSet<>(); // Keys explicitly set in key2slot map + + IObject mapKlass = (IObject) iObject.resolveValue("klass"); + for (Entry entry : CollectionsActions.extractMap((IObject) mapKlass.resolveValue("key2slot"))) { + IObject key = entry.getKey(); + IObject value; + + int slot = (Integer) entry.getValue().resolveValue("value"); + switch (slot) { + case -1: + value = v1; + break; + case -2: + value = v2; + break; + case -3: + value = v3; + break; + default: + value = getObject(snapshot, ((IObjectArray) v1).getReferenceArray()[slot]); + } + + result.add(new IObjectsPair(key, value)); + explicitNames.add(toString(key)); + } + + // This is not entirely correct, as we are comparing String representation of the keys instead of real keys, + // but it's best what we can do here + if (getClassName(mapKlass).equals("vlsi.utils.CompactHashMapClassWithDefaults")) { + for (Entry entry : CollectionsActions.extractMap((IObject) mapKlass.resolveValue( + "defaultValues"))) { + IObject key = entry.getKey(); + IObject value = entry.getValue(); + + if (!explicitNames.contains(toString(key))) { + result.add(new IObjectsPair(key, value)); + } + } + } + + return result.iterator(); + } + + // Internal + + private String getClassName(IObject obj) { + return obj.getClazz().getName(); + } + + private IObject getObject(ISnapshot snapshot, long address) throws SnapshotException { + return address == 0 ? null : snapshot.getObject(snapshot.mapAddressToId(address)); + } + + private String toString(IObject object) { + String name = object.getClassSpecificName(); + return name != null ? name : object.getDisplayName(); + } + + // Not implemented + + @Override + public boolean hasCollisionRatio() { + return false; + } + + @Override + public Double getCollisionRatio(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public boolean hasCapacity() { + return false; + } + + @Override + public Integer getCapacity(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public boolean hasFillRatio() { + return false; + } + + @Override + public Double getFillRatio(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public int[] extractEntryIds(IObject iObject) throws SnapshotException { + return new int[0]; + } + + @Override + public boolean hasExtractableArray() { + return false; + } + + @Override + public IObjectArray extractEntries(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public Integer getNumberOfNotNullElements(IObject iObject) throws SnapshotException { + return null; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/DexxHashMapCollectionExtractor.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/DexxHashMapCollectionExtractor.java new file mode 100644 index 0000000..50c5ea2 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/DexxHashMapCollectionExtractor.java @@ -0,0 +1,160 @@ +package cchesser.javaperf.mcp.calcite.collections; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.collectionextract.IMapExtractor; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IObject; +import org.eclipse.mat.snapshot.model.IObjectArray; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.collections.DexxHashMapCollectionExtractor}. + */ +public class DexxHashMapCollectionExtractor implements IMapExtractor { + + @Override + public boolean hasSize() { + return true; + } + + @Override + public Integer getSize(IObject iObject) throws SnapshotException { + IObject chmObj = getCHM(iObject); + + if (chmObj != null) { + String typeName = getClassName(chmObj); + if ("com.github.andrewoma.dexx.collection.internal.hashmap.HashMap1".equals(typeName)) { + return 1; + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.CompactHashMap".equals(typeName)) { + return 0; + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.HashMapCollision1".equals(typeName)) { + int count = 0; + IObject item = (IObject) chmObj.resolveValue("kvs"); + while (getClassName(item).equals("com.github.andrewoma.dexx.collection.internal.hashmap.ListMap$Node")) { + count++; + item = (IObject) chmObj.resolveValue("this$0"); + } + return count; + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.HashTrieMap".equals(typeName)) { + return (Integer) chmObj.resolveValue("size"); + } + } + return null; + } + + @Override + public boolean hasExtractableContents() { + return true; + } + + @Override + public Iterator> extractMapEntries(IObject iObject) throws SnapshotException { + List> result = new ArrayList<>(); + IObject chmObj = getCHM(iObject); + if (chmObj != null) { + extractPairs(chmObj, result); + } + return result.iterator(); + } + + // Internal + + private String getClassName(IObject obj) { + return obj.getClazz().getName(); + } + + private IObject getCHM(IObject iObject) throws SnapshotException { + Object obj = iObject.resolveValue("compactHashMap"); + return obj instanceof IObject ? (IObject) obj : null; + } + + private void extractPairs(IObject chmObj, List> result) throws SnapshotException { + String typeName = getClassName(chmObj); + if ("com.github.andrewoma.dexx.collection.Pair".equals(typeName)) { + // Single entry + IObject key = (IObject) chmObj.resolveValue("component1"); + IObject value = (IObject) chmObj.resolveValue("component2"); + result.add(new IObjectsPair(key, value)); + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.HashMap1".equals(typeName)) { + // Single entry + extractPairs((IObject) chmObj.resolveValue("value"), result); + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.HashMapCollision1".equals(typeName)) { + // Multiple entries with hash collision - chain of nested Node classes in 'kvs' field + extractPairs((IObject) chmObj.resolveValue("kvs"), result); + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.ListMap$Node".equals(typeName)) { + // Get current value + extractPairs((IObject) chmObj.resolveValue("value"), result); + // Try to get next object in the list + extractPairs((IObject) chmObj.resolveValue("this$0"), result); + } else if ("com.github.andrewoma.dexx.collection.internal.hashmap.HashTrieMap".equals(typeName)) { + // Multiple entries + Object obj = chmObj.resolveValue("elems"); + if (obj instanceof IObjectArray) { + ISnapshot snapshot = chmObj.getSnapshot(); + for (long elem : ((IObjectArray) obj).getReferenceArray()) { + if (elem != 0) { + extractPairs(snapshot.getObject(snapshot.mapAddressToId(elem)), result); + } + } + } + } + } + + // Not implemented + + @Override + public boolean hasCollisionRatio() { + return false; + } + + @Override + public Double getCollisionRatio(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public boolean hasCapacity() { + return false; + } + + @Override + public Integer getCapacity(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public boolean hasFillRatio() { + return false; + } + + @Override + public Double getFillRatio(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public int[] extractEntryIds(IObject iObject) throws SnapshotException { + // TODO: return values? + return new int[0]; + } + + @Override + public boolean hasExtractableArray() { + return false; + } + + @Override + public IObjectArray extractEntries(IObject iObject) throws SnapshotException { + return null; + } + + @Override + public Integer getNumberOfNotNullElements(IObject iObject) throws SnapshotException { + return null; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/IObjectsPair.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/IObjectsPair.java new file mode 100644 index 0000000..48a9355 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/collections/IObjectsPair.java @@ -0,0 +1,34 @@ +package cchesser.javaperf.mcp.calcite.collections; + +import org.eclipse.mat.snapshot.model.IObject; + +import java.util.Map; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.collections.IObjectsPair}. + */ +class IObjectsPair implements Map.Entry { + private final IObject key; + private final IObject value; + + public IObjectsPair(IObject key, IObject value) { + this.key = key; + this.value = value; + } + + @Override + public IObject getKey() { + return key; + } + + @Override + public IObject getValue() { + return value; + } + + @Override + public IObject setValue(IObject value) { + throw new UnsupportedOperationException(); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/CollectionsFunctions.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/CollectionsFunctions.java new file mode 100644 index 0000000..ce94c87 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/CollectionsFunctions.java @@ -0,0 +1,187 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import cchesser.javaperf.mcp.calcite.HeapReference; +import cchesser.javaperf.mcp.calcite.collections.CollectionsActions; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import org.apache.calcite.adapter.enumerable.CallImplementor; +import org.apache.calcite.adapter.enumerable.NullPolicy; +import org.apache.calcite.adapter.enumerable.ReflectiveCallNotNullImplementor; +import org.apache.calcite.adapter.enumerable.RexImpTable; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.schema.ImplementableFunction; +import org.apache.calcite.schema.ScalarFunction; +import org.apache.calcite.schema.impl.ReflectiveFunctionBase; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.collectionextract.CollectionExtractionUtils; +import org.eclipse.mat.inspections.collectionextract.ExtractedCollection; +import org.eclipse.mat.inspections.collectionextract.ExtractedMap; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IArray; +import org.eclipse.mat.snapshot.model.IObject; +import org.eclipse.mat.snapshot.model.IObjectArray; +import org.eclipse.mat.snapshot.model.IPrimitiveArray; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.CollectionsFunctions}. + */ +public class CollectionsFunctions extends HeapFunctionsBase { + + public abstract static class BaseImplementableFunction extends ReflectiveFunctionBase implements ScalarFunction, + ImplementableFunction { + final CallImplementor implementor; + + BaseImplementableFunction(Method method) { + super(method); + implementor = RexImpTable.createImplementor(new ReflectiveCallNotNullImplementor(method), NullPolicy.NONE, false); + } + + @Override + public CallImplementor getImplementor() { + return implementor; + } + } + + public static class MapFunction extends BaseImplementableFunction { + MapFunction(Method method) { + super(method); + } + + @Override + public RelDataType getReturnType(RelDataTypeFactory relDataTypeFactory) { + return relDataTypeFactory.createMapType(relDataTypeFactory.createJavaType(String.class), + relDataTypeFactory.createJavaType(HeapReference.class)); + } + } + + public static class MultiSetFunction extends BaseImplementableFunction { + MultiSetFunction(Method method) { + super(method); + } + + @Override + public RelDataType getReturnType(RelDataTypeFactory relDataTypeFactory) { + return relDataTypeFactory.createMultisetType(relDataTypeFactory.createJavaType(HeapReference.class), -1); + } + } + + public static class ArrayFunction extends BaseImplementableFunction { + private final Class elementType; + + ArrayFunction(Method method, Class elementType) { + super(method); + this.elementType = elementType; + } + + @Override + public RelDataType getReturnType(RelDataTypeFactory relDataTypeFactory) { + return relDataTypeFactory.createArrayType(relDataTypeFactory.createJavaType(elementType), -1); + } + } + + public static Multimap createAll() { + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.put("asMap", new MapFunction(findMethod(CollectionsFunctions.class, "asMap"))); + builder.put("asMultiSet", new MultiSetFunction(findMethod(CollectionsFunctions.class, "asMultiSet"))); + builder.put("asArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), HeapReference.class)); + builder.put("asByteArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Byte.class)); + builder.put("asShortArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Short.class)); + builder.put("asIntArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Integer.class)); + builder.put("asLongArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Long.class)); + builder.put("asBooleanArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Boolean.class)); + builder.put("asCharArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Character.class)); + builder.put("asFloatArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Float.class)); + builder.put("asDoubleArray", new ArrayFunction(findMethod(CollectionsFunctions.class, "asArray"), Double.class)); + return builder.build(); + } + + @SuppressWarnings("unused") + public static Map asMap(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + + try { + ExtractedMap extractedMap = CollectionsActions.extractMap(ref.getIObject()); + if (extractedMap == null) { + return Collections.emptyMap(); + } else { + Map result = new HashMap<>(); + for (Map.Entry entry : extractedMap) { + result.put(toString(entry.getKey()), + resolveReference(entry.getValue()) + ); + } + return result; + } + } catch (SnapshotException e) { + throw new RuntimeException("Unable to extract map from " + r, e); + } + } + + @SuppressWarnings("unused") + public static List asMultiSet(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + + try { + ExtractedCollection extractedCollection = CollectionExtractionUtils.extractList(ref.getIObject()); + if (extractedCollection == null) { + return Collections.emptyList(); + } else { + List result = new ArrayList<>(); + for (IObject entry : extractedCollection) { + result.add((HeapReference) resolveReference(entry)); + } + return result; + } + } catch (SnapshotException e) { + throw new RuntimeException("Unable to extract collection from " + r, e); + } + } + + @SuppressWarnings("unused") + public static List asArray(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + + IObject iObject = ref.getIObject(); + if (!(iObject instanceof IArray)) { + return null; + } + + if (iObject instanceof IPrimitiveArray) { + IPrimitiveArray arrayObject = (IPrimitiveArray) iObject; + int length = arrayObject.getLength(); + List result = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + result.add(arrayObject.getValueAt(i)); + } + return result; + } else { + IObjectArray arrayObject = (IObjectArray) iObject; + ISnapshot snapshot = arrayObject.getSnapshot(); + int length = arrayObject.getLength(); + List result = new ArrayList<>(length); + for (long objectAddress : arrayObject.getReferenceArray()) { + result.add(resolveReference(snapshot, objectAddress)); + } + return result; + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctions.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctions.java new file mode 100644 index 0000000..a0be8b8 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctions.java @@ -0,0 +1,255 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import cchesser.javaperf.mcp.calcite.HeapReference; +import cchesser.javaperf.mcp.calcite.collections.CollectionsActions; +import cchesser.javaperf.mcp.calcite.schema.objects.SpecialFields; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.collectionextract.CollectionExtractionUtils; +import org.eclipse.mat.inspections.collectionextract.ICollectionExtractor; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.*; + +import java.util.Map; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.HeapFunctions}. + */ +public class HeapFunctions extends HeapFunctionsBase { + + @SuppressWarnings("unused") + public static int getId(Object r) { + HeapReference ref = ensureHeapReference(r); + return ref == null ? -1 : ref.getIObject().getObjectId(); + } + + @SuppressWarnings("unused") + public static Object getClass(Object r) { + HeapReference ref = ensureHeapReference(r); + return ref == null ? null : HeapReference.valueOf(ref.getIObject().getClazz()); + } + + @SuppressWarnings("unused") + public static String getType(Object r) { + HeapReference ref = ensureHeapReference(r); + return ref == null ? "" : ref.getIObject().getClazz().getName(); + } + + @SuppressWarnings("unused") + public static String toString(Object r) { + if (r == null) { + return null; + } + return r.toString(); + } + + @SuppressWarnings("unused") + public static String getStringContent(Object r, int limit) { + try { + HeapReference ref = ensureHeapReference(r); + return ref == null ? "" : PrettyPrinter.objectAsString(ref.getIObject(), limit); + } catch (SnapshotException e) { + throw new RuntimeException("Unable to represent as string", e); + } + } + + @SuppressWarnings("unused") + public static String introspect(Object r) { + if (r instanceof HeapReference) { + return "HeapReference: " + toString(r); + } else if (r instanceof Object[]) { + return "Array, length = " + ((Object[]) r).length; + } else { + return "Primitive type: " + toString(r); + } + } + + @SuppressWarnings("unused") + public static Object getByKey(Object r, String key) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + + try { + for (Map.Entry entry : CollectionsActions.extractMap(ref.getIObject())) { + if (key.equals(toString(entry.getKey()))) { + return resolveReference(entry.getValue()); + } + } + return null; + } catch (SnapshotException e) { + throw new RuntimeException("Unable to lookup key " + key + " in " + r, e); + } + } + + @SuppressWarnings("unused") + public static int getSize(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return -1; + } + + try { + ICollectionExtractor collectionExtractor = CollectionExtractionUtils.findCollectionExtractor(ref.getIObject()); + if (collectionExtractor != null && collectionExtractor.hasSize()) { + return collectionExtractor.getSize(ref.getIObject()); + } else { + return -1; + } + } catch (SnapshotException e) { + throw new RuntimeException("Unable to obtain collection size for " + r, e); + } + } + + @SuppressWarnings("unused") + public static int length(Object r) { + HeapReference ref = ensureHeapReference(r); + + if (ref == null) { + return -1; + } + + IObject obj = ref.getIObject(); + + return obj instanceof IArray ? ((IArray) obj).getLength() : -1; + } + + @SuppressWarnings("unused") + public static long shallowSize(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return -1; + } + try { + return ref.getIObject().getSnapshot().getHeapSize(ref.getIObject().getObjectId()); + } catch (SnapshotException e) { + throw new RuntimeException("Cannot calculate shallow size for " + r, e); + } + } + + @SuppressWarnings("unused") + public static long retainedSize(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return -1; + } + + try { + return ref.getIObject().getSnapshot().getRetainedHeapSize(ref.getIObject().getObjectId()); + } catch (SnapshotException e) { + throw new RuntimeException("Cannot calculate retained size for " + r, e); + } + } + + @SuppressWarnings("unused") + public static Object getField(Object r, String fieldName) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + IObject iObject = ref.getIObject(); + if (fieldName.charAt(0) == '@') { + if ("@shallow".equalsIgnoreCase(fieldName)) { + return HeapFunctions.shallowSize(ref); + } + if ("@retained".equalsIgnoreCase(fieldName)) { + return HeapFunctions.retainedSize(ref); + } + if (SpecialFields.CLASS_NAME.equalsIgnoreCase(fieldName)) { + return IClassMethods.getClassName(iObject.getClazz()); + } + if (iObject instanceof IClass) { + if (SpecialFields.CLASS_LOADER.equalsIgnoreCase(fieldName)) { + return resolveReference(IClassMethods.getClassLoader(iObject)); + } else if (SpecialFields.SUPER.equalsIgnoreCase(fieldName)) { + return resolveReference(IClassMethods.getSuper(iObject)); + } + } else if (SpecialFields.CLASS.equalsIgnoreCase(fieldName)) { + return resolveReference(iObject.getClazz()); + } + } else if (iObject instanceof IArray + && fieldName.length() > 2 + && fieldName.charAt(0) == '[' + && fieldName.charAt(fieldName.length() - 1) == ']') { + try { + // Field name is '[]' and target object is array. + // Initially such calls were routed to IObject.resolveValue, which accepts field names as '[]' for arrays. + // However, this have two problems: + // 1. This doesn't work with primitive arrays (they always return null) + // 2. This doesn't correctly work with values - MAT code doesn't handle 0 address properly in this case + // So, now we handle this case directly in our code + int index = Integer.parseInt(fieldName.substring(1, fieldName.length() - 1)); + int length = ((IArray) iObject).getLength(); + if (index >= 0 && index < length) { + if (iObject instanceof IPrimitiveArray) { + return ((IPrimitiveArray) iObject).getValueAt(index); + } else if (iObject instanceof IObjectArray) { + return resolveReference(iObject.getSnapshot(), ((IObjectArray) iObject).getReferenceArray()[index]); + } + } else { + return null; + } + } catch (NumberFormatException e) { + // fall down + } + } + return resolveReference(IObjectMethods.resolveSimpleValue(iObject, fieldName)); + } + + @SuppressWarnings("unused") + public static Object getStaticField(Object r, String name) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + + IObject iObject = ref.getIObject(); + if (iObject instanceof IClass) { + IClass iClass = (IClass) iObject; + for (Field field : iClass.getStaticFields()) { + if (field.getName().equals(name)) { + Object value = field.getValue(); + if (value instanceof IObject) { + return new HeapReference((IObject) value); + } else { + return value; + } + } + } + } + return null; + } + + @SuppressWarnings("unused") + public static long getAddress(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return -1; + } + + return ref.getIObject().getObjectAddress(); + } + + @SuppressWarnings("unused") + public static long toLong(String value) { + return Long.decode(value); + } + + @SuppressWarnings("unused") + public static Object getDominator(Object r) { + HeapReference ref = ensureHeapReference(r); + if (ref == null) { + return null; + } + + try { + ISnapshot snapshot = ref.getIObject().getSnapshot(); + return HeapReference.valueOf(snapshot.getObject(snapshot.getImmediateDominatorId(ref.getIObject().getObjectId()))); + } catch (SnapshotException e) { + throw new RuntimeException("Cannot obtain immediate dominator object for " + r, e); + } + } + +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctionsBase.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctionsBase.java new file mode 100644 index 0000000..018805b --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/HeapFunctionsBase.java @@ -0,0 +1,52 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import cchesser.javaperf.mcp.calcite.HeapReference; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IObject; + +import java.lang.reflect.Method; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.HeapFunctionsBase}. + */ +public class HeapFunctionsBase { + protected static Object resolveReference(Object value) { + return value instanceof IObject ? HeapReference.valueOf((IObject) value) : value; + } + + protected static HeapReference resolveReference(ISnapshot snapshot, long address) { + if (address == 0) { + // Eclipse MAT always returns "SystemClassLoader" for address=0, so we return null instead + return null; + } + try { + return HeapReference.valueOf(snapshot.getObject(snapshot.mapAddressToId(address))); + } catch (SnapshotException e) { + return null; + } + } + + protected static HeapReference ensureHeapReference(Object r) { + return r instanceof HeapReference ? (HeapReference) r : null; + } + + protected static String toString(IObject o) { + String classSpecific = o.getClassSpecificName(); + if (classSpecific != null) { + return classSpecific; + } + return o.getDisplayName(); + } + + protected static Method findMethod(Class cls, String name) { + for (Method m : cls.getMethods()) { + if (m.getName().equals(name)) { + return m; + } + } + return null; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IClassMethods.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IClassMethods.java new file mode 100644 index 0000000..463a6ae --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IClassMethods.java @@ -0,0 +1,39 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IObject; + +@SuppressWarnings("unused") +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.IClassMethods}. + */ +public abstract class IClassMethods { + public static IClass getSuper(IObject clazz) { + if (clazz instanceof IClass) { + return ((IClass) clazz).getSuperClass(); + } + return null; + } + + public static IObject getClassLoader(IObject clazz) { + if (!(clazz instanceof IClass)) { + return null; + } + int classLoaderId = ((IClass) clazz).getClassLoaderId(); + try { + return clazz.getSnapshot().getObject(classLoaderId); + } catch (SnapshotException e) { + throw new IllegalArgumentException( + "Unable to retrieve classloader of class " + clazz + " in heap " + clazz.getSnapshot(), e); + } + } + + public static String getClassName(IObject clazz) { + if (clazz instanceof IClass) { + return ((IClass) clazz).getName(); + } + return null; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IObjectMethods.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IObjectMethods.java new file mode 100644 index 0000000..672ca69 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/IObjectMethods.java @@ -0,0 +1,32 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import cchesser.javaperf.mcp.calcite.HeapReference; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IObject; + +@SuppressWarnings("unused") +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.IObjectMethods}. + */ +public class IObjectMethods { + public static Object resolveSimpleValue(IObject object, String name) { + try { + if (object instanceof IClass) { + IClass clazz = (IClass) object; + if ("name".equalsIgnoreCase(name)) { + return IClassMethods.getClassName(object); + } + } + return object.resolveValue(name); + } catch (SnapshotException e) { + throw new IllegalArgumentException("Unable to resolve value " + name + " for object " + object, e); + } + } + + public static HeapReference toHeapReference(Object object) { + return HeapReference.valueOf((IObject) object); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/ISnapshotMethods.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/ISnapshotMethods.java new file mode 100644 index 0000000..f8a3514 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/ISnapshotMethods.java @@ -0,0 +1,45 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IObject; + +@SuppressWarnings("unused") +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.ISnapshotMethods}. + */ +public class ISnapshotMethods { + public static long getShallowSize(ISnapshot snapshot, int id) { + try { + return snapshot.getHeapSize(id); + } catch (SnapshotException e) { + throw new IllegalArgumentException("Unable to get shallow size of object " + id + " in heap " + snapshot, e); + } + } + + public static long getRetainedSize(ISnapshot snapshot, int id) { + try { + return snapshot.getRetainedHeapSize(id); + } catch (SnapshotException e) { + throw new IllegalArgumentException("Unable to get retained size of object " + id + " in heap " + snapshot, e); + } + } + + public static IObject getIObject(ISnapshot snapshot, int id) { + try { + return snapshot.getObject(id); + } catch (SnapshotException e) { + throw new IllegalArgumentException("Unable to get object " + id + " in heap " + snapshot, e); + } + } + + public static IClass getClassOf(ISnapshot snapshot, int id) { + try { + return snapshot.getClassOf(id); + } catch (SnapshotException e) { + throw new IllegalArgumentException("Unable to get class of " + id + " in heap " + snapshot, e); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/SnapshotFunctions.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/SnapshotFunctions.java new file mode 100644 index 0000000..89ed642 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/SnapshotFunctions.java @@ -0,0 +1,105 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import cchesser.javaperf.mcp.calcite.HeapReference; +import cchesser.javaperf.mcp.calcite.SnapshotHolder; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import org.apache.calcite.adapter.enumerable.CallImplementor; +import org.apache.calcite.adapter.enumerable.NotNullImplementor; +import org.apache.calcite.adapter.enumerable.NullPolicy; +import org.apache.calcite.adapter.enumerable.RexImpTable; +import org.apache.calcite.adapter.enumerable.RexToLixTranslator; +import org.apache.calcite.linq4j.tree.Expression; +import org.apache.calcite.linq4j.tree.Expressions; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rex.RexCall; +import org.apache.calcite.schema.Function; +import org.apache.calcite.schema.FunctionParameter; +import org.apache.calcite.schema.ImplementableFunction; +import org.apache.calcite.schema.ScalarFunction; +import org.apache.calcite.schema.impl.ReflectiveFunctionBase; +import org.eclipse.mat.snapshot.ISnapshot; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.List; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.SnapshotFunctions}. + */ +public class SnapshotFunctions { + private final ISnapshot snapshot; + + public SnapshotFunctions(int snapshotId) { + snapshot = SnapshotHolder.get(snapshotId); + } + + @SuppressWarnings("unused") + public HeapReference getReference(String address) { + return HeapFunctionsBase.resolveReference(snapshot, Long.decode(address)); + } + + public static Multimap createAll(ISnapshot snapshot) { + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.put("getReference", getFunction(snapshot, "getReference", String.class)); + return builder.build(); + } + + private static Function getFunction(ISnapshot snapshot, String name, Class ... argumentClasses) { + return new SnapshotFunction(snapshot, getMethod(SnapshotFunctions.class, name, argumentClasses)); + } + + private static Method getMethod(Class cls, String name, Class ... argumentClasses) { + try { + return cls.getMethod(name, argumentClasses); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + private static Constructor getConstructor(Class cls, Class ... argumentClasses) { + try { + return cls.getConstructor(argumentClasses); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + private static class SnapshotFunction implements ScalarFunction, ImplementableFunction, NotNullImplementor { + private final ISnapshot snapshot; + private final Method functionMethod; + + public SnapshotFunction(ISnapshot snapshot, Method functionMethod) { + this.snapshot = snapshot; + this.functionMethod = functionMethod; + } + + @Override + public CallImplementor getImplementor() { + return RexImpTable.createImplementor(this, NullPolicy.NONE, false); + } + + @Override + public Expression implement(RexToLixTranslator rexToLixTranslator, RexCall rexCall, List operands) { + int snapshotId = SnapshotHolder.put(snapshot); + + return Expressions.call( + Expressions.new_(getConstructor(SnapshotFunctions.class, Integer.TYPE), Expressions.constant(snapshotId, + Integer.TYPE)), + functionMethod, operands); + } + + @Override + public RelDataType getReturnType(RelDataTypeFactory typeFactory) { + return typeFactory.createJavaType(functionMethod.getReturnType()); + } + + @Override + public List getParameters() { + return ReflectiveFunctionBase.builder().addMethodParameters(functionMethod).build(); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/TableFunctions.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/TableFunctions.java new file mode 100644 index 0000000..bae6c3d --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/functions/TableFunctions.java @@ -0,0 +1,228 @@ +package cchesser.javaperf.mcp.calcite.functions; + +import cchesser.javaperf.mcp.calcite.HeapReference; +import cchesser.javaperf.mcp.calcite.collections.CollectionsActions; +import cchesser.javaperf.mcp.calcite.schema.references.OutboundReferencesTable; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import org.apache.calcite.adapter.java.AbstractQueryableTable; +import org.apache.calcite.linq4j.BaseQueryable; +import org.apache.calcite.linq4j.Enumerator; +import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.linq4j.QueryProvider; +import org.apache.calcite.linq4j.Queryable; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.schema.QueryableTable; +import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.schema.Statistic; +import org.apache.calcite.schema.Statistics; +import org.apache.calcite.schema.TableFunction; +import org.apache.calcite.schema.impl.TableFunctionImpl; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.util.ImmutableBitSet; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.collectionextract.CollectionExtractionUtils; +import org.eclipse.mat.inspections.collectionextract.ExtractedMap; +import org.eclipse.mat.inspections.collectionextract.ICollectionExtractor; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IObject; +import org.eclipse.mat.snapshot.model.NamedReference; +import org.eclipse.mat.util.VoidProgressListener; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.functions.TableFunctions}. + */ +public class TableFunctions { + + public static Multimap createAll() { + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.put("getValues", TableFunctionImpl.create(TableFunctions.class, "getValues")); + builder.put("getMapEntries", TableFunctionImpl.create(TableFunctions.class, "getMapEntries")); + builder.put("getRetainedSet", TableFunctionImpl.create(TableFunctions.class, "getRetainedSet")); + builder.put("getOutboundReferences", TableFunctionImpl.create(TableFunctions.class, "getOutboundReferences")); + builder.put("getInboundReferences", TableFunctionImpl.create(TableFunctions.class, "getInboundReferences")); + return builder.build(); + } + + @SuppressWarnings("unused") + public static QueryableTable getValues(Object r) { + List references; + if (!(r instanceof HeapReference)) { + references = Collections.emptyList(); + } else { + HeapReference ref = (HeapReference) r; + try { + ICollectionExtractor collectionExtractor = CollectionExtractionUtils.findCollectionExtractor(ref.getIObject()); + if (collectionExtractor == null) { + references = Collections.emptyList(); + } else { + references = collectReferences(ref.getIObject().getSnapshot(), + collectionExtractor.extractEntryIds(ref.getIObject())); + } + } catch (SnapshotException e) { + throw new RuntimeException("Cannot extract values from " + ref, e); + } + } + return new HeapReferenceTable(references, false); + } + + @SuppressWarnings("unused") + public static QueryableTable getMapEntries(Object r) { + List references; + if (!(r instanceof HeapReference)) { + references = Collections.emptyList(); + } else { + HeapReference ref = (HeapReference) r; + try { + ExtractedMap extractedMap = CollectionsActions.extractMap(ref.getIObject()); + if (extractedMap == null) { + references = Collections.emptyList(); + } else { + references = new ArrayList<>(); + for (Map.Entry entry : extractedMap) { + references.add(new HeapReference[]{ + HeapReference.valueOf(entry.getKey()), + HeapReference.valueOf(entry.getValue()) + }); + } + } + } catch (SnapshotException e) { + throw new RuntimeException("Cannot extract values from " + ref, e); + } + } + return new HeapReferencesTable(new String[]{"key", "value"}, references); + } + + @SuppressWarnings("unused") + public static QueryableTable getRetainedSet(Object r) { + List references; + if (!(r instanceof HeapReference)) { + references = Collections.emptyList(); + } else { + HeapReference ref = (HeapReference) r; + ISnapshot snapshot = ref.getIObject().getSnapshot(); + try { + references = collectReferences + ( + snapshot, + snapshot.getRetainedSet(new int[]{ref.getIObject().getObjectId()}, new VoidProgressListener()) + ); + } catch (SnapshotException e) { + throw new RuntimeException("Cannot extract retained set from " + r, e); + } + } + return new HeapReferenceTable(references, true); + } + + @SuppressWarnings("unused") + public static QueryableTable getOutboundReferences(Object r) { + List references; + if (!(r instanceof HeapReference)) { + references = Collections.emptyList(); + } else { + HeapReference ref = (HeapReference) r; + references = ref.getIObject().getOutboundReferences(); + } + return new OutboundReferencesTable(references); + } + + @SuppressWarnings("unused") + public static QueryableTable getInboundReferences(Object r) { + List references; + if (!(r instanceof HeapReference)) { + references = Collections.emptyList(); + } else { + HeapReference ref = (HeapReference) r; + ISnapshot snapshot = ref.getIObject().getSnapshot(); + try { + references = collectReferences + ( + snapshot, + snapshot.getInboundRefererIds(ref.getIObject().getObjectId()) + ); + } catch (SnapshotException e) { + throw new RuntimeException("Cannot extract inbound references from " + r, e); + } + } + return new HeapReferenceTable(references, true); + } + + private static List collectReferences(ISnapshot snapshot, int[] objectIds) throws SnapshotException { + if (objectIds != null && objectIds.length > 0) { + List references = new ArrayList<>(); + for (int objectId : objectIds) { + references.add(HeapReference.valueOf(snapshot.getObject(objectId))); + } + return references; + } else { + return Collections.emptyList(); + } + } + + private static class HeapReferenceTable extends ValuesListTable { + HeapReferenceTable(Collection references, boolean unique) { + super(HeapReference.class, new String[]{"this"}, references, unique); + } + } + + private static class HeapReferencesTable extends ValuesListTable { + HeapReferencesTable(String[] columnNames, Collection references) { + super(HeapReference[].class, columnNames, references, false); + } + } + + private static class ValuesListTable extends AbstractQueryableTable { + private final static List UNIQUE_KEYS_STATISTICS = ImmutableList.of(ImmutableBitSet.of(0)); + private final static List NON_UNIQUE_KEYS_STATISTICS = ImmutableList.of(ImmutableBitSet.of()); + + private final String[] columnNames; + private final Collection values; + private final boolean unique; + + ValuesListTable(Type targetRowType, String[] columnNames, Collection values, boolean unique) { + super(targetRowType); + this.columnNames = columnNames; + this.values = values; + this.unique = unique; + } + + @SuppressWarnings("unchecked") + @Override + public Queryable asQueryable(QueryProvider queryProvider, SchemaPlus schemaPlus, String s) { + BaseQueryable queryable = new BaseQueryable(null, getElementType(), null) { + @Override + public Enumerator enumerator() { + return Linq4j.enumerator(values); + } + }; + return (Queryable) queryable; + } + + @Override + public RelDataType getRowType(RelDataTypeFactory relDataTypeFactory) { + RelDataTypeFactory.Builder builder = relDataTypeFactory.builder(); + RelDataType anyNull = relDataTypeFactory.createTypeWithNullability( + relDataTypeFactory.createSqlType(SqlTypeName.ANY), true); + for (String columnName : columnNames) { + builder.add(columnName, anyNull); + } + return builder.build(); + } + + @Override + public Statistic getStatistic() { + return Statistics.of(values.size(), unique ? UNIQUE_KEYS_STATISTICS : NON_UNIQUE_KEYS_STATISTICS); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/GroupEnumerator.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/GroupEnumerator.java new file mode 100644 index 0000000..2abc301 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/GroupEnumerator.java @@ -0,0 +1,106 @@ +package cchesser.javaperf.mcp.calcite.neo; + +import org.apache.calcite.linq4j.Enumerator; + +import java.util.NoSuchElementException; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.neo.GroupEnumerator}. + */ +public abstract class GroupEnumerator implements Enumerator { + private final GroupType[] groups; + private RowsType rows; + private int rowsCount; + + private int currentRow = -1; + private int currentGroup = -1; + + private ResultType currentResult; + + public GroupEnumerator(GroupType[] groups) { + this.groups = groups; + } + + @Override + public ResultType current() { + if (currentResult == null) { + throw new NoSuchElementException(); + } else { + return currentResult; + } + } + + @Override + public boolean moveNext() { + do { + if (advanceRow()) { + return true; + } + } while (advanceGroup()); + return false; + } + + @Override + public void reset() { + currentRow = -1; + currentGroup = -1; + currentResult = null; + } + + @Override + public void close() { + reset(); + } + + private boolean advanceRow() { + if (currentGroup == -1) { + return false; + } else if (currentRow < rowsCount - 1) { + currentRow++; + resolveRow(); + return true; + } else { + return false; + } + } + + private boolean advanceGroup() { + if (currentGroup < groups.length - 1) { + currentGroup++; + currentRow = -1; + resolveGroup(); + return true; + } else { + currentResult = null; + return false; + } + } + + private void resolveGroup() { + try { + rows = resolveGroup(groups[currentGroup]); + rowsCount = rowsCount(rows); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private void resolveRow() { + try { + currentResult = resolveRow(groups[currentGroup], rows, currentRow); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected abstract int rowsCount(RowsType rows); + + protected abstract RowsType resolveGroup(GroupType group) throws Exception; + + protected abstract ResultType resolveRow(GroupType group, RowsType rows, int currentRow) throws Exception; +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/PackageSchema.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/PackageSchema.java new file mode 100644 index 0000000..1359e52 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/PackageSchema.java @@ -0,0 +1,159 @@ +package cchesser.javaperf.mcp.calcite.neo; + +import cchesser.javaperf.mcp.calcite.functions.CollectionsFunctions; +import cchesser.javaperf.mcp.calcite.functions.HeapFunctions; +import cchesser.javaperf.mcp.calcite.functions.SnapshotFunctions; +import cchesser.javaperf.mcp.calcite.functions.TableFunctions; +import cchesser.javaperf.mcp.calcite.schema.objects.IClassesList; +import cchesser.javaperf.mcp.calcite.schema.objects.InstanceByClassTable; +import cchesser.javaperf.mcp.calcite.schema.objects.InstanceIdsByClassTable; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import org.apache.calcite.schema.Function; +import org.apache.calcite.schema.Schema; +import org.apache.calcite.schema.Table; +import org.apache.calcite.schema.impl.AbstractSchema; +import org.apache.calcite.schema.impl.ScalarFunctionImpl; +import org.apache.calcite.sql.advise.SqlAdvisorGetHintsFunction; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IClass; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.neo.PackageSchema}. + */ +public class PackageSchema extends AbstractSchema { + private final Multimap functions; + private final Map subPackages = new HashMap<>(); + private final Map classes = new HashMap<>(); + + private PackageSchema() { + this(ImmutableMultimap.of()); + } + + private PackageSchema(Multimap functions) { + this.functions = functions; + } + + private PackageSchema getPackage(String subSchemaName) { + + PackageSchema subSchema = subPackages.get(subSchemaName); + if (subSchema == null) { + subSchema = new PackageSchema(); + subPackages.put(subSchemaName, subSchema); + } + return subSchema; + } + + private void addClass(String name, Table table) { + if (!classes.containsKey(name)) { + classes.put(name, table); + } + } + + private void addClass(String className, IClassesList classesList) { + addClass(className, new InstanceByClassTable(classesList)); + addClass("$ids$:" + className, new InstanceIdsByClassTable(classesList)); + } + + @Override + protected Map getSubSchemaMap() { + return ImmutableMap.copyOf(subPackages); + } + + @Override + protected Map getTableMap() { + return Collections.unmodifiableMap(classes); + } + + @Override + protected Multimap getFunctionMultimap() { + return functions; + } + + @Override + public boolean isMutable() { + return false; + } + + private static String getClassName(final String fullClassName) { + int lastDotIndex = fullClassName.lastIndexOf('.'); + return lastDotIndex == -1 ? fullClassName : fullClassName.substring(lastDotIndex + 1); + } + + private static PackageSchema getPackage(final PackageSchema rootPackage, final String fullClassName) { + String[] nameParts = fullClassName.split("\\."); + PackageSchema targetSchema = rootPackage; + for (int i = 0; i < nameParts.length - 1; i++) { + targetSchema = targetSchema.getPackage(nameParts[i]); + } + return targetSchema; + } + + public static PackageSchema resolveSchema(ISnapshot snapshot) { + + try { + // Create functions for schema + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.putAll(ScalarFunctionImpl.functions(HeapFunctions.class)); + builder.putAll(CollectionsFunctions.createAll()); + builder.putAll(TableFunctions.createAll()); + builder.putAll(SnapshotFunctions.createAll(snapshot)); + builder.put("getHints", new SqlAdvisorGetHintsFunction()); + ImmutableMultimap functions = builder.build(); + + // Create default schema + PackageSchema defaultSchema = new PackageSchema(functions); + + // Collect all classes names + Collection classes = snapshot.getClasses(); + HashSet classesNames = new HashSet<>(); + for (IClass iClass : classes) { + classesNames.add(iClass.getName()); + } + + PackageSchema instanceOfPackage = defaultSchema.getPackage("instanceof"); + + // Add all classes to schema + for (String fullClassName : classesNames) { + IClassesList classOnly = new IClassesList(snapshot, fullClassName, false); + + // Make class available via "package.name.ClassName" (full class name in a root schema) + defaultSchema.addClass(fullClassName, classOnly); + + String simpleClassName = getClassName(fullClassName); + + // Make class available via package.name.ClassName (schema.schema.Class) + PackageSchema packageSchema = getPackage(defaultSchema, fullClassName); + packageSchema.addClass(simpleClassName, classOnly); + + // Add instanceof + IClassesList withSubClasses = new IClassesList(snapshot, fullClassName, true); + + // Make class available via "instanceof.package.name.ClassName" + defaultSchema.addClass("instanceof." + fullClassName, withSubClasses); + + // Make class available via instanceof.package.name.ClassName + PackageSchema instanceOfSchema = getPackage(instanceOfPackage, fullClassName); + instanceOfSchema.addClass(simpleClassName, withSubClasses); + + } + + // Add thread stacks table + defaultSchema.getPackage("native").addClass("ThreadStackFrames", new SnapshotThreadStacksTable(snapshot)); + + return defaultSchema; + } catch (SnapshotException e) { + throw new RuntimeException("Cannot resolve package schemes", e); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/SnapshotThreadStacksTable.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/SnapshotThreadStacksTable.java new file mode 100644 index 0000000..eeddfb7 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/neo/SnapshotThreadStacksTable.java @@ -0,0 +1,122 @@ +package cchesser.javaperf.mcp.calcite.neo; + +import cchesser.javaperf.mcp.calcite.HeapReference; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.DataContext; +import org.apache.calcite.linq4j.AbstractEnumerable; +import org.apache.calcite.linq4j.Enumerable; +import org.apache.calcite.linq4j.Enumerator; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.schema.ScannableTable; +import org.apache.calcite.schema.Statistic; +import org.apache.calcite.schema.Statistics; +import org.apache.calcite.schema.impl.AbstractTable; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.util.ImmutableBitSet; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IStackFrame; +import org.eclipse.mat.snapshot.model.IThreadStack; + +import java.util.ArrayList; +import java.util.List; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.neo.SnapshotThreadStacksTable}. + */ +public class SnapshotThreadStacksTable extends AbstractTable implements ScannableTable { + private final ISnapshot snapshot; + + public SnapshotThreadStacksTable(ISnapshot snapshot) { + this.snapshot = snapshot; + } + + @Override + public Statistic getStatistic() { + int counter = 0; + for (IThreadStack threadStack : getThreadStacks()) { + counter += threadStack.getStackFrames().length; + } + return Statistics.of(counter, ImmutableList.of(ImmutableBitSet.of(0, 1))); + } + + @Override + public RelDataType getRowType(RelDataTypeFactory typeFactory) { + RelDataTypeFactory.Builder builder = typeFactory.builder(); + RelDataType anyType = typeFactory.createSqlType(SqlTypeName.ANY); + builder.add("thread", anyType); // non-null + builder.add("depth", typeFactory.createJavaType(int.class)); + builder.add("text", typeFactory.createTypeWithNullability( + typeFactory.createJavaType(String.class), true)); + builder.add("objects", typeFactory.createTypeWithNullability( + typeFactory.createMultisetType(anyType, -1), true)); + return builder.build(); + } + + @Override + public Enumerable scan(DataContext dataContext) { + return new AbstractEnumerable() { + @Override + public Enumerator enumerator() { + return new StackFramesEnumerator(snapshot, getThreadStacks()); + } + }; + } + + private IThreadStack[] getThreadStacks() { + try { + List threadStacks = new ArrayList<>(); + for (IClass threadClass : snapshot.getClassesByName("java.lang.Thread", true)) { + if (threadClass.getNumberOfObjects() > 0) { + for (int threadObject : threadClass.getObjectIds()) { + IThreadStack threadStack = snapshot.getThreadStack(threadObject); + if (threadStack != null) { + threadStacks.add(threadStack); + } + } + } + } + return threadStacks.toArray(new IThreadStack[0]); + } catch (SnapshotException e) { + throw new RuntimeException(e); + } + } + + private static class StackFramesEnumerator extends GroupEnumerator { + private final ISnapshot snapshot; + + public StackFramesEnumerator(ISnapshot snapshot, IThreadStack[] groups) { + super(groups); + this.snapshot = snapshot; + } + + @Override + protected IStackFrame[] resolveGroup(IThreadStack group) throws Exception { + return group.getStackFrames(); + } + + @Override + protected int rowsCount(IStackFrame[] rows) { + return rows.length; + } + + @Override + protected Object[] resolveRow(IThreadStack group, IStackFrame[] rows, int currentRow) throws Exception { + Object[] result = new Object[4]; + IStackFrame frame = rows[currentRow]; + result[0] = HeapReference.valueOf(snapshot.getObject(group.getThreadId())); + result[1] = currentRow; + result[2] = frame.getText(); + List objects = new ArrayList<>(); + for (int objectId : frame.getLocalObjectsIds()) { + objects.add(HeapReference.valueOf(snapshot.getObject(objectId))); + } + result[3] = objects; + return result; + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/ExecutionRexBuilderContext.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/ExecutionRexBuilderContext.java new file mode 100644 index 0000000..57f02bd --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/ExecutionRexBuilderContext.java @@ -0,0 +1,67 @@ +package cchesser.javaperf.mcp.calcite.rex; + +import cchesser.javaperf.mcp.calcite.SnapshotHolder; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.schema.impl.ScalarFunctionImpl; +import org.apache.calcite.sql.SqlFunction; +import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.sql.type.OperandTypes; +import org.apache.calcite.sql.type.ReturnTypes; +import org.apache.calcite.sql.type.SqlTypeFamily; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.sql.validate.SqlUserDefinedFunction; +import org.eclipse.mat.snapshot.ISnapshot; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.rex.ExecutionRexBuilderContext}. + */ +public class ExecutionRexBuilderContext extends RexBuilderContext { + private final int snapshotId; + private final RexNode objectId; + + private RexNode snapshot; + + private static final SqlFunction GET_SNAPSHOT = + new SqlUserDefinedFunction( + new SqlIdentifier("GET_SNAPSHOT", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> tf.createTypeWithNullability(tf.createJavaType(ISnapshot.class), + false)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.NUMERIC), + tf -> ImmutableList.of( + tf.createJavaType(int.class)), + i -> "snapshotId", + i -> false), + ScalarFunctionImpl.create(SnapshotHolder.class, "get")); + + public ExecutionRexBuilderContext(RelOptCluster cluster, int snapshotId, RexNode objectId) { + super(cluster); + this.snapshotId = snapshotId; + this.objectId = objectId; + } + + @Override + public RexNode getSnapshot() { + if (snapshot == null) { + RelDataTypeFactory typeFactory = getCluster().getTypeFactory(); + RexBuilder b = getBuilder(); + snapshot = b.makeCall(GET_SNAPSHOT, b.makeLiteral(snapshotId, typeFactory.createSqlType(SqlTypeName.INTEGER), false)); + } + return snapshot; + } + + @Override + public RexNode getIObjectId() { + return objectId; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/RexBuilderContext.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/RexBuilderContext.java new file mode 100644 index 0000000..8c704e0 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rex/RexBuilderContext.java @@ -0,0 +1,72 @@ +package cchesser.javaperf.mcp.calcite.rex; + +import cchesser.javaperf.mcp.calcite.functions.ISnapshotMethods; +import cchesser.javaperf.mcp.calcite.schema.objects.HeapOperatorTable; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.schema.impl.ScalarFunctionImpl; +import org.apache.calcite.sql.SqlFunction; +import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.sql.type.OperandTypes; +import org.apache.calcite.sql.type.ReturnTypes; +import org.apache.calcite.sql.type.SqlTypeFamily; +import org.apache.calcite.sql.validate.SqlUserDefinedFunction; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IObject; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.rex.RexBuilderContext}. + */ +public abstract class RexBuilderContext { + private final RelOptCluster cluster; + private RexNode object; + + private static final SqlFunction GET_IOBJECT = + new SqlUserDefinedFunction( + new SqlIdentifier("GET_IOBJECT", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> + tf.createTypeWithNullability(tf.createJavaType(IObject.class), false)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY, SqlTypeFamily.NUMERIC), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(ISnapshot.class), false), + tf.createJavaType(int.class)), + i -> i == 0 ? "snapshotId" : "objectId", + i -> false), + ScalarFunctionImpl.create(ISnapshotMethods.class, "getIObject")); + + public RexBuilderContext(RelOptCluster cluster) { + this.cluster = cluster; + } + + public RexBuilder getBuilder() { + return cluster.getRexBuilder(); + } + + public RelOptCluster getCluster() { + return cluster; + } + + public abstract RexNode getSnapshot(); + + public abstract RexNode getIObjectId(); + + public RexNode toHeapReference(RexNode node) { + return getBuilder().makeCall(HeapOperatorTable.TO_HEAP_REFERENCE, node); + } + + public RexNode getIObject() { + if (object == null) { + object = getBuilder().makeCall(GET_IOBJECT, getSnapshot(), getIObjectId()); + } + return object; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/DefaultRuleConfig.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/DefaultRuleConfig.java new file mode 100644 index 0000000..bfe0a9a --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/DefaultRuleConfig.java @@ -0,0 +1,60 @@ +package cchesser.javaperf.mcp.calcite.rules; + +import org.apache.calcite.plan.RelOptRule; +import org.apache.calcite.plan.RelRule; +import org.apache.calcite.rel.core.RelFactories; +import org.apache.calcite.tools.RelBuilderFactory; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.rules.DefaultRuleConfig}. + */ +public class DefaultRuleConfig implements RelRule.Config { + public static final RelRule.Config EMPTY = + new DefaultRuleConfig(RelFactories.LOGICAL_BUILDER, null, null); + + protected final RelBuilderFactory relBuilderFactory; + protected final String description; + protected final RelRule.OperandTransform operandTransform; + + protected DefaultRuleConfig(RelBuilderFactory relBuilderFactory, String description, RelRule.OperandTransform operandTransform) { + this.relBuilderFactory = relBuilderFactory; + this.description = description; + this.operandTransform = operandTransform; + } + + @Override + public RelRule.Config withRelBuilderFactory(RelBuilderFactory relBuilderFactory) { + return new DefaultRuleConfig(relBuilderFactory, description, operandTransform); + } + + @Override + public String description() { + return description; + } + + @Override + public RelBuilderFactory relBuilderFactory() { + return relBuilderFactory; + } + + @Override + public RelRule.Config withDescription(@org.checkerframework.checker.nullness.qual.Nullable String description) { + return new DefaultRuleConfig(relBuilderFactory, description, operandTransform); + } + + @Override + public RelRule.OperandTransform operandSupplier() { + return operandTransform; + } + + @Override + public RelRule.Config withOperandSupplier(RelRule.OperandTransform operandTransform) { + return new DefaultRuleConfig(relBuilderFactory, description, operandTransform); + } + + @Override + public RelOptRule toRule() { + return null; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/InstanceAccessByIdRule.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/InstanceAccessByIdRule.java new file mode 100644 index 0000000..10ab072 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/rules/InstanceAccessByIdRule.java @@ -0,0 +1,30 @@ +package cchesser.javaperf.mcp.calcite.rules; + +import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.plan.RelRule; +import org.apache.calcite.rel.core.Correlate; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.rules.InstanceAccessByIdRule}. + */ +public class InstanceAccessByIdRule extends RelRule { + public static final InstanceAccessByIdRule INSTANCE = + new InstanceAccessByIdRule( + DefaultRuleConfig.EMPTY + .withOperandSupplier( + b0 -> + b0.operand(Correlate.class) + .anyInputs() + ) + ); + + public InstanceAccessByIdRule(RelRule.Config config) { + super(config); + } + + @Override + public void onMatch(RelOptRuleCall call) { + System.out.println("InstanceAccessByIdRule fired for call " + call); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/ClassRowTypeCache.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/ClassRowTypeCache.java new file mode 100644 index 0000000..4ed57b5 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/ClassRowTypeCache.java @@ -0,0 +1,228 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import cchesser.javaperf.mcp.calcite.rex.RexBuilderContext; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.util.Pair; +import org.eclipse.mat.snapshot.model.FieldDescriptor; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.function.Function; + +import static cchesser.javaperf.mcp.calcite.schema.objects.SnapshotRexExpressions.getClassLoader; +import static cchesser.javaperf.mcp.calcite.schema.objects.SnapshotRexExpressions.getClassName; +import static cchesser.javaperf.mcp.calcite.schema.objects.SnapshotRexExpressions.getClassOf; +import static cchesser.javaperf.mcp.calcite.schema.objects.SnapshotRexExpressions.getSuper; +import static cchesser.javaperf.mcp.calcite.schema.objects.SnapshotRexExpressions.resolveField; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.ClassRowTypeCache}. + */ +public class ClassRowTypeCache { + + public static LoadingCache>>>> CACHE = CacheBuilder + .newBuilder() + .weakKeys() + .build(new CacheLoader>>>>() { + @Override + public LoadingCache>>> load( + final RelDataTypeFactory typeFactory) throws Exception { + return CacheBuilder.newBuilder().weakKeys() + .build(new ClassRowTypeResolver(typeFactory)); + } + }); + + private interface ExtraTypes extends IObject.Type { + int ANY = -1; + int CHARACTER = -2; + } + + private static final class ClassRowTypeResolver + extends + CacheLoader>>> { + private final RelDataTypeFactory typeFactory; + + private ClassRowTypeResolver(RelDataTypeFactory typeFactory) { + this.typeFactory = typeFactory; + } + + private LinkedHashMap getAllInstanceFields(IClass clazz) { + // In case base class and subclass have a field with the same name, we just use the one from a subclass + // TODO: use org.eclipse.mat.snapshot.model.IInstance.getFields() in those cases + LinkedHashMap seenFields = new LinkedHashMap<>(); + for (IClass i = clazz; i != null; i = i.getSuperClass()) { + List fds = i.getFieldDescriptors(); + // Iterate fields in a reversed order in order. + // We iterate class hierarchy in reverse as well (subclass -> superclass), + for (ListIterator it = fds.listIterator(fds.size()); it.hasPrevious(); ) { + FieldDescriptor fd = it.previous(); + if (!seenFields.containsKey(fd.getName())) { + seenFields.put(fd.getName(), new Field(fd)); + } + } + if (IClass.JAVA_LANG_CLASS.equals(i.getName())) { + seenFields.put(SpecialFields.CLASS_LOADER, new Field(SpecialFields.CLASS_LOADER, IObject.Type.OBJECT)); + seenFields.put(SpecialFields.SUPER, new Field(SpecialFields.SUPER, IObject.Type.OBJECT)); + seenFields.put(SpecialFields.CLASS_NAME, new Field(SpecialFields.CLASS_NAME, ExtraTypes.CHARACTER)); + // Hide the default "Class.name" field as it might be null + seenFields.remove("name"); + } + } + seenFields.put(SpecialFields.CLASS, new Field(SpecialFields.CLASS, IObject.Type.OBJECT)); + return seenFields; + } + + @Override + public Pair>> load( + IClassesList classesList) throws Exception { + List> resolvers = new ArrayList<>(); + List names = new ArrayList<>(); + List types = new ArrayList<>(); + + names.add("this"); + RelDataType any = typeFactory.createSqlType(SqlTypeName.ANY); + RelDataType anyNull = typeFactory.createTypeWithNullability(any, true); + types.add(any); + resolvers.add(SnapshotRexExpressions::computeThis); + + // In case multiple classes have a field with different datatype, we just make field type "ANY" + + LinkedHashMap fields = null; + for (IClass aClass : classesList.getRootClasses()) { + LinkedHashMap allInstanceFields = getAllInstanceFields(aClass); + if (fields == null) { + fields = allInstanceFields; + continue; + } + for (Iterator> it = fields.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + String fieldName = entry.getKey(); + Field field = allInstanceFields.get(fieldName); + if (field == null) { + // Keep just common fields + it.remove(); + continue; + } + if (entry.getValue().getType() == field.getType()) { + continue; + } + // If data type differs, use "ANY" type + entry.setValue(new Field(fieldName, ExtraTypes.ANY)); + } + } + + List fieldsInOrder = fields == null ? Collections.emptyList() : new ArrayList<>(fields.values()); + Collections.reverse(fieldsInOrder); + + for (Field field : fieldsInOrder) { + int type = field.getType(); + RelDataType dataType; + switch (type) { + case IObject.Type.BOOLEAN: + dataType = typeFactory.createJavaType(boolean.class); + break; + case IObject.Type.BYTE: + dataType = typeFactory.createJavaType(byte.class); + break; + case IObject.Type.CHAR: + dataType = typeFactory.createJavaType(char.class); + break; + case IObject.Type.DOUBLE: + dataType = typeFactory.createJavaType(double.class); + break; + case IObject.Type.FLOAT: + dataType = typeFactory.createJavaType(float.class); + break; + case IObject.Type.SHORT: + dataType = typeFactory.createJavaType(short.class); + break; + case IObject.Type.INT: + dataType = typeFactory.createJavaType(int.class); + break; + case IObject.Type.LONG: + dataType = typeFactory.createJavaType(long.class); + break; + case IObject.Type.OBJECT: + // fall-through + case ExtraTypes.ANY: + dataType = anyNull; + break; + case ExtraTypes.CHARACTER: + dataType = typeFactory.createTypeWithNullability( + typeFactory.createSqlType(SqlTypeName.VARCHAR), true); + break; + default: + dataType = typeFactory.createJavaType(String.class); + break; + } + types.add(dataType); + String fieldName = field.getName(); + Function columnCalc; + switch (fieldName) { + case SpecialFields.CLASS: + // This is Object#getClass + // For java.lang.Class it returns "java.lang.Class" + columnCalc = (RexBuilderContext context) -> + getClassOf(context, context.getIObjectId()); + break; + case SpecialFields.SUPER: + // This property is available only for classes + // It is assumed that getIObject would return IClass + columnCalc = (RexBuilderContext context) -> + getSuper(context, context.getIObject()); + break; + case SpecialFields.CLASS_LOADER: + // This property is available only for classes + // It is assumed that getIObject would return IClass + columnCalc = (RexBuilderContext context) -> + getClassLoader(context, context.getIObject()); + break; + case SpecialFields.CLASS_NAME: + // This property is available only for classes + // It is assumed that getIObject would return IClass + columnCalc = (RexBuilderContext context) -> + getClassName(context, context.getIObject()); + fieldName = "name"; + break; + default: + String resolvedField = fieldName; + columnCalc = (RexBuilderContext context) -> + resolveField(context, resolvedField); + } + if (type == IObject.Type.OBJECT) { + // Wrap object fields with HeapReference + Function prev = columnCalc; + columnCalc = (RexBuilderContext context) -> + context.toHeapReference(prev.apply(context)); + } else if (dataType != anyNull) { + Function prev = columnCalc; + columnCalc = (RexBuilderContext context) -> + context.getBuilder().makeCast(dataType, prev.apply(context)); + } + names.add(fieldName); + resolvers.add(columnCalc); + } + + return Pair.of( + typeFactory.createStructType(types, names), + resolvers); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/Field.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/Field.java new file mode 100644 index 0000000..de1a06e --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/Field.java @@ -0,0 +1,50 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import org.eclipse.mat.snapshot.model.FieldDescriptor; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.Field}. + */ +public class Field { + private final String name; + private final int type; + + public Field(String name, int type) { + this.name = name; + this.type = type; + } + + public Field(FieldDescriptor descriptor) { + this(descriptor.getName(), descriptor.getType()); + } + + public String getName() { + return name; + } + + public int getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Field field = (Field) o; + + return type == field.type && name.equals(field.name); + } + + @Override + public int hashCode() { + int result = name.hashCode(); + result = 31 * result + type; + return result; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/HeapOperatorTable.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/HeapOperatorTable.java new file mode 100644 index 0000000..43186d8 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/HeapOperatorTable.java @@ -0,0 +1,113 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import cchesser.javaperf.mcp.calcite.HeapReference; +import cchesser.javaperf.mcp.calcite.functions.IClassMethods; +import cchesser.javaperf.mcp.calcite.functions.IObjectMethods; +import cchesser.javaperf.mcp.calcite.functions.ISnapshotMethods; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.schema.impl.ScalarFunctionImpl; +import org.apache.calcite.sql.SqlFunction; +import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.sql.type.OperandTypes; +import org.apache.calcite.sql.type.ReturnTypes; +import org.apache.calcite.sql.type.SqlTypeFamily; +import org.apache.calcite.sql.validate.SqlUserDefinedFunction; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IObject; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.HeapOperatorTable}. + */ +public interface HeapOperatorTable { + // IObject + SqlFunction TO_HEAP_REFERENCE = new SqlUserDefinedFunction( + new SqlIdentifier("TO_HEAP_REFERENCE", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> + tf.createTypeWithNullability(tf.createJavaType(HeapReference.class), true)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(Object.class), true)), + i -> "iobject", + i -> false), + ScalarFunctionImpl.create(IObjectMethods.class, "toHeapReference")); + + SqlFunction RESOLVE_VALUE = new SqlUserDefinedFunction( + new SqlIdentifier("RESOLVE_VALUE", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(typeFactory -> typeFactory.createJavaType(Object.class)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY, SqlTypeFamily.CHARACTER), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(IObject.class), false), + tf.createTypeWithNullability(tf.createJavaType(String.class), false)), + i -> i == 0 ? "iobject" : "fieldName", + i -> false), + ScalarFunctionImpl.create(IObjectMethods.class, "resolveSimpleValue")); + + SqlFunction GET_CLASS_OF = new SqlUserDefinedFunction( + new SqlIdentifier("GET_CLASS_OF", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> + tf.createTypeWithNullability(tf.createJavaType(IClass.class), true)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(ISnapshot.class), false), + tf.createTypeWithNullability(tf.createJavaType(int.class), false)), + i -> i == 0 ? "snapshot" : "id", + i -> false), + ScalarFunctionImpl.create(ISnapshotMethods.class, "getClassOf")); + + // IClass + SqlFunction GET_SUPER = new SqlUserDefinedFunction( + new SqlIdentifier("GET_SUPER", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> + tf.createTypeWithNullability(tf.createJavaType(IClass.class), true)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(IObject.class), true)), + i -> "iclass", + i -> false), + ScalarFunctionImpl.create(IClassMethods.class, "getSuper")); + + SqlFunction GET_CLASS_LOADER = new SqlUserDefinedFunction( + new SqlIdentifier("GET_CLASS_LOADER", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> + tf.createTypeWithNullability(tf.createJavaType(IObject.class), true)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(IObject.class), false)), + i -> "iclass", + i -> false), + ScalarFunctionImpl.create(IClassMethods.class, "getClassLoader")); + + SqlFunction GET_CLASS_NAME = new SqlUserDefinedFunction( + new SqlIdentifier("GET_CLASS_NAME", SqlParserPos.ZERO), + SqlKind.OTHER_FUNCTION, + ReturnTypes.explicit(tf -> + tf.createTypeWithNullability(tf.createJavaType(String.class), true)), + null, + OperandTypes.operandMetadata( + ImmutableList.of(SqlTypeFamily.ANY), + tf -> ImmutableList.of( + tf.createTypeWithNullability(tf.createJavaType(IObject.class), true)), + i -> "iclass", + i -> false), + ScalarFunctionImpl.create(IClassMethods.class, "getClassName")); +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/IClassesList.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/IClassesList.java new file mode 100644 index 0000000..65deebb --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/IClassesList.java @@ -0,0 +1,62 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.model.IClass; + +import java.util.Collection; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.IClassesList}. + */ +public class IClassesList { + public final ISnapshot snapshot; + public final String className; + public final boolean includeSubClasses; + private long totalObjects = -1; + + public IClassesList(ISnapshot snapshot, String className, boolean includeSubClasses) { + this.snapshot = snapshot; + this.className = className; + this.includeSubClasses = includeSubClasses; + } + + public Collection getClasses() { + return getClasses(false); + } + + public Collection getRootClasses() { + return getClasses(false); + } + + public double getTotalObjects() { + if (totalObjects >= 0) { + return totalObjects; + } + long rows = 0; + for (IClass iClass : getClasses()) { + rows += iClass.getNumberOfObjects(); + } + return totalObjects = rows; + } + + private Collection getClasses(boolean justFirstItem) { + Collection classesByName; + try { + classesByName = snapshot.getClassesByName(className, + includeSubClasses && !justFirstItem); + } catch (SnapshotException e) { + throw new IllegalStateException("Unable to get class " + className); + } + return classesByName; + } + + @Override + public String toString() { + return "IClassesList{" + + "className='" + className + '\'' + + ", includeSubClasses=" + includeSubClasses + + '}'; + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceAccessByClassIdRule.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceAccessByClassIdRule.java new file mode 100644 index 0000000..ac512ac --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceAccessByClassIdRule.java @@ -0,0 +1,63 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import cchesser.javaperf.mcp.calcite.SnapshotHolder; +import cchesser.javaperf.mcp.calcite.rex.ExecutionRexBuilderContext; +import cchesser.javaperf.mcp.calcite.rex.RexBuilderContext; +import cchesser.javaperf.mcp.calcite.rules.DefaultRuleConfig; + +import org.apache.calcite.plan.*; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.tools.RelBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.InstanceAccessByClassIdRule}. + */ +public class InstanceAccessByClassIdRule extends RelRule { + public static final InstanceAccessByClassIdRule INSTANCE = + new InstanceAccessByClassIdRule( + DefaultRuleConfig.EMPTY + .withOperandSupplier( + b0 -> + b0.operand(InstanceByClassTableScan.class) + .anyInputs() + ) + ); + + public InstanceAccessByClassIdRule(RelRule.Config config) { + super(config); + } + + @Override + public void onMatch(RelOptRuleCall call) { + InstanceByClassTableScan scan = call.rel(0); + RelOptTable table = scan.getTable(); + RelOptSchema schema = table.getRelOptSchema(); + List indexName = new ArrayList<>(table.getQualifiedName()); + indexName.set(indexName.size() - 1, "$ids$:" + indexName.get(indexName.size() - 1)); + RelBuilder relBuilder = call.builder(); + relBuilder.push( + relBuilder.getScanFactory().createScan( + ViewExpanders.simpleContext(relBuilder.getCluster()), + schema.getTableForMember(indexName))); + + InstanceByClassTable instanceByClassTable = table.unwrap(InstanceByClassTable.class); + int snapshotId = SnapshotHolder.put(instanceByClassTable.snapshot); + + RexBuilderContext rexContext = new ExecutionRexBuilderContext( + scan.getCluster(), snapshotId, relBuilder.field(0)); + + List> resolvers = instanceByClassTable.getResolvers(); + List exprs = new ArrayList<>(resolvers.size()); + for (Function resolver : resolvers) { + exprs.add(resolver.apply(rexContext)); + } + call.transformTo( + relBuilder.projectNamed(exprs, table.getRowType().getFieldNames(), false) + .build()); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTable.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTable.java new file mode 100644 index 0000000..30fa13e --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTable.java @@ -0,0 +1,66 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import cchesser.javaperf.mcp.calcite.rex.RexBuilderContext; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptTable; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.schema.Statistic; +import org.apache.calcite.schema.Statistics; +import org.apache.calcite.schema.TranslatableTable; +import org.apache.calcite.schema.impl.AbstractTable; +import org.apache.calcite.util.ImmutableBitSet; +import org.apache.calcite.util.Pair; +import org.eclipse.mat.snapshot.ISnapshot; + +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.function.Function; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.InstanceByClassTable}. + */ +public class InstanceByClassTable extends AbstractTable implements TranslatableTable { + public final ISnapshot snapshot; + public final IClassesList classesList; + private List> resolvers; + + public InstanceByClassTable(IClassesList classesList) { + this.classesList = classesList; + this.snapshot = classesList.snapshot; + } + + public List> getResolvers() { + return resolvers; + } + + @Override + public RelDataType getRowType(RelDataTypeFactory typeFactory) { + Pair>> typeAndResolvers; + try { + typeAndResolvers = ClassRowTypeCache.CACHE.get(typeFactory).get( + classesList); + } catch (ExecutionException e) { + throw new IllegalStateException( + "Unable to identify row type for class " + classesList); + } + this.resolvers = typeAndResolvers.right; + + return typeAndResolvers.left; + } + + @Override + public Statistic getStatistic() { + List uniqueKeys = ImmutableList.of(ImmutableBitSet.of(0)); + return Statistics.of(classesList.getTotalObjects(), uniqueKeys); + } + + @Override + public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable table) { + return new InstanceByClassTableScan(context.getCluster(), table, this); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTableScan.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTableScan.java new file mode 100644 index 0000000..5d8b3aa --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceByClassTableScan.java @@ -0,0 +1,42 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.plan.RelOptPlanner; +import org.apache.calcite.plan.RelOptTable; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.TableScan; +import org.apache.calcite.rel.rules.CoreRules; + +import java.util.List; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.InstanceByClassTableScan}. + */ +public class InstanceByClassTableScan extends TableScan { + private final InstanceByClassTable instanceByClassTable; + + public InstanceByClassTableScan(RelOptCluster cluster, RelOptTable relOptTable, + InstanceByClassTable instanceByClassTable) { + super(cluster, cluster.traitSet(), ImmutableList.of(), relOptTable); + this.instanceByClassTable = instanceByClassTable; + } + + @Override + public void register(RelOptPlanner planner) { + planner.addRule(InstanceAccessByClassIdRule.INSTANCE); + planner.addRule(CoreRules.PROJECT_JOIN_TRANSPOSE); + // Does not yet work. + // These rules should convert join (a."@ID" = :var) to "snapshot.getObject(:var)" +// planner.addRule(NestedLoopsJoinRule.INSTANCE); +// planner.addRule(InstanceAccessByIdRule.INSTANCE); + } + + @Override + public RelNode copy(RelTraitSet traitSet, List inputs) { + assert inputs.isEmpty(); + return new InstanceByClassTableScan(getCluster(), table, instanceByClassTable); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceIdsByClassTable.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceIdsByClassTable.java new file mode 100644 index 0000000..2a33844 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/InstanceIdsByClassTable.java @@ -0,0 +1,79 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.primitives.Ints; +import org.apache.calcite.adapter.java.AbstractQueryableTable; +import org.apache.calcite.linq4j.Enumerator; +import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.linq4j.QueryProvider; +import org.apache.calcite.linq4j.Queryable; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.schema.Schema; +import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.schema.Statistic; +import org.apache.calcite.schema.Statistics; +import org.apache.calcite.schema.impl.AbstractTableQueryable; +import org.apache.calcite.util.ImmutableBitSet; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.ISnapshot; + +import java.util.Collections; +import java.util.List; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.InstanceIdsByClassTable}. + */ +public class InstanceIdsByClassTable extends AbstractQueryableTable { + private final ISnapshot snapshot; + private final IClassesList classesList; + + public InstanceIdsByClassTable(IClassesList classesList) { + super(Object[].class); + this.classesList = classesList; + this.snapshot = classesList.snapshot; + } + + @Override + public Schema.TableType getJdbcTableType() { + return Schema.TableType.SYSTEM_TABLE; + } + + @Override + public Queryable asQueryable(QueryProvider queryProvider, SchemaPlus schemaPlus, String tableName) { + return new AbstractTableQueryable(queryProvider, schemaPlus, this, tableName) { + @Override + public Enumerator enumerator() { + FluentIterable it = FluentIterable + .from(classesList.getClasses()) + .transformAndConcat( + input -> { + try { + return Ints.asList(input.getObjectIds()); + } catch (SnapshotException e) { + e.printStackTrace(); + return Collections.emptyList(); + } + }); + + return Linq4j.iterableEnumerator(it); + } + }; + } + + @Override + public Statistic getStatistic() { + List uniqueKeys = ImmutableList.of(ImmutableBitSet.of(0)); + return Statistics.of(classesList.getTotalObjects(), uniqueKeys); + } + + @Override + public RelDataType getRowType(RelDataTypeFactory typeFactory) { + return typeFactory.createStructType( + Collections.singletonList(typeFactory.createJavaType(int.class)), + Collections.singletonList("@ID") + ); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SnapshotRexExpressions.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SnapshotRexExpressions.java new file mode 100644 index 0000000..3348d20 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SnapshotRexExpressions.java @@ -0,0 +1,39 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +import cchesser.javaperf.mcp.calcite.rex.RexBuilderContext; + +import org.apache.calcite.rex.RexNode; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.SnapshotRexExpressions}. + */ +public interface SnapshotRexExpressions { + static RexNode computeThis(RexBuilderContext context) { + return context.getBuilder() + .makeCall(HeapOperatorTable.TO_HEAP_REFERENCE, context.getIObject()); + } + + static RexNode resolveField(RexBuilderContext context, String fieldName) { + return context.getBuilder() + .makeCall(HeapOperatorTable.RESOLVE_VALUE, + context.getIObject(), + context.getBuilder().makeLiteral(fieldName)); + } + + static RexNode getClassOf(RexBuilderContext context, RexNode iobject) { + return context.getBuilder().makeCall(HeapOperatorTable.GET_CLASS_OF, context.getSnapshot(), iobject); + } + + static RexNode getSuper(RexBuilderContext context, RexNode iclass) { + return context.getBuilder().makeCall(HeapOperatorTable.GET_SUPER, iclass); + } + + static RexNode getClassLoader(RexBuilderContext context, RexNode iclass) { + return context.getBuilder().makeCall(HeapOperatorTable.GET_CLASS_LOADER, iclass); + } + + static RexNode getClassName(RexBuilderContext context, RexNode iclass) { + return context.getBuilder().makeCall(HeapOperatorTable.GET_CLASS_NAME, iclass); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SpecialFields.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SpecialFields.java new file mode 100644 index 0000000..c7cc5fa --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/objects/SpecialFields.java @@ -0,0 +1,12 @@ +package cchesser.javaperf.mcp.calcite.schema.objects; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.objects.SpecialFields}. + */ +public interface SpecialFields { + String CLASS = "@class"; + String SUPER = "@super"; + String CLASS_LOADER = "@classLoader"; + String CLASS_NAME = "@className"; +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/references/OutboundReferencesTable.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/references/OutboundReferencesTable.java new file mode 100644 index 0000000..fa53416 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/calcite/schema/references/OutboundReferencesTable.java @@ -0,0 +1,71 @@ +package cchesser.javaperf.mcp.calcite.schema.references; + +import cchesser.javaperf.mcp.calcite.HeapReference; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.adapter.java.AbstractQueryableTable; +import org.apache.calcite.linq4j.Enumerator; +import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.linq4j.QueryProvider; +import org.apache.calcite.linq4j.Queryable; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.schema.Statistic; +import org.apache.calcite.schema.Statistics; +import org.apache.calcite.schema.impl.AbstractTableQueryable; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.util.ImmutableBitSet; +import org.apache.calcite.util.Util; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.snapshot.model.NamedReference; + +import java.util.List; + +/** + * Sourced from MAT Calcite Plugin. + * Original class: {@code com.github.vlsi.mat.calcite.schema.references.OutboundReferencesTable}. + */ +public class OutboundReferencesTable extends AbstractQueryableTable { + private final static List NON_UNIQUE_KEYS_STATISTICS = ImmutableList.of(ImmutableBitSet.of()); + + private final List references; + + public OutboundReferencesTable(List references) { + super(Object[].class); + this.references = references; + } + + @Override + public Queryable asQueryable(QueryProvider queryProvider, SchemaPlus schemaPlus, String tableName) { + return new AbstractTableQueryable(queryProvider, schemaPlus, this, tableName) { + @Override + public Enumerator enumerator() { + List it = Util.transform(references, namedReference -> { + HeapReference ref = null; + try { + ref = HeapReference.valueOf(namedReference.getObject()); + } catch (SnapshotException e) { + e.printStackTrace(); + } + return new Object[]{namedReference.getName(), ref}; + }); + + return Linq4j.iterableEnumerator(it); + } + }; + } + + @Override + public Statistic getStatistic() { + return Statistics.of(references.size(), NON_UNIQUE_KEYS_STATISTICS); + } + + @Override + public RelDataType getRowType(RelDataTypeFactory typeFactory) { + return typeFactory.builder() + .add("name", typeFactory.createJavaType(String.class)) + .add("this", typeFactory.createSqlType(SqlTypeName.ANY)) + .build(); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/config/ServerConfig.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/config/ServerConfig.java new file mode 100644 index 0000000..c4e8347 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/config/ServerConfig.java @@ -0,0 +1,71 @@ +package cchesser.javaperf.mcp.config; + +import java.nio.file.Path; +import java.time.Duration; + +public record ServerConfig( + Path cacheRoot, + int defaultRowLimit, + int maxRowLimit, + Duration toolTimeout, + int gcRootPathLimit, + boolean webUiEnabled, + int webUiPort, + long webUiMaxUploadBytes +) { + private static final String CACHE_ENV = "JAVA_HEAP_MCP_CACHE_DIR"; + private static final String DEFAULT_LIMIT_ENV = "JAVA_HEAP_MCP_DEFAULT_LIMIT"; + private static final String MAX_LIMIT_ENV = "JAVA_HEAP_MCP_MAX_LIMIT"; + private static final String TOOL_TIMEOUT_SECONDS_ENV = "JAVA_HEAP_MCP_TOOL_TIMEOUT_SECONDS"; + private static final String GC_ROOT_PATH_LIMIT_ENV = "JAVA_HEAP_MCP_GC_ROOT_PATH_LIMIT"; + private static final String WEB_UI_ENABLED_ENV = "JAVA_HEAP_MCP_WEB_UI_ENABLED"; + private static final String WEB_UI_PORT_ENV = "JAVA_HEAP_MCP_WEB_UI_PORT"; + private static final String WEB_UI_MAX_UPLOAD_BYTES_ENV = "JAVA_HEAP_MCP_WEB_UI_MAX_UPLOAD_BYTES"; + + public static ServerConfig fromEnvironment() { + Path cacheRoot = Path.of(System.getenv().getOrDefault( + CACHE_ENV, + Path.of(System.getProperty("user.home"), ".cache", "java-heap-mcp").toString() + )); + + return new ServerConfig( + cacheRoot, + intEnv(DEFAULT_LIMIT_ENV, 50), + intEnv(MAX_LIMIT_ENV, 250), + Duration.ofSeconds(intEnv(TOOL_TIMEOUT_SECONDS_ENV, 120)), + intEnv(GC_ROOT_PATH_LIMIT_ENV, 10), + boolEnv(WEB_UI_ENABLED_ENV, false), + intEnv(WEB_UI_PORT_ENV, 7777), + longEnv(WEB_UI_MAX_UPLOAD_BYTES_ENV, 0L) + ); + } + + public int normalizeLimit(Integer requestedLimit) { + int limit = requestedLimit == null ? defaultRowLimit : requestedLimit; + return Math.max(1, Math.min(limit, maxRowLimit)); + } + + private static int intEnv(String env, int defaultValue) { + String value = System.getenv(env); + if (value == null || value.isBlank()) { + return defaultValue; + } + return Integer.parseInt(value); + } + + private static boolean boolEnv(String env, boolean defaultValue) { + String value = System.getenv(env); + if (value == null || value.isBlank()) { + return defaultValue; + } + return "1".equals(value) || "true".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value); + } + + private static long longEnv(String env, long defaultValue) { + String value = System.getenv(env); + if (value == null || value.isBlank()) { + return defaultValue; + } + return Long.parseLong(value); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/DominatorEntry.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/DominatorEntry.java new file mode 100644 index 0000000..e492bf6 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/DominatorEntry.java @@ -0,0 +1,10 @@ +package cchesser.javaperf.mcp.heap; + +public record DominatorEntry( + int objectId, + String className, + long shallowHeapBytes, + long retainedHeapBytes, + String displayName +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/GcRootPath.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/GcRootPath.java new file mode 100644 index 0000000..2a0fb0a --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/GcRootPath.java @@ -0,0 +1,9 @@ +package cchesser.javaperf.mcp.heap; + +import java.util.List; + +public record GcRootPath( + int terminalObjectId, + List path +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapAnalysisService.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapAnalysisService.java new file mode 100644 index 0000000..90036de --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapAnalysisService.java @@ -0,0 +1,25 @@ +package cchesser.javaperf.mcp.heap; + +import java.nio.file.Path; +import java.util.List; + +public interface HeapAnalysisService extends AutoCloseable { + LoadedHeap open(Path heapDumpPath); + + HeapOverview overview(LoadedHeap heap, int limit); + + OqlQueryResult runOql(LoadedHeap heap, String query, int limit, int offset); + + List histogram(LoadedHeap heap, String sortBy, int limit); + + List dominators(LoadedHeap heap, Integer rootObjectId, int limit); + + ObjectInspection inspectObject(LoadedHeap heap, int objectId, int limit); + + List findPathsToGcRoots(LoadedHeap heap, int objectId, boolean excludeWeakRefs, int limit); + + Object leakSuspects(LoadedHeap heap, int limit); + + @Override + void close(); +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapDumpManager.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapDumpManager.java new file mode 100644 index 0000000..7e61ffc --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapDumpManager.java @@ -0,0 +1,295 @@ +package cchesser.javaperf.mcp.heap; + +import cchesser.javaperf.mcp.cache.CacheMetadataStore; +import cchesser.javaperf.mcp.cache.CachedHeapDumpRecord; +import cchesser.javaperf.mcp.cache.HeapDumpFingerprint; +import cchesser.javaperf.mcp.config.ServerConfig; +import cchesser.javaperf.mcp.util.Timeouts; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public final class HeapDumpManager implements AutoCloseable { + private static final String[] PROJECT_ADJECTIVES = { + "bold", "bright", "calm", "clever", "eager", "fuzzy", "gentle", "happy", + "keen", "lively", "mighty", "noble", "quick", "quiet", "sunny", "wise" + }; + private static final String[] PROJECT_NAMES = { + "ada", "curie", "darwin", "einstein", "hopper", "lovelace", "morse", "newton", + "noether", "pascal", "tesla", "turing", "watson", "wright" + }; + + private final ServerConfig config; + private final CacheMetadataStore metadataStore; + private final HeapAnalysisService heapAnalysisService; + private final Map sessions = new ConcurrentHashMap<>(); + + public HeapDumpManager(ServerConfig config, CacheMetadataStore metadataStore, HeapAnalysisService heapAnalysisService) { + this.config = config; + this.metadataStore = metadataStore; + this.heapAnalysisService = heapAnalysisService; + } + + public Map loadDump(String dumpPath) { + return loadDump(null, dumpPath); + } + + public Map loadDump(String projectName, String dumpPath) { + Path sourcePath = Path.of(dumpPath).toAbsolutePath().normalize(); + if (!Files.exists(sourcePath)) { + throw new HeapOperationException(HeapErrorCode.INVALID_PATH, "Heap dump path does not exist: " + sourcePath); + } + if (!Files.isReadable(sourcePath)) { + throw new HeapOperationException(HeapErrorCode.INVALID_PATH, "Heap dump path is not readable: " + sourcePath); + } + String normalizedProject = normalizeProjectName(projectName); + + return Timeouts.call("heap_load_dump", config.toolTimeout(), () -> { + closeActiveSessionsForProject(normalizedProject); + HeapDumpFingerprint fingerprint = HeapDumpFingerprint.from(sourcePath); + CachedHeapDumpRecord cacheRecord = prepareCacheEntry(normalizedProject, fingerprint); + LoadedHeap loadedHeap = heapAnalysisService.open(cacheDumpPath(cacheRecord)); + String handle = "heap-" + UUID.randomUUID(); + HeapSession session = new HeapSession(handle, metadataStore.touchLoaded(cacheRecord), loadedHeap, Instant.now()); + sessions.put(handle, session); + Map response = new LinkedHashMap<>(); + response.put("project", normalizedProject); + response.put("handle", handle); + response.put("fingerprint", cacheRecord.fingerprint()); + response.put("sourcePath", cacheRecord.sourcePath()); + response.put("loadedAt", session.loadedAt()); + response.put("summary", session.snapshotSummary()); + return response; + }); + } + + public Map openProject(String projectName) { + String normalizedProject = normalizeProjectName(projectName); + CachedHeapDumpRecord record = metadataStore.getByProject(normalizedProject) + .orElseThrow(() -> new HeapOperationException(HeapErrorCode.NOT_FOUND, "Unknown project: " + normalizedProject)); + + return Timeouts.call("heap_open_project", config.toolTimeout(), () -> { + closeActiveSessionsForProject(normalizedProject); + LoadedHeap loadedHeap = heapAnalysisService.open(cacheDumpPath(record)); + String handle = "heap-" + UUID.randomUUID(); + HeapSession session = new HeapSession(handle, metadataStore.touchLoaded(record), loadedHeap, Instant.now()); + sessions.put(handle, session); + Map response = new LinkedHashMap<>(); + response.put("project", normalizedProject); + response.put("handle", handle); + response.put("fingerprint", record.fingerprint()); + response.put("sourcePath", record.sourcePath()); + response.put("loadedAt", session.loadedAt()); + response.put("summary", session.snapshotSummary()); + return response; + }); + } + + public List> listDumps() { + List> result = new ArrayList<>(); + for (CachedHeapDumpRecord record : metadataStore.list().stream() + .sorted(Comparator + .comparing(CachedHeapDumpRecord::projectName) + .thenComparing(CachedHeapDumpRecord::lastLoadedAt, Comparator.nullsLast(Comparator.reverseOrder()))) + .toList()) { + Optional activeHandle = sessions.values().stream() + .filter(session -> session.cacheRecord().projectName().equals(record.projectName())) + .map(HeapSession::handle) + .findFirst(); + Map item = new LinkedHashMap<>(); + item.put("project", record.projectName()); + item.put("fingerprint", record.fingerprint()); + item.put("sourcePath", record.sourcePath()); + item.put("fileSizeBytes", record.fileSizeBytes()); + item.put("cachedDumpSizeBytes", record.cachedDumpSizeBytes()); + item.put("lastModifiedTime", record.lastModifiedTime()); + item.put("createdAt", record.createdAt()); + item.put("lastLoadedAt", record.lastLoadedAt()); + item.put("activeHandle", activeHandle.orElse(null)); + item.put("cachePath", cacheDumpPath(record).toString()); + result.add(item); + } + return result; + } + + public List> listProjects() { + return metadataStore.list().stream() + .sorted(Comparator.comparing(CachedHeapDumpRecord::projectName)) + .map(record -> { + Optional activeHandle = sessions.values().stream() + .filter(session -> session.cacheRecord().projectName().equals(record.projectName())) + .map(HeapSession::handle) + .findFirst(); + Map item = new LinkedHashMap<>(); + item.put("project", record.projectName()); + item.put("fingerprint", record.fingerprint()); + item.put("sourcePath", record.sourcePath()); + item.put("lastLoadedAt", record.lastLoadedAt()); + item.put("activeHandle", activeHandle.orElse(null)); + return item; + }) + .collect(Collectors.toList()); + } + + public Map unloadDump(String handle) { + HeapSession removed = sessions.remove(handle); + if (removed == null) { + throw new HeapOperationException(HeapErrorCode.NOT_FOUND, "Unknown heap handle: " + handle); + } + removed.loadedHeap().dispose(); + return Map.of( + "project", removed.cacheRecord().projectName(), + "handle", handle, + "unloaded", true, + "cachePreserved", true, + "fingerprint", removed.cacheRecord().fingerprint() + ); + } + + public HeapOverview overview(String handle, Integer limit) { + HeapSession session = requireSession(handle); + return Timeouts.call("heap_get_overview", config.toolTimeout(), + () -> heapAnalysisService.overview(session.loadedHeap(), config.normalizeLimit(limit))); + } + + public OqlQueryResult runOql(String handle, String query, Integer limit, Integer offset) { + HeapSession session = requireSession(handle); + return Timeouts.call("heap_run_oql", config.toolTimeout(), + () -> heapAnalysisService.runOql(session.loadedHeap(), query, config.normalizeLimit(limit), Math.max(0, offset == null ? 0 : offset))); + } + + public List histogram(String handle, String sortBy, Integer limit) { + HeapSession session = requireSession(handle); + return Timeouts.call("heap_get_histogram", config.toolTimeout(), + () -> heapAnalysisService.histogram(session.loadedHeap(), sortBy, config.normalizeLimit(limit))); + } + + public List dominators(String handle, Integer rootObjectId, Integer limit) { + HeapSession session = requireSession(handle); + return Timeouts.call("heap_get_dominators", config.toolTimeout(), + () -> heapAnalysisService.dominators(session.loadedHeap(), rootObjectId, config.normalizeLimit(limit))); + } + + public ObjectInspection inspectObject(String handle, int objectId, Integer limit) { + HeapSession session = requireSession(handle); + return Timeouts.call("heap_inspect_object", config.toolTimeout(), + () -> heapAnalysisService.inspectObject(session.loadedHeap(), objectId, config.normalizeLimit(limit))); + } + + public List findPathsToGcRoots(String handle, int objectId, boolean excludeWeakRefs, Integer limit) { + HeapSession session = requireSession(handle); + int effectiveLimit = Math.min(config.gcRootPathLimit(), config.normalizeLimit(limit)); + return Timeouts.call("heap_find_path_to_gc_roots", config.toolTimeout(), + () -> heapAnalysisService.findPathsToGcRoots(session.loadedHeap(), objectId, excludeWeakRefs, effectiveLimit)); + } + + public Object findLeakSuspects(String handle, Integer limit) { + HeapSession session = requireSession(handle); + return Timeouts.call("heap_find_leak_suspects", config.toolTimeout(), + () -> heapAnalysisService.leakSuspects(session.loadedHeap(), config.normalizeLimit(limit))); + } + + private CachedHeapDumpRecord prepareCacheEntry(String projectName, HeapDumpFingerprint fingerprint) throws IOException { + Path entryDir = config.cacheRoot().resolve("entries").resolve(fingerprint.fingerprint()); + Files.createDirectories(entryDir); + Path cachedDumpPath = entryDir.resolve(fingerprint.sourceFileName()); + + if (!Files.exists(cachedDumpPath)) { + try { + Files.createLink(cachedDumpPath, fingerprint.sourcePath()); + } catch (UnsupportedOperationException | IOException linkFailure) { + Files.copy(fingerprint.sourcePath(), cachedDumpPath, StandardCopyOption.REPLACE_EXISTING); + } + } + + String fullFileHash = HeapDumpFingerprint.sha256File(fingerprint.sourcePath()); + CachedHeapDumpRecord record = new CachedHeapDumpRecord( + projectName, + fingerprint.fingerprint(), + fingerprint.sourcePath().toString(), + cachedDumpPath.getFileName().toString(), + fingerprint.fileSizeBytes(), + fingerprint.lastModifiedTime(), + Instant.now(), + null, + fullFileHash, + Files.size(cachedDumpPath) + ); + return metadataStore.getByProject(projectName).map(existing -> new CachedHeapDumpRecord( + projectName, + fingerprint.fingerprint(), + fingerprint.sourcePath().toString(), + cachedDumpPath.getFileName().toString(), + fingerprint.fileSizeBytes(), + fingerprint.lastModifiedTime(), + existing.createdAt(), + existing.lastLoadedAt(), + fullFileHash, + fingerprint.fileSizeBytes() + )).map(metadataStore::upsert).orElseGet(() -> metadataStore.upsert(record)); + } + + private Path cacheDumpPath(CachedHeapDumpRecord record) { + return config.cacheRoot().resolve("entries").resolve(record.fingerprint()).resolve(record.cacheFileName()); + } + + private HeapSession requireSession(String handle) { + HeapSession session = sessions.get(handle); + if (session == null) { + throw new HeapOperationException(HeapErrorCode.NOT_FOUND, "Unknown heap handle: " + handle); + } + return session; + } + + private void closeActiveSessionsForProject(String projectName) { + List handles = sessions.values().stream() + .filter(session -> session.cacheRecord().projectName().equals(projectName)) + .map(HeapSession::handle) + .toList(); + for (String handle : handles) { + HeapSession removed = sessions.remove(handle); + if (removed != null) { + removed.loadedHeap().dispose(); + } + } + } + + private String normalizeProjectName(String projectName) { + if (projectName == null || projectName.isBlank()) { + return memorableProjectName(); + } + return projectName.trim(); + } + + private String memorableProjectName() { + for (int attempt = 0; attempt < 100; attempt++) { + String candidate = PROJECT_ADJECTIVES[ThreadLocalRandom.current().nextInt(PROJECT_ADJECTIVES.length)] + + "_" + + PROJECT_NAMES[ThreadLocalRandom.current().nextInt(PROJECT_NAMES.length)]; + if (metadataStore.getByProject(candidate).isEmpty()) { + return candidate; + } + } + return "heap_" + UUID.randomUUID().toString().substring(0, 8); + } + + @Override + public void close() { + sessions.values().forEach(session -> session.loadedHeap().dispose()); + sessions.clear(); + heapAnalysisService.close(); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapErrorCode.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapErrorCode.java new file mode 100644 index 0000000..8d2c75f --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapErrorCode.java @@ -0,0 +1,11 @@ +package cchesser.javaperf.mcp.heap; + +public enum HeapErrorCode { + INVALID_PATH, + UNSUPPORTED_FORMAT, + CORRUPT_INDEX, + OQL_ERROR, + TIMEOUT, + NOT_FOUND, + INTERNAL +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOperationException.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOperationException.java new file mode 100644 index 0000000..1a376b8 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOperationException.java @@ -0,0 +1,37 @@ +package cchesser.javaperf.mcp.heap; + +import java.time.Duration; + +public final class HeapOperationException extends RuntimeException { + private final HeapErrorCode errorCode; + + public HeapOperationException(HeapErrorCode errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + public HeapOperationException(HeapErrorCode errorCode, String message, Throwable cause) { + super(message, cause); + this.errorCode = errorCode; + } + + public HeapErrorCode errorCode() { + return errorCode; + } + + public static HeapOperationException timeout(String operationName, Duration timeout, Throwable cause) { + return new HeapOperationException( + HeapErrorCode.TIMEOUT, + "Operation '%s' timed out after %d seconds".formatted(operationName, timeout.toSeconds()), + cause + ); + } + + public static HeapOperationException interrupted(String operationName, Throwable cause) { + return new HeapOperationException( + HeapErrorCode.INTERNAL, + "Operation '%s' was interrupted".formatted(operationName), + cause + ); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOverview.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOverview.java new file mode 100644 index 0000000..1a77e2a --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapOverview.java @@ -0,0 +1,11 @@ +package cchesser.javaperf.mcp.heap; + +import java.util.List; +import java.util.Map; + +public record HeapOverview( + Map snapshot, + List topClasses, + List topDominators +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapSession.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapSession.java new file mode 100644 index 0000000..5c1cd1e --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HeapSession.java @@ -0,0 +1,17 @@ +package cchesser.javaperf.mcp.heap; + +import cchesser.javaperf.mcp.cache.CachedHeapDumpRecord; + +import java.time.Instant; +import java.util.Map; + +public record HeapSession( + String handle, + CachedHeapDumpRecord cacheRecord, + LoadedHeap loadedHeap, + Instant loadedAt +) { + public Map snapshotSummary() { + return loadedHeap.snapshotSummary(); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HistogramEntry.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HistogramEntry.java new file mode 100644 index 0000000..f980907 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/HistogramEntry.java @@ -0,0 +1,10 @@ +package cchesser.javaperf.mcp.heap; + +public record HistogramEntry( + int classId, + String className, + long objectCount, + long shallowHeapBytes, + Long retainedHeapBytes +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/LoadedHeap.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/LoadedHeap.java new file mode 100644 index 0000000..8ad992e --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/LoadedHeap.java @@ -0,0 +1,14 @@ +package cchesser.javaperf.mcp.heap; + +import java.nio.file.Path; +import java.util.Map; + +public interface LoadedHeap { + Path heapDumpPath(); + + Map snapshotSummary(); + + Object nativeSnapshot(); + + void dispose(); +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatHeapService.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatHeapService.java new file mode 100644 index 0000000..0f396d0 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatHeapService.java @@ -0,0 +1,397 @@ +package cchesser.javaperf.mcp.heap; + +import cchesser.javaperf.mcp.calcite.CalciteDataSource; +import cchesser.javaperf.mcp.calcite.RowSetTable; +import cchesser.javaperf.mcp.config.ServerConfig; +import org.eclipse.mat.SnapshotException; +import org.eclipse.mat.inspections.LeakHunterQuery; +import org.eclipse.mat.query.IResultTable; +import org.eclipse.mat.snapshot.ClassHistogramRecord; +import org.eclipse.mat.snapshot.Histogram; +import org.eclipse.mat.snapshot.IOQLQuery; +import org.eclipse.mat.snapshot.ISnapshot; +import org.eclipse.mat.snapshot.SnapshotFactory; +import org.eclipse.mat.snapshot.model.Field; +import org.eclipse.mat.snapshot.model.FieldDescriptor; +import org.eclipse.mat.snapshot.model.GCRootInfo; +import org.eclipse.mat.snapshot.model.IClass; +import org.eclipse.mat.snapshot.model.IInstance; +import org.eclipse.mat.snapshot.model.IObject; +import org.eclipse.mat.snapshot.model.NamedReference; +import org.eclipse.mat.util.IProgressListener; +import org.eclipse.mat.util.VoidProgressListener; + +import java.nio.file.Path; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; + +public final class MatHeapService implements HeapAnalysisService { + private static final Logger LOGGER = Logger.getLogger(MatHeapService.class.getName()); + @SuppressWarnings("unused") + private final ServerConfig config; + + public MatHeapService(ServerConfig config) { + this.config = config; + MatRuntime.initialize(); + } + + @Override + public LoadedHeap open(Path heapDumpPath) { + try { + ISnapshot snapshot = SnapshotFactory.openSnapshot(heapDumpPath.toFile(), progress()); + return new MatLoadedHeap(heapDumpPath, snapshot, snapshotSummary(snapshot)); + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to open heap dump " + heapDumpPath, exception); + } + } + + @Override + public HeapOverview overview(LoadedHeap heap, int limit) { + ISnapshot snapshot = snapshot(heap); + Map summary = snapshotSummary(snapshot); + List topClasses = histogram(heap, "retained", limit); + List topDominators = dominators(heap, null, limit); + return new HeapOverview(summary, topClasses, topDominators); + } + + @Override + public OqlQueryResult runOql(LoadedHeap heap, String query, int limit, int offset) { + ISnapshot snapshot = snapshot(heap); + LOGGER.info(() -> "Executing OQL query (limit=" + limit + ", offset=" + offset + "): " + diagnosticQuery(query)); + try { + // Calcite is the primary query engine. It provides SQL joins, grouping, + // ordering, lateral table functions, and the MAT-aware functions exposed + // by the embedded mat-calcite-plugin implementation. + try { + return tableResult(query, executeCalcite(snapshot, query), offset, limit); + } catch (SQLException calciteException) { + // Keep MAT OQL available for existing callers using MAT-only syntax. + LOGGER.fine(() -> "Query was not accepted by Calcite; trying MAT OQL: " + calciteException.getMessage()); + } + + IOQLQuery compiledQuery = SnapshotFactory.createQuery(query); + Object raw = compiledQuery.execute(snapshot, progress()); + if (raw instanceof int[] objectIds) { + List> rows = new ArrayList<>(); + int end = Math.min(objectIds.length, offset + limit); + for (int index = offset; index < end; index++) { + int objectId = objectIds[index]; + IObject object = snapshot.getObject(objectId); + rows.add(Map.of( + "objectId", objectId, + "address", snapshot.mapIdToAddress(objectId), + "className", object.getClazz().getName(), + "displayName", safeDisplayName(object), + "shallowHeapBytes", snapshot.getHeapSize(objectId), + "retainedHeapBytes", snapshot.getRetainedHeapSize(objectId) + )); + } + return new OqlQueryResult(query, List.of("objectId", "address", "className", "displayName", "shallowHeapBytes", "retainedHeapBytes"), + rows, offset, limit, end < objectIds.length, objectIds.length); + } + if (raw instanceof IResultTable table) { + return tableResult(query, table, offset, limit); + } + LOGGER.info(() -> "OQL scalar result type: " + (raw == null ? "null" : raw.getClass().getName())); + Map scalarRow = new LinkedHashMap<>(); + scalarRow.put("value", raw); + return new OqlQueryResult(query, List.of("value"), List.of(scalarRow), offset, limit, false, 1); + } catch (SnapshotException exception) { + LOGGER.log(Level.WARNING, "OQL query failed: " + diagnosticQuery(query), exception); + throw new HeapOperationException(HeapErrorCode.OQL_ERROR, "Failed to execute OQL query: " + diagnosticQuery(query), exception); + } catch (RuntimeException exception) { + LOGGER.log(Level.WARNING, "OQL query failed with runtime error: " + diagnosticQuery(query), exception); + throw exception; + } + } + + private IResultTable executeCalcite(ISnapshot snapshot, String query) throws SQLException { + Connection connection = null; + Statement statement = null; + ResultSet resultSet = null; + try { + connection = CalciteDataSource.getConnection(snapshot); + statement = connection.createStatement(); + resultSet = statement.executeQuery(query); + RowSetFactory rowSetFactory = RowSetProvider.newFactory(); + CachedRowSet rowSet = rowSetFactory.createCachedRowSet(); + rowSet.populate(resultSet); + return new RowSetTable(rowSet); + } finally { + CalciteDataSource.close(resultSet, statement, connection); + } + } + + private static String diagnosticQuery(String query) { + if (query == null) { + return ""; + } + return query.replace("\r", "\\r").replace("\n", "\\n"); + } + + @Override + public List histogram(LoadedHeap heap, String sortBy, int limit) { + ISnapshot snapshot = snapshot(heap); + try { + Histogram histogram = snapshot.getHistogram(progress()); + Comparator comparator = switch (sortBy == null ? "retained" : sortBy) { + case "count" -> Comparator.comparingLong(HistogramEntry::objectCount).reversed(); + case "shallow" -> Comparator.comparingLong(HistogramEntry::shallowHeapBytes).reversed(); + default -> Comparator.comparingLong( + entry -> entry.retainedHeapBytes() == null ? Long.MIN_VALUE : entry.retainedHeapBytes() + ).reversed(); + }; + return histogram.getClassHistogramRecords().stream() + .map(record -> toHistogramEntry(snapshot, record)) + .sorted(comparator) + .limit(limit) + .toList(); + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to compute histogram", exception); + } + } + + @Override + public List dominators(LoadedHeap heap, Integer rootObjectId, int limit) { + ISnapshot snapshot = snapshot(heap); + try { + int[] roots = rootObjectId == null ? snapshot.getImmediateDominatedIds(-1) : snapshot.getImmediateDominatedIds(rootObjectId); + if (roots == null) { + return List.of(); + } + return Arrays.stream(roots) + .mapToObj(objectId -> toDominatorEntry(snapshot, objectId)) + .sorted(Comparator.comparingLong(DominatorEntry::retainedHeapBytes).reversed()) + .limit(limit) + .toList(); + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to compute dominators", exception); + } + } + + @Override + public ObjectInspection inspectObject(LoadedHeap heap, int objectId, int limit) { + ISnapshot snapshot = snapshot(heap); + try { + IObject object = snapshot.getObject(objectId); + List fields = extractFields(object); + List inbound = Arrays.stream(snapshot.getInboundRefererIds(objectId)) + .limit(limit) + .mapToObj(id -> toReference(snapshot, id)) + .toList(); + List outbound = Arrays.stream(snapshot.getOutboundReferentIds(objectId)) + .limit(limit) + .mapToObj(id -> toReference(snapshot, id)) + .toList(); + GCRootInfo[] gcRootInfos = snapshot.getGCRootInfo(objectId); + return new ObjectInspection( + objectId, + snapshot.mapIdToAddress(objectId), + object.getClazz().getName(), + safeDisplayName(object), + snapshot.getHeapSize(objectId), + snapshot.getRetainedHeapSize(objectId), + snapshot.getImmediateDominatorId(objectId), + gcRootInfos == null ? List.of() : List.of(GCRootInfo.getTypeSetAsString(gcRootInfos)), + fields, + inbound, + outbound + ); + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to inspect object " + objectId, exception); + } + } + + @Override + public List findPathsToGcRoots(LoadedHeap heap, int objectId, boolean excludeWeakRefs, int limit) { + ISnapshot snapshot = snapshot(heap); + try { + Map> exclusions = excludeWeakRefs ? Map.of() : null; + var computer = snapshot.getPathsFromGCRoots(objectId, exclusions); + List paths = new ArrayList<>(); + while (paths.size() < limit) { + int[] rawPath = computer.getNextShortestPath(); + if (rawPath == null) { + break; + } + List references = Arrays.stream(rawPath) + .mapToObj(id -> toReference(snapshot, id)) + .toList(); + paths.add(new GcRootPath(objectId, references)); + } + return paths; + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to find GC root paths for object " + objectId, exception); + } + } + + @Override + public Object leakSuspects(LoadedHeap heap, int limit) { + ISnapshot snapshot = snapshot(heap); + try { + LeakHunterQuery query = new LeakHunterQuery(); + query.snapshot = snapshot; + Object result = query.execute(progress()); + if (result instanceof IResultTable table) { + return tableResult("leak_suspects", table, 0, limit); + } + return Map.of("summary", String.valueOf(result)); + } catch (Exception exception) { + return Map.of( + "available", false, + "message", "Leak suspect analysis is not available for this heap dump or MAT runtime.", + "details", exception.getMessage() + ); + } + } + + private OqlQueryResult tableResult(String query, IResultTable table, int offset, int limit) { + List columns = Arrays.stream(table.getColumns()).map(column -> column.getLabel()).toList(); + int totalRows = table.getRowCount(); + int end = Math.min(totalRows, offset + limit); + List> rows = new ArrayList<>(); + for (int rowIndex = offset; rowIndex < end; rowIndex++) { + Object row = table.getRow(rowIndex); + Map values = new LinkedHashMap<>(); + for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) { + values.put(columns.get(columnIndex), table.getColumnValue(row, columnIndex)); + } + rows.add(values); + } + return new OqlQueryResult(query, columns, rows, offset, limit, end < totalRows, totalRows); + } + + private HistogramEntry toHistogramEntry(ISnapshot snapshot, ClassHistogramRecord record) { + try { + long retained = record.getRetainedHeapSize(); + if (retained == 0L) { + retained = record.calculateRetainedSize(snapshot, true, false, progress()); + } + return new HistogramEntry( + record.getClassId(), + record.getLabel(), + record.getNumberOfObjects(), + record.getUsedHeapSize(), + retained == 0L ? null : Math.abs(retained) + ); + } catch (SnapshotException exception) { + return new HistogramEntry(record.getClassId(), record.getLabel(), record.getNumberOfObjects(), record.getUsedHeapSize(), null); + } + } + + private DominatorEntry toDominatorEntry(ISnapshot snapshot, int objectId) { + try { + IObject object = snapshot.getObject(objectId); + return new DominatorEntry( + objectId, + object.getClazz().getName(), + snapshot.getHeapSize(objectId), + snapshot.getRetainedHeapSize(objectId), + safeDisplayName(object) + ); + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to convert dominator " + objectId, exception); + } + } + + private ObjectReference toReference(ISnapshot snapshot, int objectId) { + try { + IObject object = snapshot.getObject(objectId); + return new ObjectReference(objectId, object.getClazz().getName(), snapshot.mapIdToAddress(objectId), safeDisplayName(object)); + } catch (SnapshotException exception) { + throw classifySnapshotException("Failed to resolve object reference " + objectId, exception); + } + } + + private List extractFields(IObject object) { + if (!(object instanceof IInstance instance)) { + List pseudoFields = new ArrayList<>(); + for (NamedReference reference : object.getOutboundReferences()) { + Integer referencedObjectId; + try { + referencedObjectId = reference.getObjectId(); + } catch (SnapshotException exception) { + referencedObjectId = null; + } + pseudoFields.add(new ObjectFieldValue(reference.getName(), "reference", reference.getObjectAddress(), referencedObjectId)); + } + return pseudoFields; + } + + List values = new ArrayList<>(); + for (Field field : instance.getFields()) { + Object value = field.getValue(); + values.add(new ObjectFieldValue(field.getName(), field.getVerboseSignature(), value, null)); + } + Collection descriptors = instance.getClazz().getFieldDescriptors(); + for (FieldDescriptor descriptor : descriptors) { + boolean alreadyPresent = values.stream().anyMatch(value -> value.name().equals(descriptor.getName())); + if (!alreadyPresent) { + values.add(new ObjectFieldValue(descriptor.getName(), descriptor.getVerboseSignature(), null, null)); + } + } + return values; + } + + private Map snapshotSummary(ISnapshot snapshot) { + var info = snapshot.getSnapshotInfo(); + Map summary = new LinkedHashMap<>(); + summary.put("path", info.getPath()); + summary.put("prefix", info.getPrefix()); + summary.put("jvmInfo", info.getJvmInfo()); + summary.put("identifierSize", info.getIdentifierSize()); + summary.put("creationDate", info.getCreationDate()); + summary.put("numberOfObjects", info.getNumberOfObjects()); + summary.put("numberOfClasses", info.getNumberOfClasses()); + summary.put("numberOfClassLoaders", info.getNumberOfClassLoaders()); + summary.put("usedHeapSize", info.getUsedHeapSize()); + return summary; + } + + private String safeDisplayName(IObject object) { + try { + return object.getDisplayName(); + } catch (RuntimeException ignored) { + return object.getTechnicalName(); + } + } + + private ISnapshot snapshot(LoadedHeap heap) { + return (ISnapshot) heap.nativeSnapshot(); + } + + private IProgressListener progress() { + return new VoidProgressListener(); + } + + private HeapOperationException classifySnapshotException(String message, SnapshotException exception) { + String lowerMessage = exception.getMessage() == null ? "" : exception.getMessage().toLowerCase(); + if (lowerMessage.contains("hprof") || lowerMessage.contains("format")) { + return new HeapOperationException(HeapErrorCode.UNSUPPORTED_FORMAT, message, exception); + } + if (lowerMessage.contains("index")) { + return new HeapOperationException(HeapErrorCode.CORRUPT_INDEX, message, exception); + } + return new HeapOperationException(HeapErrorCode.INTERNAL, message, exception); + } + + @Override + public void close() { + // No global resources to close beyond per-snapshot disposal. + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatLoadedHeap.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatLoadedHeap.java new file mode 100644 index 0000000..20cd278 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatLoadedHeap.java @@ -0,0 +1,26 @@ +package cchesser.javaperf.mcp.heap; + +import org.eclipse.mat.snapshot.ISnapshot; + +import java.nio.file.Path; +import java.util.Map; + +public record MatLoadedHeap( + Path heapDumpPath, + ISnapshot snapshot, + Map snapshotSummary +) implements LoadedHeap { + @Override + public Object nativeSnapshot() { + return snapshot; + } + + @Override + public void dispose() { + try { + org.eclipse.mat.snapshot.SnapshotFactory.dispose(snapshot); + } catch (RuntimeException ignored) { + // Best-effort disposal during shutdown or handle close. + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatRuntime.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatRuntime.java new file mode 100644 index 0000000..9e07709 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/MatRuntime.java @@ -0,0 +1,285 @@ +package cchesser.javaperf.mcp.heap; + +import org.eclipse.core.internal.registry.ExtensionRegistry; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.RegistryFactory; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker; +import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; +import org.eclipse.core.runtime.spi.RegistryContributor; +import org.eclipse.core.runtime.spi.RegistryStrategy; +import org.eclipse.mat.internal.MATPlugin; +import org.eclipse.mat.parser.internal.ParserPlugin; +import org.eclipse.mat.report.internal.ReportPlugin; +import org.eclipse.mat.hprof.HprofPlugin; +import org.eclipse.core.runtime.preferences.IPreferencesService; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.eclipse.core.runtime.content.IContentType; +import org.eclipse.core.runtime.content.IContentTypeManager; +import org.osgi.util.tracker.ServiceTracker; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Proxy; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.jar.JarFile; + +/** Initializes the MAT OSGi services needed when MAT is used from a plain JVM. */ +final class MatRuntime { + private static final Object LOCK = new Object(); + private static volatile boolean initialized; + + private MatRuntime() { + } + + static void initialize() { + if (initialized) { + return; + } + synchronized (LOCK) { + if (initialized) { + return; + } + try { + IExtensionRegistry registry = RegistryFactory.createRegistry(new ClassLoadingRegistryStrategy(), null, null); + RegistryFactory.setDefaultRegistryProvider(() -> registry); + addMatContributions((ExtensionRegistry) registry); + + installContentTypeManager(simpleContentTypes()); + activateHprofPlugin(); + + IExtensionTracker tracker = new ExtensionTracker(registry); + MATPlugin matPlugin = new MATPlugin(); + setBundle(matPlugin, bundle("org.eclipse.mat.api")); + activate(MATPlugin.class, matPlugin, tracker); + ReportPlugin reportPlugin = new ReportPlugin(); + setBundle(reportPlugin, bundle("org.eclipse.mat.report")); + activate(ReportPlugin.class, reportPlugin, tracker); + ParserPlugin parserPlugin = new ParserPlugin(); + setStaticField(ParserPlugin.class, "plugin", parserPlugin); + setField(parserPlugin, "tracker", tracker); + setField(parserPlugin, "registry", new org.eclipse.mat.parser.internal.util.ParserRegistry(tracker)); + initialized = true; + } catch (ReflectiveOperationException | IOException | CoreException exception) { + throw new IllegalStateException("Unable to initialize the MAT runtime", exception); + } + } + } + + private static void addMatContributions(ExtensionRegistry registry) throws IOException { + List bundles = List.of( + "org.eclipse.mat.api.jar", + "org.eclipse.mat.report.jar", + "org.eclipse.mat.parser.jar", + "org.eclipse.mat.hprof.jar" + ); + Path matDirectory = findMatDirectory(); + for (String bundle : bundles) { + Path path = findBundle(matDirectory, bundle); + try (JarFile jar = new JarFile(path.toFile()); InputStream pluginXml = jar.getInputStream(jar.getJarEntry("plugin.xml"))) { + String contributor = bundle.substring(0, bundle.length() - ".jar".length()); + RegistryContributor registryContributor = new RegistryContributor(contributor, contributor, null, null); + registry.addContribution(pluginXml, registryContributor, true, contributor, null, null); + } + } + } + + private static Path findMatDirectory() throws IOException { + List candidates = new ArrayList<>(); + String configuredDirectory = System.getProperty("java.heap.mcp.mat.directory"); + if (configuredDirectory != null && !configuredDirectory.isBlank()) { + candidates.add(Path.of(configuredDirectory)); + } + candidates.add(Path.of("target", "mat")); + candidates.add(Path.of("vendor", "mat")); + + try { + Path applicationDirectory = Path.of(MatRuntime.class.getProtectionDomain() + .getCodeSource().getLocation().toURI()).getParent(); + candidates.add(applicationDirectory.resolve("mat")); + candidates.add(applicationDirectory.resolveSibling("vendor").resolve("mat")); + } catch (Exception ignored) { + // The working-directory candidates still cover normal Maven/script launches. + } + + for (Path candidate : candidates) { + if (Files.isDirectory(candidate) && hasMatBundle(candidate)) { + return candidate; + } + } + throw new IOException("Could not find MAT bundles. Checked: " + candidates); + } + + private static boolean hasMatBundle(Path directory) { + return Files.exists(directory.resolve("org.eclipse.mat.api.jar")) + || hasVersionedBundle(directory, "org.eclipse.mat.api.jar"); + } + + private static Path findBundle(Path directory, String bundleName) throws IOException { + Path exactPath = directory.resolve(bundleName); + if (Files.isRegularFile(exactPath)) { + return exactPath; + } + try (var paths = Files.list(directory)) { + return paths.filter(path -> path.getFileName().toString().startsWith(bundleName.substring(0, bundleName.length() - 4) + "_") + && path.getFileName().toString().endsWith(".jar")) + .findFirst() + .orElseThrow(() -> new IOException("Could not find MAT bundle " + bundleName + " in " + directory)); + } + } + + private static boolean hasVersionedBundle(Path directory, String bundleName) { + try (var paths = Files.list(directory)) { + String prefix = bundleName.substring(0, bundleName.length() - 4) + "_"; + return paths.anyMatch(path -> path.getFileName().toString().startsWith(prefix) + && path.getFileName().toString().endsWith(".jar")); + } catch (IOException exception) { + return false; + } + } + + private static void activate(Class pluginType, Object plugin, IExtensionTracker tracker) + throws ReflectiveOperationException { + setStaticField(pluginType, "plugin", plugin); + setField(plugin, "tracker", tracker); + } + + private static void installContentTypeManager(Object manager) throws ReflectiveOperationException { + Class platformType = Class.forName("org.eclipse.core.internal.runtime.InternalPlatform"); + Object platform = platformType.getMethod("getDefault").invoke(null); + Field trackerField = platformType.getDeclaredField("contentTracker"); + trackerField.setAccessible(true); + trackerField.set(platform, new ContentTypeServiceTracker(manager)); + Field preferenceTracker = platformType.getDeclaredField("preferencesTracker"); + preferenceTracker.setAccessible(true); + IPreferencesService preferences = (IPreferencesService) Proxy.newProxyInstance( + MatRuntime.class.getClassLoader(), new Class[]{IPreferencesService.class}, + (proxy, method, args) -> switch (method.getName()) { + case "getString" -> ""; + case "getBoolean" -> false; + default -> null; + }); + preferenceTracker.set(platform, new ContentTypeServiceTracker(preferences)); + } + + private static void activateHprofPlugin() throws ReflectiveOperationException { + Class platformActivator = Class.forName("org.eclipse.core.internal.runtime.PlatformActivator"); + Field context = platformActivator.getDeclaredField("context"); + context.setAccessible(true); + context.set(null, ContentTypeServiceTracker.nullContext()); + HprofPlugin plugin = new HprofPlugin(); + setBundle(plugin, bundle("org.eclipse.mat.hprof")); + setStaticField(HprofPlugin.class, "plugin", plugin); + } + + private static Bundle bundle(String symbolicName) { + return (Bundle) Proxy.newProxyInstance( + MatRuntime.class.getClassLoader(), new Class[]{Bundle.class}, + (proxy, method, args) -> { + if ("getSymbolicName".equals(method.getName())) { + return symbolicName; + } + if ("getEntry".equals(method.getName()) && args != null && args.length == 1 && args[0] != null) { + String resource = args[0].toString().replaceFirst("^\\$nl\\$/?", "").replaceFirst("^/", ""); + return MatRuntime.class.getClassLoader().getResource(resource); + } + return null; + }); + } + + private static void setBundle(Object plugin, Bundle bundle) throws ReflectiveOperationException { + Field bundleField = org.eclipse.core.runtime.Plugin.class.getDeclaredField("bundle"); + bundleField.setAccessible(true); + bundleField.set(plugin, bundle); + } + + private static IContentTypeManager simpleContentTypes() { + IContentType base = contentType("org.eclipse.mat.JavaHeapDump", null); + IContentType hprof = contentType("org.eclipse.mat.HprofHeapDump", base); + return (IContentTypeManager) Proxy.newProxyInstance( + MatRuntime.class.getClassLoader(), new Class[]{IContentTypeManager.class}, + (proxy, method, args) -> switch (method.getName()) { + case "getContentType" -> "org.eclipse.mat.HprofHeapDump".equals(args[0]) ? hprof : base; + case "findContentTypeFor" -> hprof; + case "findContentTypesFor" -> new IContentType[]{hprof, base}; + case "getAllContentTypes" -> new IContentType[]{base, hprof}; + case "getMatcher" -> proxy; + default -> null; + }); + } + + private static IContentType contentType(String id, IContentType base) { + return (IContentType) Proxy.newProxyInstance( + MatRuntime.class.getClassLoader(), new Class[]{IContentType.class}, + (proxy, method, args) -> switch (method.getName()) { + case "getId" -> id; + case "getName" -> id; + case "getBaseType" -> base; + case "isKindOf" -> args[0] == base || proxy == args[0] || id.equals(((IContentType) args[0]).getId()); + case "getFileSpecs" -> new String[0]; + case "getDefaultCharset" -> "UTF-8"; + case "isUserDefined", "isAssociatedWith" -> false; + default -> null; + }); + } + + private static void setStaticField(Class type, String name, Object value) throws ReflectiveOperationException { + Field field = type.getDeclaredField(name); + field.setAccessible(true); + field.set(null, value); + } + + private static void setField(Object target, String name, Object value) throws ReflectiveOperationException { + Field field = target.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(target, value); + } + + private static final class ClassLoadingRegistryStrategy extends RegistryStrategy { + private ClassLoadingRegistryStrategy() { + super(new java.io.File[]{Path.of(System.getProperty("java.io.tmpdir"), "java-heap-mcp-mat-registry").toFile()}, + new boolean[]{false}); + } + + @Override + public Object createExecutableExtension(RegistryContributor contributor, String className, + String overriddenContributorName) throws CoreException { + try { + return Class.forName(className).getDeclaredConstructor().newInstance(); + } catch (ReflectiveOperationException | LinkageError exception) { + throw new CoreException(new Status(IStatus.ERROR, "java-heap-mcp", exception.getMessage(), exception)); + } + } + } + + private static final class ContentTypeServiceTracker extends ServiceTracker { + private final Object service; + + private ContentTypeServiceTracker(Object service) { + super(nullContext(), "org.eclipse.core.runtime.content.IContentTypeManager", null); + this.service = Objects.requireNonNull(service); + } + + @Override + public Object getService() { + return service; + } + + private static BundleContext nullContext() { + return (BundleContext) Proxy.newProxyInstance( + MatRuntime.class.getClassLoader(), + new Class[]{BundleContext.class}, + (proxy, method, args) -> null + ); + } + } + +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectFieldValue.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectFieldValue.java new file mode 100644 index 0000000..81aa3c5 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectFieldValue.java @@ -0,0 +1,9 @@ +package cchesser.javaperf.mcp.heap; + +public record ObjectFieldValue( + String name, + String type, + Object value, + Integer referencedObjectId +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectInspection.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectInspection.java new file mode 100644 index 0000000..3532528 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectInspection.java @@ -0,0 +1,18 @@ +package cchesser.javaperf.mcp.heap; + +import java.util.List; + +public record ObjectInspection( + int objectId, + long address, + String className, + String displayName, + long shallowHeapBytes, + long retainedHeapBytes, + Integer immediateDominatorId, + List gcRootTypes, + List fields, + List inboundReferences, + List outboundReferences +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectReference.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectReference.java new file mode 100644 index 0000000..809e543 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/ObjectReference.java @@ -0,0 +1,9 @@ +package cchesser.javaperf.mcp.heap; + +public record ObjectReference( + int objectId, + String className, + long address, + String displayName +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlGrammar.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlGrammar.java new file mode 100644 index 0000000..4cb7183 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlGrammar.java @@ -0,0 +1,93 @@ +package cchesser.javaperf.mcp.heap; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Agent-facing description of the SQL dialect accepted by heap_run_oql. + * + *

This is deliberately a server contract rather than a copy of Calcite's + * complete parser grammar. Calcite can parse mutating statements, while this + * service only permits one read-only SELECT statement.

+ */ +public final class OqlGrammar { + private OqlGrammar() { + } + + public static Map describe() { + Map result = new LinkedHashMap<>(); + result.put("dialect", "Apache Calcite SQL backed by the MAT Calcite plugin"); + result.put("version", "1"); + result.put("readOnly", true); + result.put("statementContract", "Exactly one SELECT statement, without a trailing semicolon"); + result.put("grammar", Map.of( + "statement", "query", + "query", "[ WITH [ RECURSIVE ] withItem [, ...] ] (select | selectWithoutFrom | query UNION [ALL | DISTINCT] query | query EXCEPT [ALL | DISTINCT] query | query INTERSECT [ALL | DISTINCT] query) [ ORDER BY orderItem [, ...] ] [ LIMIT [start,] count ] [ OFFSET start { ROW | ROWS } ] [ FETCH { FIRST | NEXT } [count] { ROW | ROWS } ONLY ]", + "select", "SELECT [ ALL | DISTINCT ] projectItem [, projectItem ...] FROM tableExpression [ WHERE booleanExpression ] [ GROUP BY groupItem [, ...] ] [ HAVING booleanExpression ]", + "projectItem", "expression [ AS columnAlias ] | tableAlias.*", + "tableExpression", "tableReference [, tableReference ...] | tableExpression [NATURAL] [LEFT|RIGHT|FULL] [OUTER] JOIN tableExpression joinCondition | tableExpression CROSS JOIN tableExpression", + "tableReference", "tablePrimary [ AS alias ]", + "tablePrimary", "[catalog.]schema.table | UNNEST(expression) [WITH ORDINALITY] | [LATERAL] TABLE(functionName(expression [, ...]))", + "joinCondition", "ON booleanExpression | USING (column [, ...])", + "orderItem", "expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]", + "expression", "identifiers, literals, function calls, CASE, arithmetic, comparisons, boolean operators, MAP/ARRAY indexing, and CAST" + )); + result.put("restrictions", List.of( + "Only SELECT queries are supported; do not use EXPLAIN, DESCRIBE, INSERT, UPDATE, DELETE, MERGE, SET, or RESET.", + "Send one statement without a semicolon.", + "Double quotes delimit Java class/table identifiers; single quotes delimit string literals.", + "The MCP tool applies its own result limit and offset after query execution." + )); + result.put("heapSchema", Map.of( + "classes", "Each Java class is a table of direct instances without subclasses, for example java.util.HashMap.", + "subclasses", "Use the instanceof schema, for example instanceof.java.util.HashMap, to include subclass instances.", + "quotedClasses", "Quote fully qualified class names when needed, for example \"java.util.HashMap\" or \"long[]\".", + "specialColumn", "this is a reference to the current heap object.", + "dynamicFields", "Use this['fieldName'] and virtual properties this['@className'], this['@class'], this['@shallow'], and this['@retained'].", + "nativeTable", "native.ThreadStackFrames exposes thread stack and local-variable information." + )); + result.put("referenceFunctions", List.of( + function("getId(ref)", "internal object identifier"), + function("getAddress(ref)", "memory address"), + function("getType(ref)", "runtime class name"), + function("toString(ref)", "textual representation"), + function("shallowSize(ref)", "shallow heap size"), + function("retainedSize(ref)", "retained heap size"), + function("length(ref)", "array length"), + function("getSize(ref)", "collection, map, or array size"), + function("getByKey(ref, key)", "value from a referenced map"), + function("getField(ref, name)", "field value by name"), + function("getStaticField(ref, name)", "static field value"), + function("getStringContent(ref)", "formatted object content") + )); + result.put("tableFunctions", List.of( + function("getRetainedSet(ref)", "table of retained objects"), + function("getOutboundReferences(ref)", "(name, this) reference pairs"), + function("getInboundReferences(ref)", "inbound object references"), + function("getValues(ref)", "values in a Java collection"), + function("getMapEntries(ref)", "(key, value) map-entry pairs") + )); + result.put("collectionFunctions", List.of( + "asMap(ref)", "asMultiSet(ref)", "asArray(ref)", "asByteArray(ref)", "asShortArray(ref)", + "asIntArray(ref)", "asLongArray(ref)", "asBooleanArray(ref)", "asCharArray(ref)", + "asFloatArray(ref)", "asDoubleArray(ref)" + )); + result.put("examples", List.of( + "SELECT s.this FROM \"java.lang.String\" s", + "SELECT toString(file) AS file_str, COUNT(*) AS cnt FROM java.net.URL GROUP BY toString(file) HAVING COUNT(*) > 1 ORDER BY SUM(retainedSize(this)) DESC", + "SELECT u.this, refs.name, refs.this AS reference FROM java.net.URL u, LATERAL TABLE(getOutboundReferences(u.this)) refs", + "SELECT p.this, vals.key, vals.\"value\" FROM java.util.Properties p, LATERAL TABLE(getMapEntries(p.this)) vals", + "SELECT arrays.this, asLongArray(arrays.this)[1] AS first_element FROM \"long[]\" arrays WHERE length(arrays.this) > 0" + )); + result.put("references", Map.of( + "calciteSqlReference", "https://calcite.apache.org/docs/reference.html", + "matCalcitePlugin", "https://github.com/vlsi/mat-calcite-plugin" + )); + return result; + } + + private static Map function(String signature, String description) { + return Map.of("signature", signature, "description", description); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlQueryResult.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlQueryResult.java new file mode 100644 index 0000000..bd7e1cd --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/heap/OqlQueryResult.java @@ -0,0 +1,15 @@ +package cchesser.javaperf.mcp.heap; + +import java.util.List; +import java.util.Map; + +public record OqlQueryResult( + String query, + List columns, + List> rows, + int offset, + int limit, + boolean truncated, + int totalRows +) { +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpServerEngine.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpServerEngine.java new file mode 100644 index 0000000..b6e10e7 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpServerEngine.java @@ -0,0 +1,54 @@ +package cchesser.javaperf.mcp.mcp; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper; +import io.modelcontextprotocol.server.McpServer; +import io.modelcontextprotocol.server.McpSyncServer; +import io.modelcontextprotocol.server.transport.StdioServerTransportProvider; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.CountDownLatch; + +/** Owns the official MCP SDK server and keeps the process alive until stdio closes. */ +public final class McpServerEngine implements AutoCloseable { + private final McpSyncServer server; + private final CountDownLatch inputClosed = new CountDownLatch(1); + + public McpServerEngine(ObjectMapper mapper, ToolRegistry registry, InputStream input, OutputStream output) { + JacksonMcpJsonMapper jsonMapper = new JacksonMcpJsonMapper(mapper); + StdioServerTransportProvider transport = new StdioServerTransportProvider( + jsonMapper, new EofAwareInputStream(input, inputClosed), output); + this.server = McpServer.sync(transport) + .serverInfo("java-heap-mcp", "0.1.0") + .tools(registry.specifications()) + .jsonMapper(jsonMapper) + .immediateExecution(true) + .build(); + } + + public void run() throws InterruptedException { + inputClosed.await(); + } + + @Override + public void close() { + server.closeGracefully(); + inputClosed.countDown(); + } + + private static final class EofAwareInputStream extends InputStream { + private final InputStream delegate; + private final CountDownLatch eof; + + private EofAwareInputStream(InputStream delegate, CountDownLatch eof) { + this.delegate = delegate; + this.eof = eof; + } + + @Override public int read() throws IOException { int value = delegate.read(); if (value < 0) eof.countDown(); return value; } + @Override public int read(byte[] bytes, int offset, int length) throws IOException { int value = delegate.read(bytes, offset, length); if (value < 0) eof.countDown(); return value; } + @Override public void close() throws IOException { delegate.close(); eof.countDown(); } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpTool.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpTool.java new file mode 100644 index 0000000..070befe --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/McpTool.java @@ -0,0 +1,17 @@ +package cchesser.javaperf.mcp.mcp; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.Map; + +public record McpTool( + String name, + String description, + Map inputSchema, + ToolHandler handler +) { + @FunctionalInterface + public interface ToolHandler { + Object invoke(JsonNode arguments); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/ToolRegistry.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/ToolRegistry.java new file mode 100644 index 0000000..17cee52 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/mcp/ToolRegistry.java @@ -0,0 +1,127 @@ +package cchesser.javaperf.mcp.mcp; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import cchesser.javaperf.mcp.config.ServerConfig; +import cchesser.javaperf.mcp.heap.HeapDumpManager; +import cchesser.javaperf.mcp.heap.HeapOperationException; +import io.modelcontextprotocol.server.McpServerFeatures; +import io.modelcontextprotocol.spec.McpSchema; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** Adapts heap operations to the official MCP Java SDK tool model. */ +public final class ToolRegistry { + private final Map tools; + private final ObjectMapper mapper; + + public ToolRegistry(HeapDumpManager manager, ObjectMapper mapper, ServerConfig config) { + this.mapper = mapper; + this.tools = registerTools(manager, config); + } + + public List specifications() { + return tools.values().stream().map(this::specification).toList(); + } + + private McpServerFeatures.SyncToolSpecification specification(McpTool tool) { + McpSchema.Tool definition = McpSchema.Tool.builder() + .name(tool.name()) + .description(tool.description()) + .inputSchema(schema(tool.inputSchema())) + .build(); + + return McpServerFeatures.SyncToolSpecification.builder() + .tool(definition) + .callHandler((exchange, request) -> { + long startedAt = System.nanoTime(); + System.err.printf("[java-heap-mcp] MCP tool %s called%n", tool.name()); + try { + Object result = tool.handler().invoke(mapper.valueToTree(request.arguments())); + logToolCompletion(tool.name(), startedAt, "ok"); + return McpSchema.CallToolResult.builder() + .addTextContent(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result)) + .structuredContent(result) + .isError(false) + .build(); + } catch (HeapOperationException exception) { + logToolCompletion(tool.name(), startedAt, exception.errorCode().name()); + return errorResult(exception.errorCode().name(), exception.getMessage()); + } catch (Exception exception) { + logToolCompletion(tool.name(), startedAt, "INTERNAL"); + return errorResult("INTERNAL", exception.getMessage()); + } + }) + .build(); + } + + private static void logToolCompletion(String toolName, long startedAt, String outcome) { + long elapsedMillis = (System.nanoTime() - startedAt) / 1_000_000; + System.err.printf("[java-heap-mcp] MCP tool %s -> %s (%d ms)%n", toolName, outcome, elapsedMillis); + } + + @SuppressWarnings("unchecked") + private static McpSchema.JsonSchema schema(Map schema) { + return new McpSchema.JsonSchema( + (String) schema.get("type"), + (Map) schema.getOrDefault("properties", Map.of()), + (List) schema.getOrDefault("required", List.of()), + null, + Map.of(), + Map.of() + ); + } + + private McpSchema.CallToolResult errorResult(String errorCode, String message) { + Map errorBody = Map.of( + "errorCode", errorCode, + "message", message == null ? errorCode : message + ); + try { + return McpSchema.CallToolResult.builder() + .addTextContent(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(errorBody)) + .structuredContent(errorBody) + .isError(true) + .build(); + } catch (Exception exception) { + return McpSchema.CallToolResult.builder() + .addTextContent(String.valueOf(errorBody)) + .isError(true) + .build(); + } + } + + private Map registerTools(HeapDumpManager manager, ServerConfig config) { + Map registered = new LinkedHashMap<>(); + registered.put("heap_load_dump", new McpTool("heap_load_dump", "Load a Java heap dump into a named project, build or reuse MAT indexes, and return a session handle.", McpSchemaHelper.objectSchema(Map.of("project", McpSchemaHelper.string(), "path", McpSchemaHelper.string()), List.of("path")), a -> manager.loadDump(textOrNull(a, "project"), text(a, "path")))); + registered.put("heap_open_project", new McpTool("heap_open_project", "Open an existing cached project and return an active heap handle.", McpSchemaHelper.objectSchema(Map.of("project", McpSchemaHelper.string()), List.of("project")), a -> manager.openProject(text(a, "project")))); + registered.put("heap_list_projects", new McpTool("heap_list_projects", "List named projects that have cached heap dumps and show active handles.", McpSchemaHelper.objectSchema(Map.of(), List.of()), a -> manager.listProjects())); + registered.put("heap_list_dumps", new McpTool("heap_list_dumps", "List cached heap dumps, their metadata, and any currently active handles.", McpSchemaHelper.objectSchema(Map.of(), List.of()), a -> manager.listDumps())); + registered.put("heap_unload_dump", new McpTool("heap_unload_dump", "Unload an active heap handle while preserving its on-disk cache entry and indexes.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string()), List.of("handle")), a -> manager.unloadDump(text(a, "handle")))); + registered.put("heap_get_overview", new McpTool("heap_get_overview", "Return snapshot summary, top classes, and top retained-memory dominators for a loaded heap.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "limit", McpSchemaHelper.integer()), List.of("handle")), a -> manager.overview(text(a, "handle"), integer(a, "limit")))); + registered.put("heap_run_oql", new McpTool("heap_run_oql", "Execute an OQL query and return bounded, LLM-friendly rows with pagination.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "query", McpSchemaHelper.string(), "limit", McpSchemaHelper.integer(), "offset", McpSchemaHelper.integer()), List.of("handle", "query")), a -> manager.runOql(text(a, "handle"), text(a, "query"), integer(a, "limit"), integer(a, "offset")))); + registered.put("heap_get_oql_grammar", new McpTool("heap_get_oql_grammar", "Return the read-only Apache Calcite SQL grammar, MAT heap schema, functions, and examples accepted by heap_run_oql.", McpSchemaHelper.objectSchema(Map.of(), List.of()), a -> cchesser.javaperf.mcp.heap.OqlGrammar.describe())); + registered.put("heap_get_histogram", new McpTool("heap_get_histogram", "Return a bounded class histogram ordered by retained heap, shallow heap, or object count.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "sort", McpSchemaHelper.string(), "limit", McpSchemaHelper.integer()), List.of("handle")), a -> manager.histogram(text(a, "handle"), textOrNull(a, "sort"), integer(a, "limit")))); + registered.put("heap_get_dominators", new McpTool("heap_get_dominators", "Return retained-memory dominators from the heap root or from a supplied object root.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "root", McpSchemaHelper.integer(), "limit", McpSchemaHelper.integer()), List.of("handle")), a -> manager.dominators(text(a, "handle"), integer(a, "root"), integer(a, "limit")))); + registered.put("heap_inspect_object", new McpTool("heap_inspect_object", "Inspect a heap object including class, sizes, fields, and inbound/outbound references.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "objectId", McpSchemaHelper.integer(), "limit", McpSchemaHelper.integer()), List.of("handle", "objectId")), a -> manager.inspectObject(text(a, "handle"), requiredInteger(a, "objectId"), integer(a, "limit")))); + registered.put("heap_find_path_to_gc_roots", new McpTool("heap_find_path_to_gc_roots", "Find bounded object-reference paths from the target object to GC roots.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "objectId", McpSchemaHelper.integer(), "excludeWeakRefs", McpSchemaHelper.bool(), "limit", McpSchemaHelper.integer()), List.of("handle", "objectId")), a -> manager.findPathsToGcRoots(text(a, "handle"), requiredInteger(a, "objectId"), booleanValue(a, "excludeWeakRefs"), integer(a, "limit")))); + registered.put("heap_find_leak_suspects", new McpTool("heap_find_leak_suspects", "Run MAT leak-suspect analysis when available and return a bounded summary.", McpSchemaHelper.objectSchema(Map.of("handle", McpSchemaHelper.string(), "limit", McpSchemaHelper.integer()), List.of("handle")), a -> manager.findLeakSuspects(text(a, "handle"), integer(a, "limit")))); + return registered; + } + + private static String text(JsonNode a, String f) { JsonNode v = a.get(f); if (v == null || v.isNull() || v.asText().isBlank()) throw new IllegalArgumentException("Missing required argument: " + f); return v.asText(); } + private static String textOrNull(JsonNode a, String f) { JsonNode v = a.get(f); return v == null || v.isNull() ? null : v.asText(); } + private static Integer integer(JsonNode a, String f) { JsonNode v = a.get(f); return v == null || v.isNull() ? null : v.asInt(); } + private static int requiredInteger(JsonNode a, String f) { JsonNode v = a.get(f); if (v == null || v.isNull()) throw new IllegalArgumentException("Missing required argument: " + f); return v.asInt(); } + private static boolean booleanValue(JsonNode a, String f) { JsonNode v = a.get(f); return v != null && !v.isNull() && v.asBoolean(false); } + + private static final class McpSchemaHelper { + private McpSchemaHelper() { } + static Map objectSchema(Map properties, List required) { return Map.of("type", "object", "properties", properties, "required", required); } + static Map string() { return Map.of("type", "string"); } + static Map integer() { return Map.of("type", "integer"); } + static Map bool() { return Map.of("type", "boolean"); } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/server/HeapMcpServerApplication.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/server/HeapMcpServerApplication.java new file mode 100644 index 0000000..65ffefd --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/server/HeapMcpServerApplication.java @@ -0,0 +1,45 @@ +package cchesser.javaperf.mcp.server; + +import cchesser.javaperf.mcp.cache.CacheMetadataStore; +import cchesser.javaperf.mcp.config.ServerConfig; +import cchesser.javaperf.mcp.heap.HeapDumpManager; +import cchesser.javaperf.mcp.heap.MatHeapService; +import cchesser.javaperf.mcp.mcp.McpServerEngine; +import cchesser.javaperf.mcp.mcp.ToolRegistry; +import cchesser.javaperf.mcp.util.JsonSupport; +import cchesser.javaperf.mcp.web.WebUiServer; + +public final class HeapMcpServerApplication { + private HeapMcpServerApplication() { + } + + public static void main(String[] args) throws Exception { + ServerConfig config = ServerConfig.fromEnvironment(); + JsonSupport jsonSupport = JsonSupport.create(); + CacheMetadataStore metadataStore = new CacheMetadataStore(config.cacheRoot(), jsonSupport.mapper()); + MatHeapService heapService = new MatHeapService(config); + HeapDumpManager heapDumpManager = new HeapDumpManager(config, metadataStore, heapService); + ToolRegistry toolRegistry = new ToolRegistry(heapDumpManager, jsonSupport.mapper(), config); + WebUiServer webUiServer = null; + if (config.webUiEnabled()) { + webUiServer = new WebUiServer( + config.webUiPort(), + config.cacheRoot(), + config.webUiMaxUploadBytes(), + jsonSupport.mapper(), + heapDumpManager + ); + webUiServer.start(); + System.err.println("java-heap-mcp web UI available at http://127.0.0.1:" + config.webUiPort() + "/"); + } + + try (McpServerEngine engine = new McpServerEngine(jsonSupport.mapper(), toolRegistry, System.in, System.out)) { + engine.run(); + } finally { + if (webUiServer != null) { + webUiServer.close(); + } + heapDumpManager.close(); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/JsonSupport.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/JsonSupport.java new file mode 100644 index 0000000..65cfea1 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/JsonSupport.java @@ -0,0 +1,18 @@ +package cchesser.javaperf.mcp.util; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +public record JsonSupport(ObjectMapper mapper) { + public static JsonSupport create() { + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + return new JsonSupport(mapper); + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/Timeouts.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/Timeouts.java new file mode 100644 index 0000000..826dbad --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/util/Timeouts.java @@ -0,0 +1,42 @@ +package cchesser.javaperf.mcp.util; + +import cchesser.javaperf.mcp.heap.HeapOperationException; + +import java.time.Duration; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public final class Timeouts { + private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool(r -> { + Thread thread = new Thread(r, "java-heap-mcp-worker"); + thread.setDaemon(true); + return thread; + }); + + private Timeouts() { + } + + public static T call(String operationName, Duration timeout, Callable task) { + Future future = EXECUTOR.submit(task); + try { + return future.get(timeout.toMillis(), TimeUnit.MILLISECONDS); + } catch (TimeoutException exception) { + future.cancel(true); + throw HeapOperationException.timeout(operationName, timeout, exception); + } catch (InterruptedException exception) { + Thread.currentThread().interrupt(); + throw HeapOperationException.interrupted(operationName, exception); + } catch (ExecutionException exception) { + Throwable cause = exception.getCause(); + if (cause instanceof RuntimeException runtimeException) { + throw runtimeException; + } + throw new RuntimeException(cause); + } + } +} diff --git a/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/web/WebUiServer.java b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/web/WebUiServer.java new file mode 100644 index 0000000..40034d0 --- /dev/null +++ b/java-heap-mcp/src/main/java/cchesser/javaperf/mcp/web/WebUiServer.java @@ -0,0 +1,354 @@ +package cchesser.javaperf.mcp.web; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import cchesser.javaperf.mcp.heap.HeapDumpManager; +import cchesser.javaperf.mcp.heap.HeapOperationException; +import cchesser.javaperf.mcp.heap.OqlGrammar; + +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.nio.file.StandardCopyOption; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.function.Supplier; + +public final class WebUiServer implements AutoCloseable { + private static final int STREAM_BUFFER_BYTES = 1024 * 1024; + + private final HttpServer server; + private final ObjectMapper mapper; + private final HeapDumpManager manager; + private final Path uploadRoot; + private final long maxUploadBytes; + + public WebUiServer(int port, Path cacheRoot, long maxUploadBytes, ObjectMapper mapper, HeapDumpManager manager) throws IOException { + this.mapper = mapper; + this.manager = manager; + this.uploadRoot = cacheRoot.resolve("uploads"); + this.maxUploadBytes = maxUploadBytes; + this.server = HttpServer.create(new InetSocketAddress("127.0.0.1", port), 0); + this.server.setExecutor(Executors.newCachedThreadPool()); + registerRoutes(); + } + + public void start() { + server.start(); + } + + private void registerRoutes() { + registerRoute("/", this::handleRoot); + registerRoute("/api/projects", exchange -> handleJsonGet(exchange, manager::listProjects)); + registerRoute("/api/dumps", exchange -> handleJsonGet(exchange, manager::listDumps)); + registerRoute("/api/load", exchange -> handleJsonPost(exchange, body -> + manager.loadDump(textOrNull(body, "project"), text(body, "path")))); + registerRoute("/api/load-upload", this::handleLoadUpload); + registerRoute("/api/open-project", exchange -> handleJsonPost(exchange, body -> + manager.openProject(text(body, "project")))); + registerRoute("/api/unload", exchange -> handleJsonPost(exchange, body -> + manager.unloadDump(text(body, "handle")))); + registerRoute("/api/overview", exchange -> handleJsonPost(exchange, body -> + manager.overview(text(body, "handle"), integer(body, "limit")))); + registerRoute("/api/histogram", exchange -> handleJsonPost(exchange, body -> + manager.histogram(text(body, "handle"), textOrNull(body, "sort"), integer(body, "limit")))); + registerRoute("/api/dominators", exchange -> handleJsonPost(exchange, body -> + manager.dominators(text(body, "handle"), integer(body, "root"), integer(body, "limit")))); + registerRoute("/api/leaks", exchange -> handleJsonPost(exchange, body -> + manager.findLeakSuspects(text(body, "handle"), integer(body, "limit")))); + registerRoute("/api/inspect", exchange -> handleJsonPost(exchange, body -> + manager.inspectObject(text(body, "handle"), requiredInteger(body, "objectId"), integer(body, "limit")))); + registerRoute("/api/gc-roots", exchange -> handleJsonPost(exchange, body -> + manager.findPathsToGcRoots(text(body, "handle"), requiredInteger(body, "objectId"), + booleanOrDefault(body, "excludeWeakRefs", false), integer(body, "limit")))); + registerRoute("/api/oql", exchange -> handleJsonPost(exchange, body -> + manager.runOql(text(body, "handle"), text(body, "query"), integer(body, "limit"), integer(body, "offset")))); + registerRoute("/api/oql-grammar", exchange -> handleJsonGet(exchange, OqlGrammar::describe)); + registerRoute("/api/oql/grammar", exchange -> handleJsonGet(exchange, OqlGrammar::describe)); + } + + private void registerRoute(String path, HttpHandler handler) { + server.createContext(path, exchange -> { + long startedAt = System.nanoTime(); + try { + handler.handle(exchange); + } finally { + long elapsedMillis = (System.nanoTime() - startedAt) / 1_000_000; + System.err.printf("[java-heap-mcp] %s %s -> %d (%d ms)%n", + exchange.getRequestMethod(), exchange.getRequestURI(), exchange.getResponseCode(), elapsedMillis); + } + }); + } + + private void handleRoot(HttpExchange exchange) throws IOException { + if (handleCorsPreflight(exchange)) { + return; + } + if (!"GET".equalsIgnoreCase(exchange.getRequestMethod())) { + writeJson(exchange, 405, Map.of("error", "Method not allowed")); + return; + } + try (InputStream resource = getClass().getResourceAsStream("/web/index.html")) { + if (resource == null) { + writeJson(exchange, 500, Map.of("error", "Missing web UI resource")); + return; + } + byte[] bytes = resource.readAllBytes(); + exchange.getResponseHeaders().set("Content-Type", "text/html; charset=utf-8"); + exchange.sendResponseHeaders(200, bytes.length); + exchange.getResponseBody().write(bytes); + } finally { + exchange.close(); + } + } + + private void handleJsonGet(HttpExchange exchange, Supplier handler) throws IOException { + if (handleCorsPreflight(exchange)) { + return; + } + if (!"GET".equalsIgnoreCase(exchange.getRequestMethod())) { + writeJson(exchange, 405, Map.of("error", "Method not allowed")); + return; + } + try { + writeJson(exchange, 200, handler.get()); + } catch (HeapOperationException exception) { + logFailure(exchange, exception); + writeJson(exchange, 400, operationError(exception)); + } catch (IllegalArgumentException exception) { + logFailure(exchange, exception); + writeJson(exchange, 400, Map.of("error", exception.getMessage())); + } catch (Exception exception) { + logFailure(exchange, exception); + writeJson(exchange, 500, Map.of("error", exception.getMessage())); + } + } + + private void handleJsonPost(HttpExchange exchange, PostHandler handler) throws IOException { + if (handleCorsPreflight(exchange)) { + return; + } + if (!"POST".equalsIgnoreCase(exchange.getRequestMethod())) { + writeJson(exchange, 405, Map.of("error", "Method not allowed")); + return; + } + try { + JsonNode body = readJsonBody(exchange); + writeJson(exchange, 200, handler.handle(body)); + } catch (HeapOperationException exception) { + logFailure(exchange, exception); + writeJson(exchange, 400, operationError(exception)); + } catch (IllegalArgumentException exception) { + logFailure(exchange, exception); + writeJson(exchange, 400, Map.of("error", exception.getMessage())); + } catch (Exception exception) { + logFailure(exchange, exception); + writeJson(exchange, 500, Map.of("error", exception.getMessage())); + } + } + + private void handleLoadUpload(HttpExchange exchange) throws IOException { + if (handleCorsPreflight(exchange)) { + return; + } + if (!"POST".equalsIgnoreCase(exchange.getRequestMethod())) { + writeJson(exchange, 405, Map.of("error", "Method not allowed")); + return; + } + try { + Map query = parseQuery(exchange.getRequestURI().getRawQuery()); + String project = query.get("project"); + String fileName = query.get("filename"); + if (fileName == null || fileName.isBlank()) { + throw new IllegalArgumentException("Missing required query parameter: filename"); + } + String effectiveProject = project == null || project.isBlank() ? null : project.trim(); + Path projectDir = uploadRoot.resolve(safeSegment(effectiveProject == null ? "incoming" : effectiveProject)); + Files.createDirectories(projectDir); + + String cleanName = safeFileName(fileName); + Path uploadedPath = projectDir.resolve(System.currentTimeMillis() + "-" + cleanName); + Path tempPath = uploadedPath.resolveSibling(uploadedPath.getFileName() + ".tmp"); + try (InputStream body = exchange.getRequestBody()) { + streamToFile(body, tempPath); + } + Files.move(tempPath, uploadedPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + writeJson(exchange, 200, manager.loadDump(effectiveProject, uploadedPath.toString())); + } catch (HeapOperationException exception) { + logFailure(exchange, exception); + writeJson(exchange, 400, operationError(exception)); + } catch (IllegalArgumentException exception) { + logFailure(exchange, exception); + writeJson(exchange, 400, Map.of("error", exception.getMessage())); + } catch (Exception exception) { + logFailure(exchange, exception); + writeJson(exchange, 500, Map.of("error", exception.getMessage())); + } + } + + private JsonNode readJsonBody(HttpExchange exchange) throws IOException { + byte[] bytes = exchange.getRequestBody().readAllBytes(); + if (bytes.length == 0) { + return mapper.nullNode(); + } + return mapper.readTree(bytes); + } + + private void writeJson(HttpExchange exchange, int statusCode, Object body) throws IOException { + byte[] bytes = mapper.writeValueAsBytes(body); + addCorsHeaders(exchange); + exchange.getResponseHeaders().set("Content-Type", "application/json; charset=utf-8"); + exchange.sendResponseHeaders(statusCode, bytes.length); + exchange.getResponseBody().write(bytes); + exchange.close(); + } + + private static Map operationError(HeapOperationException exception) { + Map body = new java.util.LinkedHashMap<>(); + body.put("error", exception.getMessage()); + body.put("errorCode", exception.errorCode().name()); + if (exception.getCause() != null && exception.getCause().getMessage() != null) { + body.put("cause", exception.getCause().getMessage()); + } + return body; + } + + private boolean handleCorsPreflight(HttpExchange exchange) throws IOException { + if (!"OPTIONS".equalsIgnoreCase(exchange.getRequestMethod())) { + addCorsHeaders(exchange); + return false; + } + addCorsHeaders(exchange); + exchange.sendResponseHeaders(204, -1); + exchange.close(); + return true; + } + + private static void addCorsHeaders(HttpExchange exchange) { + exchange.getResponseHeaders().set("Access-Control-Allow-Origin", "*"); + exchange.getResponseHeaders().set("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); + exchange.getResponseHeaders().set("Access-Control-Allow-Headers", "Content-Type"); + exchange.getResponseHeaders().set("Access-Control-Max-Age", "86400"); + } + + private static void logFailure(HttpExchange exchange, Exception exception) { + System.err.printf("[java-heap-mcp] %s %s failed: %s%n", + exchange.getRequestMethod(), exchange.getRequestURI(), exception.getMessage()); + exception.printStackTrace(System.err); + } + + private static String text(JsonNode body, String field) { + JsonNode value = body.get(field); + if (value == null || value.isNull() || value.asText().isBlank()) { + throw new IllegalArgumentException("Missing required field: " + field); + } + return value.asText(); + } + + private static String textOrNull(JsonNode body, String field) { + JsonNode value = body.get(field); + if (value == null || value.isNull()) { + return null; + } + String result = value.asText(); + return result.isBlank() ? null : result; + } + + private static Integer integer(JsonNode body, String field) { + JsonNode value = body.get(field); + if (value == null || value.isNull()) { + return null; + } + return value.asInt(); + } + + private static int requiredInteger(JsonNode body, String field) { + JsonNode value = body.get(field); + if (value == null || value.isNull()) { + throw new IllegalArgumentException("Missing required field: " + field); + } + if (value.isIntegralNumber()) { + return value.asInt(); + } + if (value.isTextual()) { + try { + return Integer.parseInt(value.asText().trim()); + } catch (NumberFormatException ignored) { + // Fall through to the consistent missing/invalid-field response. + } + } + throw new IllegalArgumentException("Field must be an integer: " + field); + } + + private static boolean booleanOrDefault(JsonNode body, String field, boolean defaultValue) { + JsonNode value = body.get(field); + return value == null || value.isNull() ? defaultValue : value.asBoolean(defaultValue); + } + + private static Map parseQuery(String rawQuery) { + if (rawQuery == null || rawQuery.isBlank()) { + return Map.of(); + } + return java.util.Arrays.stream(rawQuery.split("&")) + .map(part -> part.split("=", 2)) + .collect(java.util.stream.Collectors.toMap( + pair -> decodeQueryComponent(pair[0]), + pair -> pair.length > 1 ? decodeQueryComponent(pair[1]) : "", + (left, right) -> right + )); + } + + private static String decodeQueryComponent(String value) { + return URLDecoder.decode(value, StandardCharsets.UTF_8); + } + + private static String safeSegment(String value) { + return value.replaceAll("[^a-zA-Z0-9._-]", "_"); + } + + private static String safeFileName(String value) { + String normalized = value.replace('\\', '/'); + int lastSlash = normalized.lastIndexOf('/'); + String base = lastSlash >= 0 ? normalized.substring(lastSlash + 1) : normalized; + if (base.isBlank()) { + return "uploaded.hprof"; + } + return base.replaceAll("[^a-zA-Z0-9._-]", "_"); + } + + private void streamToFile(InputStream input, Path destination) throws IOException { + byte[] buffer = new byte[STREAM_BUFFER_BYTES]; + long totalWritten = 0L; + try (var output = Files.newOutputStream(destination, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)) { + int read; + while ((read = input.read(buffer)) != -1) { + totalWritten += read; + if (maxUploadBytes > 0 && totalWritten > maxUploadBytes) { + throw new IllegalArgumentException("Upload exceeds configured max bytes: " + maxUploadBytes); + } + output.write(buffer, 0, read); + } + } catch (Exception exception) { + Files.deleteIfExists(destination); + throw exception; + } + } + + @Override + public void close() { + server.stop(0); + } + + @FunctionalInterface + private interface PostHandler { + Object handle(JsonNode body); + } +} diff --git a/java-heap-mcp/src/main/resources/web/index.html b/java-heap-mcp/src/main/resources/web/index.html new file mode 100644 index 0000000..6a9af65 --- /dev/null +++ b/java-heap-mcp/src/main/resources/web/index.html @@ -0,0 +1,184 @@ + + + + + + Java Heap MCP + + + +
+
+

Java Heap MCP Workspace

+

Load .hprof dumps into memorable projects and run focused heap analysis.

+
+ + + +
+

Load heap dump

+
+
+
+
+
+
+
+ +
+

Projects

+ + + + +
ProjectSourceStatusActions
+
+ +
+

Analysis

+
+
+
+
+
+
+ + +
+ +

Result

{}
+
+ + + + diff --git a/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/CacheMetadataStoreTest.java b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/CacheMetadataStoreTest.java new file mode 100644 index 0000000..9ebc4b5 --- /dev/null +++ b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/CacheMetadataStoreTest.java @@ -0,0 +1,38 @@ +package cchesser.javaperf.mcp.cache; + +import cchesser.javaperf.mcp.util.JsonSupport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Path; +import java.time.Instant; + +import static org.assertj.core.api.Assertions.assertThat; + +class CacheMetadataStoreTest { + @TempDir + Path tempDir; + + @Test + void persistsAndReloadsMetadata() { + CacheMetadataStore store = new CacheMetadataStore(tempDir, JsonSupport.create().mapper()); + CachedHeapDumpRecord record = new CachedHeapDumpRecord( + "proj-a", + "fp-1", + "/tmp/heap.hprof", + "heap.hprof", + 12L, + Instant.parse("2025-01-01T00:00:00Z"), + Instant.parse("2025-01-01T00:00:01Z"), + Instant.parse("2025-01-01T00:00:02Z"), + "hash", + 12L + ); + + store.upsert(record); + + CacheMetadataStore reloaded = new CacheMetadataStore(tempDir, JsonSupport.create().mapper()); + assertThat(reloaded.get("fp-1")).contains(record); + assertThat(reloaded.getByProject("proj-a")).contains(record); + } +} diff --git a/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprintTest.java b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprintTest.java new file mode 100644 index 0000000..7524ab4 --- /dev/null +++ b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/cache/HeapDumpFingerprintTest.java @@ -0,0 +1,28 @@ +package cchesser.javaperf.mcp.cache; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; + +class HeapDumpFingerprintTest { + @TempDir + Path tempDir; + + @Test + void fingerprintIncludesPathSizeAndTimestamp() throws Exception { + Path first = tempDir.resolve("first.hprof"); + Path second = tempDir.resolve("second.hprof"); + Files.writeString(first, "same-content"); + Files.writeString(second, "same-content"); + + HeapDumpFingerprint firstFingerprint = HeapDumpFingerprint.from(first); + HeapDumpFingerprint secondFingerprint = HeapDumpFingerprint.from(second); + + assertThat(firstFingerprint.fingerprint()).isNotEqualTo(secondFingerprint.fingerprint()); + assertThat(HeapDumpFingerprint.sha256File(first)).isEqualTo(HeapDumpFingerprint.sha256File(second)); + } +} diff --git a/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/HeapDumpManagerTest.java b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/HeapDumpManagerTest.java new file mode 100644 index 0000000..ab94b00 --- /dev/null +++ b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/HeapDumpManagerTest.java @@ -0,0 +1,110 @@ +package cchesser.javaperf.mcp.heap; + +import cchesser.javaperf.mcp.cache.CacheMetadataStore; +import cchesser.javaperf.mcp.config.ServerConfig; +import cchesser.javaperf.mcp.util.JsonSupport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class HeapDumpManagerTest { + @TempDir + Path tempDir; + + @Test + void loadAndUnloadTracksSessionsAndMetadata() throws Exception { + Path heapDump = tempDir.resolve("sample.hprof"); + Files.writeString(heapDump, "not-a-real-heap"); + + ServerConfig config = new ServerConfig(tempDir.resolve("cache"), 10, 50, Duration.ofSeconds(5), 5, false, 7777, 0L); + CacheMetadataStore metadataStore = new CacheMetadataStore(config.cacheRoot(), JsonSupport.create().mapper()); + try (HeapDumpManager manager = new HeapDumpManager(config, metadataStore, new FakeHeapAnalysisService())) { + Map loadResult = manager.loadDump("proj-a", heapDump.toString()); + String handle = (String) loadResult.get("handle"); + + assertThat(handle).startsWith("heap-"); + assertThat(loadResult).containsEntry("project", "proj-a"); + assertThat(manager.listDumps()).hasSize(1); + assertThat(manager.listProjects()).hasSize(1); + + Map unloadResult = manager.unloadDump(handle); + assertThat(unloadResult).containsEntry("unloaded", true); + + Map reopened = manager.openProject("proj-a"); + assertThat(reopened.get("project")).isEqualTo("proj-a"); + assertThat(reopened.get("handle")).isInstanceOf(String.class); + } + } + + private static final class FakeHeapAnalysisService implements HeapAnalysisService { + @Override + public LoadedHeap open(Path heapDumpPath) { + return new LoadedHeap() { + @Override + public Path heapDumpPath() { + return heapDumpPath; + } + + @Override + public Map snapshotSummary() { + return Map.of("path", heapDumpPath.toString(), "numberOfObjects", 3); + } + + @Override + public Object nativeSnapshot() { + return Map.of(); + } + + @Override + public void dispose() { + } + }; + } + + @Override + public HeapOverview overview(LoadedHeap heap, int limit) { + return new HeapOverview(heap.snapshotSummary(), List.of(), List.of()); + } + + @Override + public OqlQueryResult runOql(LoadedHeap heap, String query, int limit, int offset) { + return new OqlQueryResult(query, List.of("value"), List.of(Map.of("value", 1)), offset, limit, false, 1); + } + + @Override + public List histogram(LoadedHeap heap, String sortBy, int limit) { + return List.of(); + } + + @Override + public List dominators(LoadedHeap heap, Integer rootObjectId, int limit) { + return List.of(); + } + + @Override + public ObjectInspection inspectObject(LoadedHeap heap, int objectId, int limit) { + return new ObjectInspection(objectId, 0L, "Object", "Object", 1L, 1L, null, List.of(), List.of(), List.of(), List.of()); + } + + @Override + public List findPathsToGcRoots(LoadedHeap heap, int objectId, boolean excludeWeakRefs, int limit) { + return List.of(); + } + + @Override + public Object leakSuspects(LoadedHeap heap, int limit) { + return Map.of(); + } + + @Override + public void close() { + } + } +} diff --git a/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/OqlGrammarTest.java b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/OqlGrammarTest.java new file mode 100644 index 0000000..5722624 --- /dev/null +++ b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/heap/OqlGrammarTest.java @@ -0,0 +1,31 @@ +package cchesser.javaperf.mcp.heap; + +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class OqlGrammarTest { + @Test + void describesTheReadOnlyCalciteHeapQueryContract() { + Map grammar = OqlGrammar.describe(); + + assertThat(grammar) + .containsEntry("readOnly", true) + .containsEntry("statementContract", "Exactly one SELECT statement, without a trailing semicolon"); + @SuppressWarnings("unchecked") + Map syntax = (Map) grammar.get("grammar"); + assertThat(syntax).containsKeys("select", "tablePrimary"); + assertThat(syntax.get("select")).isInstanceOf(String.class); + assertThat(syntax.get("tablePrimary")).isInstanceOf(String.class); + assertThat((List) grammar.get("examples")) + .anyMatch(example -> example.toString().contains("LATERAL TABLE(getOutboundReferences")); + @SuppressWarnings("unchecked") + Map references = (Map) grammar.get("references"); + assertThat(references) + .containsEntry("calciteSqlReference", "https://calcite.apache.org/docs/reference.html") + .containsEntry("matCalcitePlugin", "https://github.com/vlsi/mat-calcite-plugin"); + } +} diff --git a/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/mcp/McpServerEngineTest.java b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/mcp/McpServerEngineTest.java new file mode 100644 index 0000000..254f714 --- /dev/null +++ b/java-heap-mcp/src/test/java/cchesser/javaperf/mcp/mcp/McpServerEngineTest.java @@ -0,0 +1,112 @@ +package cchesser.javaperf.mcp.mcp; + +import cchesser.javaperf.mcp.cache.CacheMetadataStore; +import cchesser.javaperf.mcp.config.ServerConfig; +import cchesser.javaperf.mcp.heap.HeapAnalysisService; +import cchesser.javaperf.mcp.heap.HeapDumpManager; +import cchesser.javaperf.mcp.heap.HeapOverview; +import cchesser.javaperf.mcp.heap.LoadedHeap; +import cchesser.javaperf.mcp.heap.ObjectInspection; +import cchesser.javaperf.mcp.heap.OqlQueryResult; +import cchesser.javaperf.mcp.heap.GcRootPath; +import cchesser.javaperf.mcp.heap.HistogramEntry; +import cchesser.javaperf.mcp.heap.DominatorEntry; +import cchesser.javaperf.mcp.util.JsonSupport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class McpServerEngineTest { + @TempDir + Path tempDir; + + @Test + void registersHeapToolsWithTheSdkAdapter() throws Exception { + JsonSupport jsonSupport = JsonSupport.create(); + ServerConfig config = new ServerConfig(tempDir.resolve("cache"), 10, 50, Duration.ofSeconds(5), 5, false, 7777, 0L); + CacheMetadataStore metadataStore = new CacheMetadataStore(config.cacheRoot(), jsonSupport.mapper()); + HeapDumpManager manager = new HeapDumpManager(config, metadataStore, new FakeHeapAnalysisService()); + ToolRegistry registry = new ToolRegistry(manager, jsonSupport.mapper(), config); + + assertThat(registry.specifications()) + .extracting(specification -> specification.tool().name()) + .contains("heap_load_dump", "heap_open_project", "heap_list_projects", + "heap_run_oql", "heap_get_oql_grammar", "heap_find_leak_suspects"); + } + + private static final class FakeHeapAnalysisService implements HeapAnalysisService { + @Override + public LoadedHeap open(Path heapDumpPath) { + try { + Files.createDirectories(heapDumpPath.getParent()); + } catch (Exception ignored) { + } + return new LoadedHeap() { + @Override + public Path heapDumpPath() { + return heapDumpPath; + } + + @Override + public Map snapshotSummary() { + return Map.of("path", heapDumpPath.toString(), "numberOfObjects", 3); + } + + @Override + public Object nativeSnapshot() { + return Map.of(); + } + + @Override + public void dispose() { + } + }; + } + + @Override + public HeapOverview overview(LoadedHeap heap, int limit) { + return new HeapOverview(heap.snapshotSummary(), List.of(), List.of()); + } + + @Override + public OqlQueryResult runOql(LoadedHeap heap, String query, int limit, int offset) { + return new OqlQueryResult(query, List.of("value"), List.of(Map.of("value", 1)), offset, limit, false, 1); + } + + @Override + public List histogram(LoadedHeap heap, String sortBy, int limit) { + return List.of(); + } + + @Override + public List dominators(LoadedHeap heap, Integer rootObjectId, int limit) { + return List.of(); + } + + @Override + public ObjectInspection inspectObject(LoadedHeap heap, int objectId, int limit) { + return new ObjectInspection(objectId, 0L, "Object", "Object", 1L, 1L, null, List.of(), List.of(), List.of(), List.of()); + } + + @Override + public List findPathsToGcRoots(LoadedHeap heap, int objectId, boolean excludeWeakRefs, int limit) { + return List.of(); + } + + @Override + public Object leakSuspects(LoadedHeap heap, int limit) { + return Map.of(); + } + + @Override + public void close() { + } + } +} diff --git a/java-heap-workbench/.gitignore b/java-heap-workbench/.gitignore new file mode 100644 index 0000000..3c07338 --- /dev/null +++ b/java-heap-workbench/.gitignore @@ -0,0 +1,4 @@ +dist/ +java-heap-mcp/.m2 +java-heap-mcp/vendor +java-heap-mcp/*.hprof \ No newline at end of file diff --git a/java-heap-workbench/README.md b/java-heap-workbench/README.md new file mode 100644 index 0000000..96fedff --- /dev/null +++ b/java-heap-workbench/README.md @@ -0,0 +1,101 @@ +# java-heap-workbench + +`java-heap-workbench` is a browser workspace for asking an agent questions about Java heap dumps. Its focused split-pane layout keeps the Agent chat on the left and A2UI-rendered visual analysis on the right. It supports Ollama locally and OpenRouter through its OpenAI-compatible chat-completions API, with the existing `java-heap-mcp` HTTP API providing heap tools. + +## Build and run + +Requirements: Node.js 20+ and a running `java-heap-mcp` server. + +```bash +cd java-heap-workbench +npm run build +npm run dev +``` + +Open . The app is intentionally dependency-light: `npm install` is not required. `npm run build` copies the browser application to `dist/`; `npm run dev` serves that build. + +Start the MCP server from the sibling project: + +```bash +cd ../java-heap-mcp +JAVA_HEAP_MCP_WEB_UI_ENABLED=true ./scripts/run-server.sh +``` + +Use the MCP server's existing web UI at to load a `.hprof` file into a named project. Return to the workbench and select that project. + +## Connect Ollama or OpenRouter + +Install Ollama, start it, and pull a tool-capable chat model: + +```bash +ollama serve +ollama pull nemotron-3-nano:4b +``` + +If the browser blocks requests, allow the workbench origin when starting Ollama: + +```bash +OLLAMA_ORIGINS=http://127.0.0.1:4173 ollama serve +``` + +Open **Connections** in the workbench and choose a provider. Ollama uses `http://127.0.0.1:11434` and a locally pulled model. OpenRouter uses `https://openrouter.ai/api/v1`, requires an API key, and accepts free coding models such as: + +- `cohere/north-mini-code:free` +- `nvidia/nemotron-3.5-lightning:free` +- `qwen/qwen3-coder:free` +- `openrouter/free` (automatic free-model routing) + +The workbench includes these model IDs in the OpenRouter model picker. OpenRouter free-model availability can change; confirm the current list at [OpenRouter's free models](https://openrouter.ai/models?variant=free). The API key is stored in browser local storage for this local-only UI, so do not use this setup for a shared or untrusted browser profile. + +## How the integration works + +- `src/ag-ui.js` emits `RUN_STARTED`, text, tool-call, state, finish, and error events. This is the seam for replacing the local loop with an AG-UI transport/server. +- `src/main.js` gives the selected Ollama or OpenRouter model the MCP analysis tools. Tool calls are routed to `/api/overview`, `/api/histogram`, `/api/dominators`, `/api/leaks`, `/api/oql`, `/api/inspect`, and `/api/gc-roots`, then returned to the model for follow-up reasoning. +- `src/agent-prompt.js` supplies the agent with the tool contract and Calcite investigation rules. Attribute questions must be grounded by selecting an object with OQL and inspecting its returned object id; the agent must not claim success without tool evidence. +- `src/a2ui.js` renders the resulting declarative components: `summary`, `chart` (bar, line, or pie), `table`, and `markdown`. The renderer also converts legacy markdown tables into real table components. It uses safe DOM strings and SVG charts, so no chart CDN is needed. +- The agent prompt requests JSON visual responses with a `components` array. If a model still returns a markdown table, the workbench parses it as a fallback; numeric tool results are visualized immediately while the model is preparing its final response. + +## Test an interaction + +1. Load `my_little_heap_dump.hprof` (or another dump) in the MCP web UI. +2. Select the active project in the workbench. +3. Click **Largest retained classes**, or ask “Show me the top 10 classes by retained heap and visualize them as a bar chart.” +4. Watch the run details for AG-UI events and the visual report for A2UI cards/table/chart output. +5. Try an OQL request, for example: `Find String objects where the count is greater than 10.` The agent emits `SELECT * FROM java.lang.String s WHERE s.count > 10`; result limits are sent separately to the MCP tool. + +The browser calls only local services. No heap data or model prompts leave the machine unless you configure URLs that point elsewhere. + +OQL is the workbench name for the embedded [Apache Calcite SQL](https://calcite.apache.org/docs/reference.html) heap-query language. Only read-only `SELECT` statements are supported. Formulate every OQL query as a Calcite `SELECT`; use SQL joins, grouping, aggregates, ordering, pagination, and lateral table functions. The server may retain MAT compatibility internally, but the agent should not generate MAT OQL syntax. + +### Advanced Calcite OQL patterns + +The agent can use these Calcite SQL techniques for deeper investigations: + +- Each Java class is a Calcite table of direct instances; use the `instanceof` schema/table for subclasses. The special `this` column identifies the heap object, and Java fields are SQL columns. +- Use aliases and SQL expressions such as `COUNT`, `SUM`, `GROUP BY`, `HAVING`, `ORDER BY`, `JOIN`, `LATERAL TABLE(...)`, `UNNEST`, and `LIMIT/OFFSET`. +- Use `this['fieldName']` for dynamic fields and Calcite heap functions such as `toString`, `retainedSize`, `shallowSize`, `getField`, `getValues`, and `getMapEntries`. +- Heap functions use SQL function syntax, for example `toString(s.this)`; do not use Java-like alias method syntax such as `s.toString(s.this)`. +- To find the most common String values, use `SELECT toString(s.this) AS unique_value, COUNT(*) AS count FROM "java.lang.String" s GROUP BY toString(s.this) ORDER BY COUNT(*) DESC`. + +Examples: + +```sql +SELECT DISTINCT OBJECTS classof(s) +FROM "java\\.lang\\.S.*" s +``` + +```sql +SELECT s AS String, s.value AS characters, inbounds(s).@length AS inbound_count +FROM java.lang.String s +WHERE s.@retainedHeapSize > 1048576 +``` + +```sql +SELECT * +FROM OBJECTS ( + SELECT s, s.value AS value + FROM java.lang.String s +) v +``` + +Native `JOIN`, `GROUP BY`, `COUNT`, `SUM`, `ORDER BY`, and `LIMIT/OFFSET` are supported by the embedded [MAT Calcite Plugin](https://github.com/vlsi/mat-calcite-plugin) through the same `heap_run_oql` endpoint. The service still applies its tool-level result limit and offset after query execution. diff --git a/java-heap-workbench/build.mjs b/java-heap-workbench/build.mjs new file mode 100644 index 0000000..5a34605 --- /dev/null +++ b/java-heap-workbench/build.mjs @@ -0,0 +1,26 @@ +import { cp, mkdir, rm } from 'node:fs/promises'; +import { createServer } from 'node:http'; +import { extname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = fileURLToPath(new URL('.', import.meta.url)); +const dist = join(root, 'dist'); +const contentTypes = { '.html': 'text/html; charset=utf-8', '.css': 'text/css; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.json': 'application/json; charset=utf-8', '.svg': 'image/svg+xml' }; +await rm(dist, { recursive: true, force: true }); +await mkdir(dist, { recursive: true }); +await cp(join(root, 'index.html'), join(dist, 'index.html')); +await cp(join(root, 'src'), join(dist, 'src'), { recursive: true }); +console.log(`Built java-heap-workbench → ${dist}`); + +if (process.argv.includes('--serve')) { + const port = Number(process.env.PORT || 4173); + createServer(async (req, res) => { + const path = req.url === '/' ? '/index.html' : req.url; + const file = join(dist, path.replace(/^\//, '').split('?')[0]); + try { + const body = await (await import('node:fs/promises')).readFile(file); + res.writeHead(200, { 'Content-Type': contentTypes[extname(file)] || 'application/octet-stream' }); + res.end(body); + } catch { res.writeHead(404); res.end('Not found'); } + }).listen(port, () => console.log(`Workbench at http://127.0.0.1:${port}`)); +} diff --git a/java-heap-workbench/docs/architecture.md b/java-heap-workbench/docs/architecture.md new file mode 100644 index 0000000..2d8104d --- /dev/null +++ b/java-heap-workbench/docs/architecture.md @@ -0,0 +1,90 @@ +# `java-heap-workbench` open-source dependencies + +`java-heap-workbench` is a static browser application. Its [`package.json`](../package.json) has no runtime or development package dependencies, so there is no npm dependency tree to maintain. + +## Browser and service boundaries + +```mermaid +flowchart LR + User["Heap analyst"] --> UI["Browser UI\nindex.html + styles.css"] + UI --> Main["src/main.js\nworkspace state + orchestration"] + Main --> MCP["java-heap-mcp\nHTTP API :7777"] + MCP --> Heap["Eclipse MAT +\nApache Calcite analysis"] + Heap --> Dump[("heap dump\n+ MAT indexes")] + + Main --> Provider{Model provider} + Provider --> Ollama["Ollama\nlocal /api/chat"] + Provider --> OpenRouter["OpenRouter\n/chat/completions"] + Main --> Agent["src/agent-prompt.js\ntool definitions + agent rules"] + Agent --> Provider + Provider -->|tool calls| Main + Main -->|callTool + handle| MCP + + Main --> Events["src/ag-ui.js\nAG-UI-compatible run events"] + Main --> OQL["src/oql.js\nread-only Calcite SELECT guard"] + Main --> A2UI["src/a2ui.js\nresponse parsing + rendering"] + A2UI --> Visuals["summary cards, charts, tables,\nreference graphs, markdown"] + Visuals --> UI + + Build["build.mjs"] --> Dist["dist/"] + UI -. source files .-> Build + Dist -. served locally on :4173 .-> UI + + classDef app fill:#1f6feb,color:#fff,stroke:#58a6ff; + classDef service fill:#238636,color:#fff,stroke:#3fb950; + classDef model fill:#9e6a03,color:#fff,stroke:#d29922; + classDef data fill:#6e40c9,color:#fff,stroke:#bc8cff; + class UI,Main,Agent,Events,OQL,A2UI,Build,Dist app; + class MCP,Heap service; + class Provider,Ollama,OpenRouter model; + class Dump,Visuals data; +``` + +## Analysis run flow + +```mermaid +sequenceDiagram + actor User + participant UI as main.js + participant Model as Ollama or OpenRouter + participant MCP as java-heap-mcp HTTP API + participant Render as a2ui.js + + User->>UI: Ask about selected project + UI->>MCP: GET /api/projects + UI->>MCP: POST /api/open-project (when needed) + UI->>Model: chat request with tool definitions + Model-->>UI: tool call (overview, histogram, OQL, ...) + UI->>UI: validate OQL when tool is heap_run_oql + UI->>MCP: POST /api/{operation} with active handle + MCP-->>UI: JSON analysis result + UI->>Model: append tool result and continue run + Model-->>UI: JSON message with components + UI->>Render: parse, hydrate, and render A2UI components + Render-->>User: cards, charts, tables, or object graph +``` + +## Project dependencies and integrations + +| Dependency or platform API | Why it is used | Value to the project | +| --- | --- | --- | +| [Node.js](https://nodejs.org/) built-in `fs/promises`, `http`, `path`, and `url` modules | Runs [`build.mjs`](../build.mjs), copies source files into `dist/`, and serves the app during local development. | Keeps the build and development server small, dependency-free, and easy to run. | +| Browser Fetch API | Calls the `java-heap-mcp` HTTP endpoints and the configured model endpoint. | Provides the network layer for project selection, heap analysis, and agent requests without a frontend framework. | +| Browser Web Storage API (`localStorage`) | Stores provider, model, endpoint, and connection settings. | Preserves local workbench configuration between browser sessions. | +| Browser DOM, SVG, Canvas, and `crypto.randomUUID()` APIs | Builds the interface, renders charts/reference graphs, and identifies AG-UI-compatible runs. | Provides the UI, visual analysis output, and event tracking without a UI framework or chart library. | +| [`java-heap-mcp`](../../java-heap-mcp/) HTTP API | Supplies project handles, heap loading state, overviews, histograms, dominators, OQL, object inspection, GC-root paths, and leak suspects. | Keeps heap parsing and analysis in the Java service while the workbench remains a lightweight client. | +| [Ollama](https://ollama.com/) integration | Optionally sends chat/tool requests to a locally hosted model through `/api/chat`. | Supports private, local agent-assisted heap investigations. | +| [OpenRouter](https://openrouter.ai/) integration | Optionally sends OpenAI-compatible chat/tool requests to `/chat/completions`. | Allows the same workbench flow to use hosted models selected by the user. | + +## Internal modules + +The workbench’s reusable behavior is implemented in its own small ES modules rather than imported packages: + +| Module | Why it is used | Value to the project | +| --- | --- | --- | +| [`src/main.js`](../src/main.js) | Coordinates UI state, model calls, MCP calls, and analysis runs. | Connects the user workflow end to end. | +| [`src/oql.js`](../src/oql.js) | Performs a lightweight read-only Calcite `SELECT` validation before requests leave the browser. | Prevents common invalid or mutating query requests. | +| [`src/ag-ui.js`](../src/ag-ui.js) | Emits AG-UI-compatible run lifecycle and tool events. | Gives the UI a transport-neutral progress/event model. | +| [`src/a2ui.js`](../src/a2ui.js) | Parses model responses and renders summaries, charts, tables, and graphs. | Turns tool results into visual reports without a component framework. | + +Ollama and OpenRouter are service integrations rather than npm dependencies; the workbench only uses their HTTP APIs. MAT, Calcite, and the Java dependency set belong to `java-heap-mcp`, not to the browser bundle. diff --git a/java-heap-workbench/index.html b/java-heap-workbench/index.html new file mode 100644 index 0000000..7e198b4 --- /dev/null +++ b/java-heap-workbench/index.html @@ -0,0 +1,14 @@ + + + + + + + Java Heap Workbench + + + +
+ + + diff --git a/java-heap-workbench/package-lock.json b/java-heap-workbench/package-lock.json new file mode 100644 index 0000000..82d72af --- /dev/null +++ b/java-heap-workbench/package-lock.json @@ -0,0 +1,12 @@ +{ + "name": "java-heap-workbench", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "java-heap-workbench", + "version": "0.1.0" + } + } +} diff --git a/java-heap-workbench/package.json b/java-heap-workbench/package.json new file mode 100644 index 0000000..cf8c941 --- /dev/null +++ b/java-heap-workbench/package.json @@ -0,0 +1,11 @@ +{ + "name": "java-heap-workbench", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "build": "node build.mjs", + "dev": "node build.mjs --serve", + "test": "node --test test/*.test.mjs" + } +} diff --git a/java-heap-workbench/src/a2ui.js b/java-heap-workbench/src/a2ui.js new file mode 100644 index 0000000..a465efa --- /dev/null +++ b/java-heap-workbench/src/a2ui.js @@ -0,0 +1,197 @@ +// A2UI is represented as declarative components. Agents return {components: []} +// and this renderer turns those components into safe DOM, charts included. +const esc = value => String(value ?? '').replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])); +const number = value => Number(value || 0).toLocaleString(); +let graphMarkerSequence = 0; +const displayValue = value => { + if (value === null || value === undefined) return ''; + if (typeof value === 'object') { + try { return JSON.stringify(value); } catch { return String(value); } + } + return String(value); +}; +const uniqueComponents = components => { + const seen = new Set(); + return (components || []).filter(component => { + const key = JSON.stringify(component); + if (seen.has(key)) return false; + seen.add(key); + return true; + }); +}; + +export function renderMarkdown(value) { + const lines = String(value ?? '').split('\n'); + let html = '', list = null; + const inline = renderInlineMarkdown; + const closeList = () => { if (list) { html += ``; list = null; } }; + for (const rawLine of lines) { + const line = inline(rawLine.trim()); + const heading = line.match(/^(#{1,6})\s+(.+)$/); + const ordered = line.match(/^\d+[.)]\s+(.+)$/); + const unordered = line.match(/^[-*+]\s+(.+)$/); + if (!line) { closeList(); html += '
'; continue; } + if (heading) { closeList(); const level = heading[1].length; html += `${heading[2]}`; continue; } + if (ordered || unordered) { const nextList = ordered ? 'ol' : 'ul'; if (list !== nextList) { closeList(); list = nextList; html += `<${list}>`; } html += `
  • ${(ordered || unordered)[1]}
  • `; continue; } + closeList(); html += `

    ${line}

    `; + } + closeList(); + return html; +} + +export function renderInlineMarkdown(value) { + const source = String(value ?? '').replace(/\\([\\`*_])/g, '$1'); + const escaped = esc(source); + return escaped.replace(/`([^`]+)`/g, '$1') + .replace(/\*\*([^*]+)\*\*/g, '$1') + .replace(/__([^_]+)__/g, '$1') + .replace(/\*([^*]+)\*/g, '$1') + .replace(/_([^_]+)_/g, '$1'); +} + +export function normalizeAgentResponse(payload) { + if (payload?.components) return { ...payload, components: uniqueComponents(payload.components) }; + return { components: [{ type: 'summary', title: 'Agent response', value: payload?.text || 'No visual response returned.', tone: 'neutral' }] }; +} + +const suggestedActions = [ + { label: 'Overall Memory Usage', prompt: 'Get a general overview of heap sizes and object counts.' }, + { label: 'Top Memory Consumers', prompt: 'Identify the top memory-consuming classes by retained size, shallow size, and object count.' }, + { label: 'Dominant Objects', prompt: 'Find the dominant objects or object types retaining the most heap memory.' }, + { label: 'Leak Detection', prompt: 'Run leak suspect analysis and summarize the evidence.' }, + { label: 'Deep Inspection', prompt: 'Perform a deep heap inspection using OQL and inspect relevant objects and paths to GC roots.' } +]; + +export function extractSuggestedActions(text, supplied = []) { + const source = String(text || ''); + const actions = supplied.length ? supplied : suggestedActions.filter(action => new RegExp(action.label.replace(/\s+/g, '\\s+'), 'i').test(source)); + return actions.map(action => ({ label: action.label, prompt: action.prompt || action.action || action.query })).filter(action => action.label && action.prompt); +} + +export function parseAgentContent(content) { + const source = String(content || '').trim(); + const fenced = source.match(/```(?:json)?\s*([\s\S]*?)```/i); + const objectStart = source.indexOf('{'); + const objectEnd = source.lastIndexOf('}'); + const candidate = fenced ? fenced[1].trim() : objectStart >= 0 && objectEnd > objectStart ? source.slice(objectStart, objectEnd + 1) : ''; + if (candidate.startsWith('{')) { + try { + const payload = JSON.parse(candidate); + if (payload && typeof payload === 'object' && ('components' in payload || 'message' in payload || 'text' in payload)) { + const text = payload.message || payload.text || ''; + return { view: { ...payload, components: Array.isArray(payload.components) ? payload.components : [] }, text, actions: extractSuggestedActions(text, payload.actions || []) }; + } + } catch { /* Fall through to markdown/plain text rendering. */ } + } + if (fenced || candidate) return { view: { components: [] }, text: 'Analysis complete.', actions: [] }; + const lines = source.split('\n').map(line => line.trim()).filter(Boolean); + const tableLines = lines.filter(line => line.startsWith('|') && line.endsWith('|')); + if (tableLines.length >= 3) { + const cells = line => line.slice(1, -1).split('|').map(value => value.trim()); + const columns = cells(tableLines[0]); + const rows = tableLines.slice(2).map(line => cells(line)).filter(row => row.length === columns.length).map(row => Object.fromEntries(columns.map((column, index) => [column, row[index]]))); + if (rows.length) return { view: { components: [{ type: 'table', title: 'Agent results', columns, rows }] }, text: lines.filter(line => !tableLines.includes(line)).join('\n') }; + } + return { view: { components: [{ type: 'markdown', text: source || 'Analysis complete.' }] }, text: source, actions: extractSuggestedActions(source) }; +} + +export function renderA2UI(target, payload) { + if (target.dataset.busy === 'true') return; + const view = normalizeAgentResponse(payload); + target.innerHTML = (view.components || []).map(component => renderComponent(component)).join(''); + target.querySelectorAll('[data-chart]').forEach(node => drawChart(node, JSON.parse(node.dataset.chart))); + target.querySelectorAll('[data-graph]').forEach(node => drawGraph(node, JSON.parse(node.dataset.graph))); +} + +export function hydrateVisualData(view, fallback) { + const primary = normalizeAgentResponse(view); + const backup = normalizeAgentResponse(fallback); + const fallbackTable = backup.components.find(component => component.type === 'table' && rowsFor(component).length); + const fallbackChart = backup.components.find(component => component.type === 'chart' && chartDataFor(component).length); + const fallbackGraph = backup.components.find(component => component.type === 'graph' && component.nodes?.length); + const components = primary.components.map(component => { + if (component.type === 'table' && fallbackTable) { + const rows = rowsFor(component); + const columnsMatchRows = component.columns?.length && rows.some(row => component.columns.some(column => Object.prototype.hasOwnProperty.call(row, column))); + if (!rows.length || !columnsMatchRows) return { ...component, columns: fallbackTable.columns, rows: rowsFor(fallbackTable) }; + } + if (component.type === 'chart' && !chartDataFor(component).length && fallbackChart) { + return { ...component, data: chartDataFor(fallbackChart) }; + } + if (component.type === 'graph' && !component.nodes?.length && fallbackGraph) return fallbackGraph; + return component; + }); + if (fallbackGraph && !components.some(component => component.type === 'graph')) components.push(fallbackGraph); + return { ...primary, components: components.length ? components : backup.components }; +} + +const rowsFor = component => { + const rows = component?.rows ?? component?.data ?? component?.entries ?? component?.results ?? []; + return Array.isArray(rows) ? rows : Array.isArray(rows.rows) ? rows.rows : []; +}; +const chartDataFor = component => { + const data = component?.data ?? component?.points ?? component?.values ?? component?.rows ?? []; + return Array.isArray(data) ? data : Array.isArray(data.rows) ? data.rows : []; +}; + +function renderComponent(c) { + if (c.type === 'summary') return `
    ${esc(c.title)}${esc(c.value)}${esc(c.detail || '')}
    `; + if (c.type === 'markdown') return `
    ${renderMarkdown(c.text)}
    `; + if (c.type === 'table') { + const rows = rowsFor(c); + const cols = c.columns || Object.keys(rows[0] || {}); + const renderedRows = rows.map(row => { + const objectId = row?.objectId; + const actionable = objectId !== undefined && objectId !== null && objectId !== ''; + const attributes = actionable ? ` data-object-id="${esc(objectId)}" data-class-name="${esc(row.className || row.displayName || '')}" tabindex="0" role="button"` : ''; + return `${cols.map(x => `${renderInlineMarkdown(displayValue(row[x]))}`).join('')}`; + }).join(''); + return `

    ${esc(c.title || 'Results')}

    ${number(rows.length)} rows
    ${cols.map(x => ``).join('')}${renderedRows}
    ${esc(x)}
    `; + } + if (c.type === 'chart') return `

    ${esc(c.title || 'Chart')}

    ${esc(c.subtitle || '')}
    `; + if (c.type === 'graph') return `

    ${esc(c.title || 'Object references')}

    ${number((c.nodes || []).length)} objects
    `; + return ''; +} + +function drawChart(node, chart) { + const points = chartDataFor(chart).map(x => ({ label: x.label ?? x.name ?? x.className ?? x.displayName ?? '', value: Number(x.value ?? x.retainedHeapBytes ?? x.retainedBytes ?? x.retainedHeap ?? x.shallowHeapBytes ?? x.count ?? x.objectCount ?? 0) })).slice(0, 12); + if (!points.length) { node.innerHTML = '
    No chart data
    '; return; } + const max = Math.max(...points.map(x => x.value), 1), width = 720, height = 230, pad = 38; + if (chart.chartType === 'pie') { + const total = points.reduce((a, x) => a + Math.max(0, x.value), 0); + if (!total) { node.innerHTML = '
    No positive chart values
    '; return; } + let angle = -Math.PI / 2; + const colors = ['#58a6ff', '#3fb950', '#d29922', '#f85149', '#bc8cff', '#39c5cf']; + const paths = points.map((p, i) => { const value = Math.max(0, p.value); const next = angle + value / total * Math.PI * 2; const large = next - angle > Math.PI ? 1 : 0; const arc = `${Math.cos(angle) * 72 + 120},${Math.sin(angle) * 72 + 120} ${Math.cos(next) * 72 + 120},${Math.sin(next) * 72 + 120}`; const d = `M120,120 L${Math.cos(angle) * 72 + 120},${Math.sin(angle) * 72 + 120} A72,72 0 ${large} 1 ${arc.split(' ')[1]} Z`; angle = next; return `${esc(p.label)} · ${Math.round(value / total * 100)}%`; }).join(''); + node.innerHTML = `${paths}`; return; + } + if (chart.chartType === 'line') { + const pointsPath = points.map((p, i) => `${pad + i * ((width - pad * 2) / Math.max(points.length - 1, 1))},${height - pad - p.value / max * (height - pad * 2)}`).join(' '); + const dots = points.map((p, i) => { const x = pad + i * ((width - pad * 2) / Math.max(points.length - 1, 1)), y = height - pad - p.value / max * (height - pad * 2); return `${esc(p.label)}: ${number(p.value)}${esc(p.label).slice(0, 12)}`; }).join(''); + node.innerHTML = `${dots}`; return; + } + const rowHeight = 28, chartHeight = Math.max(230, points.length * rowHeight + 18), labelWidth = 210, plotWidth = width - labelWidth - 28; + const bars = points.map((p, i) => { const y = 9 + i * rowHeight, barW = p.value / max * plotWidth, label = String(p.label).length > 28 ? `${String(p.label).slice(0, 27)}…` : p.label; return `${esc(label)}${esc(p.label)}: ${number(p.value)}${number(p.value)}`; }).join(''); + node.innerHTML = `${bars}`; +} + +function drawGraph(node, graph) { + const sourceNodes = Array.isArray(graph.nodes) ? graph.nodes : []; + const sourceEdges = Array.isArray(graph.edges) ? graph.edges : []; + if (!sourceNodes.length) { node.innerHTML = '
    No object references
    '; return; } + const nodes = sourceNodes.slice(0, 30).map((item, index) => ({ id: String(item.id ?? item.objectId ?? index), label: item.label ?? item.className ?? item.displayName ?? item.id ?? 'object', objectId: item.objectId ?? (Number.isFinite(Number(item.id)) ? item.id : null), level: item.level })); + const nodeIds = new Set(nodes.map(item => item.id)); + const edges = sourceEdges.filter(edge => nodeIds.has(String(edge.source)) && nodeIds.has(String(edge.target))).slice(0, 60).map(edge => ({ source: String(edge.source), target: String(edge.target), label: edge.label || '' })); + const root = nodes.find(item => item.level === 0) || nodes[0]; + const levels = new Map([[root.id, 0]]); + for (let pass = 0; pass < nodes.length; pass += 1) edges.forEach(edge => { if (levels.has(edge.source) && !levels.has(edge.target)) levels.set(edge.target, Math.min(3, levels.get(edge.source) + 1)); }); + nodes.forEach(item => { if (!levels.has(item.id)) levels.set(item.id, Math.min(3, item.level ?? 1)); }); + const grouped = new Map(); nodes.forEach(item => { const level = levels.get(item.id); if (!grouped.has(level)) grouped.set(level, []); grouped.get(level).push(item); }); + const width = 900, columnWidth = 210, nodeWidth = 170, nodeHeight = 42, rowGap = 18; + const height = Math.max(190, ...Array.from(grouped.values(), group => group.length * (nodeHeight + rowGap) + 30)); + const positions = new Map(); grouped.forEach((group, level) => { const total = group.length * (nodeHeight + rowGap) - rowGap; const start = Math.max(15, (height - total) / 2); group.forEach((item, index) => positions.set(item.id, { x: 18 + level * columnWidth, y: start + index * (nodeHeight + rowGap) })); }); + const markerId = `graph-arrow-${++graphMarkerSequence}`; + const lines = edges.map(edge => { const from = positions.get(edge.source), to = positions.get(edge.target); if (!from || !to) return ''; const x1 = from.x + nodeWidth, y1 = from.y + nodeHeight / 2, x2 = to.x, y2 = to.y + nodeHeight / 2; return `${esc(edge.label)}`; }).join(''); + const boxes = nodes.map(item => { const position = positions.get(item.id), label = String(item.label).length > 24 ? `${String(item.label).slice(0, 23)}…` : item.label; const action = item.objectId !== null && item.objectId !== undefined ? ` data-object-id="${esc(item.objectId)}" data-class-name="${esc(item.label)}" tabindex="0" role="button"` : ''; return `${esc(label)}#${esc(item.objectId ?? item.id)}`; }).join(''); + node.innerHTML = `${lines}${boxes}`; +} diff --git a/java-heap-workbench/src/ag-ui.js b/java-heap-workbench/src/ag-ui.js new file mode 100644 index 0000000..dd70967 --- /dev/null +++ b/java-heap-workbench/src/ag-ui.js @@ -0,0 +1,15 @@ +// Small AG-UI-compatible event bus. The UI can later swap this for an AG-UI +// transport without changing its A2UI rendering or MCP orchestration layers. +export const AG_EVENTS = Object.freeze({ RUN_STARTED: 'RUN_STARTED', TEXT_MESSAGE_CONTENT: 'TEXT_MESSAGE_CONTENT', TOOL_CALL_START: 'TOOL_CALL_START', TOOL_CALL_END: 'TOOL_CALL_END', STATE_SNAPSHOT: 'STATE_SNAPSHOT', RUN_FINISHED: 'RUN_FINISHED', RUN_ERROR: 'RUN_ERROR' }); + +export class AgUiRun { + constructor(onEvent) { this.onEvent = onEvent; this.id = crypto.randomUUID(); } + emit(type, data = {}) { this.onEvent({ type, runId: this.id, timestamp: Date.now(), ...data }); } + start(input) { this.emit(AG_EVENTS.RUN_STARTED, { input }); } + text(content) { this.emit(AG_EVENTS.TEXT_MESSAGE_CONTENT, { content }); } + toolStart(name, args) { this.emit(AG_EVENTS.TOOL_CALL_START, { name, args }); } + toolEnd(name, result) { this.emit(AG_EVENTS.TOOL_CALL_END, { name, result }); } + state(snapshot) { this.emit(AG_EVENTS.STATE_SNAPSHOT, { snapshot }); } + finish() { this.emit(AG_EVENTS.RUN_FINISHED); } + error(message) { this.emit(AG_EVENTS.RUN_ERROR, { message }); } +} diff --git a/java-heap-workbench/src/agent-prompt.js b/java-heap-workbench/src/agent-prompt.js new file mode 100644 index 0000000..f2b46e6 --- /dev/null +++ b/java-heap-workbench/src/agent-prompt.js @@ -0,0 +1,28 @@ +import { OQL_AGENT_RULES } from './oql.js'; + +export const AGENT_SYSTEM_PROMPT = `You are Agent, a precise Java heap analyst working against the currently selected heap handle. + +Available MCP tools: +- heap_get_overview: returns snapshot metadata plus topClasses and topDominators. +- heap_get_histogram: returns class rows with className, objectCount, shallowHeapBytes, and retainedHeapBytes. Use sort=retained, shallow, or count. +- heap_get_dominators: returns object rows with objectId, className, displayName, shallowHeapBytes, and retainedHeapBytes. +- heap_find_leak_suspects: returns MAT leak-suspect evidence when available. +- heap_run_oql: executes only a read-only Apache Calcite SQL SELECT statement against the heap with a separate result limit and offset; the handle is supplied automatically. OQL must use Calcite SQL syntax. +- heap_get_oql_grammar: returns the authoritative Calcite SQL grammar, heap schema, functions, and examples for heap_run_oql; it does not require a heap handle. +- heap_inspect_object: accepts objectId and returns fields, inbound/outbound references, sizes, class, and GC-root information. +- heap_find_path_to_gc_roots: accepts objectId and returns reference paths to GC roots. + +Investigation rules: +1. Use the tools. Do not claim that a query or analysis succeeded unless a tool returned a result. +2. Before constructing or calling heap_run_oql, always call heap_get_oql_grammar and follow its returned schema, function signatures, quoting rules, and examples. Do not rely only on this prompt's examples. +3. For questions about a class's attributes, first use Calcite OQL to select representative objects, then inspect an object when field values or references are needed. Use SELECT s.this FROM fully.qualified.ClassName s and the exact fully qualified class name supplied by the user. +4. For unique or common String values, use the Calcite function form toString(s.this), never the Java-like method form s.toString(s.this). When asked for commonly used or most common String values, use this example query: SELECT toString(s.this) AS val, count(*) AS cnt FROM "java.lang.String" s GROUP BY toString(s.this) ORDER BY COUNT(*) DESC. For unique values, use SELECT DISTINCT toString(s.this) AS unique_value. If a field is unknown, inspect representative objects or use this['fieldName'] before inventing a field name. +5. For a directed object-reference graph of the largest dominator, first call heap_get_dominators, choose the returned row with the largest retained heap and its objectId, then call heap_inspect_object for that objectId. Build graph nodes only from the inspected root and its returned outboundReferences, and build directed edges from each actual reference objectId. Do not call heap_find_path_to_gc_roots as a substitute for outboundReferences unless the user explicitly asks for a GC-root path; GC-root paths are not object-reference graphs. +6. Use heap_get_overview, heap_get_histogram, and heap_get_dominators for broad retention questions before using OQL. Use inspect/path tools when a specific object is identified. +7. If a tool returns an error or empty result, explain that limitation and try a grounded alternative. Never fabricate field names, values, or successful execution. +8. If heap_run_oql fails, do not stop. Re-evaluate it against the grammar returned by heap_get_oql_grammar and retry up to three times with simpler Calcite SQL semantics: reduce the selected columns, remove optional clauses or functions, verify table/field names and aliases, and preserve only the filtering, grouping, or ordering needed for the question. Do not repeat the same failed query. The workbench displays retry status updates while you reconsider the query. +9. If all OQL attempts fail, stop trying to guess. Return a simple follow-up question stating that you are having issues correctly determining the data and need more information, such as the target class, field, relationship, or desired filter. + +${OQL_AGENT_RULES} + +After tools finish, return ONLY valid JSON: {"message":"brief evidence-based finding","components":[...]}. Use these exact A2UI shapes: a bar or pie chart is {"type":"chart","chartType":"bar|pie","title":"...","data":[{"label":"...","value":123}]}; a directed object graph is {"type":"graph","title":"...","nodes":[{"id":"123","objectId":123,"label":"Class or object"}],"edges":[{"source":"123","target":"456","label":"field or reference"}]}. Graph nodes and edges must be top-level graph properties, not chart data or table rows; every edge source and target must match a node id. Use actual tool results only. Never return an empty rows/data/nodes/edges array when tool data exists. Do not return markdown tables.`; diff --git a/java-heap-workbench/src/logo.svg b/java-heap-workbench/src/logo.svg new file mode 100644 index 0000000..87126d6 --- /dev/null +++ b/java-heap-workbench/src/logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/java-heap-workbench/src/main.js b/java-heap-workbench/src/main.js new file mode 100644 index 0000000..1c6fb7e --- /dev/null +++ b/java-heap-workbench/src/main.js @@ -0,0 +1,280 @@ +import { AgUiRun } from './ag-ui.js'; +import { extractSuggestedActions, hydrateVisualData, parseAgentContent, renderMarkdown, renderA2UI } from './a2ui.js'; +import { validateOql } from './oql.js'; +import { AGENT_SYSTEM_PROMPT } from './agent-prompt.js'; +import { planToolVisuals } from './visualization-policy.js'; + +const savedModel = localStorage.getItem('heap.model'); + +const defaultModel = 'qwen3.5:9b'; // 'nemotron-3-nano:4b'; + +const OPENROUTER_MODELS = [ + ['cohere/north-mini-code:free', 'Cohere North Mini Code (free)'], + ['nvidia/nemotron-3.5-lightning:free', 'NVIDIA Nemotron 3.5 Lightning (free)'], + ['qwen/qwen3-coder:free', 'Qwen3 Coder (free)'], + ['openrouter/free', 'OpenRouter Free Models Router'] +]; +const state = { provider: localStorage.getItem('heap.provider') || 'ollama', mcp: localStorage.getItem('heap.mcp') || 'http://127.0.0.1:7777', ollama: localStorage.getItem('heap.ollama') || 'http://127.0.0.1:11434', openrouter: localStorage.getItem('heap.openrouter') || 'https://openrouter.ai/api/v1', openrouterKey: localStorage.getItem('heap.openrouterKey') || '', model: savedModel && savedModel !== 'qwen2.5:7b' ? savedModel : defaultModel, projects: [], project: null, handle: null, running: false, startedAt: 0, timer: null }; +const $ = (selector, root = document) => root.querySelector(selector); +const app = $('#app'); +app.innerHTML = `
    HEAP EXPLORATION

    Analysis workspace

    PROJECT / no heap loaded

    See what your heap is holding.

    Ask your local agent to investigate memory behavior and turn findings into a visual report.

    Heap signals

    Load a heap dump in the MCP server, then select its project.

    Quick investigations

    Ask the agent
    Agent
    Ask a question about the selected heap to begin.

    Run details

    idle
    AG-UI events will appear here.

    Heap files are loaded by java-heap-mcp
    Use its existing web UI or MCP client.
    `; +const openrouterModel = $('#openrouter-model'); +const modelControl = document.createElement('span'); +modelControl.className = 'field-control'; +const freeModelsLink = document.createElement('a'); +freeModelsLink.href = 'https://openrouter.ai/models?variant=free&output_modalities=text&order=most-popular'; +freeModelsLink.target = '_blank'; +freeModelsLink.rel = 'noopener noreferrer'; +freeModelsLink.textContent = 'Discover Free Models'; +openrouterModel.parentNode.insertBefore(modelControl, openrouterModel); +modelControl.append(openrouterModel, freeModelsLink); +$('#provider').value = state.provider; +const updateProviderFields = () => { const openrouter = $('#provider').value === 'openrouter'; const modelField = openrouter ? $('#openrouter-model') : $('#ollama-model'); $('#ollama-setting').hidden = openrouter; $('#ollama-model-setting').hidden = openrouter; $('#openrouter-setting').hidden = !openrouter; $('#key-setting').hidden = !openrouter; $('#openrouter-model-setting').hidden = !openrouter; const models = openrouter ? OPENROUTER_MODELS : [[defaultModel, 'Nemotron 3 Nano (local)']]; $('#model-options').innerHTML = models.map(([value, label]) => ``).join(''); if (!models.some(([value]) => value === modelField.value)) modelField.value = models[0][0]; }; +updateProviderFields(); +const visualPanel = $('#visuals'); +visualPanel.innerHTML = '

    Visual analysis

    Ask the Agent to investigate the selected heap. Charts, tables, and summary cards will appear here.
    '; +const quickPanel = document.querySelector('.dashboard-grid > .panel:nth-child(2)'); +quickPanel.classList.add('chat-prompts'); +document.querySelector('.chat-panel').insertBefore(quickPanel, $('#messages')); + +const api = async (path, method = 'GET', body) => { const response = await fetch(`${state.mcp}${path}`, { method, headers: body ? { 'Content-Type': 'application/json' } : {}, body: body && JSON.stringify(body) }); const data = await response.json(); if (!response.ok || data.error) throw new Error([data.error || `MCP request failed (${response.status})`, data.errorCode, data.cause].filter(Boolean).join(' — ')); return data; }; +const visualState = { nextId: 0, entries: new Map(), observer: null }; +const rowsFromResult = result => { + if (Array.isArray(result)) return result; + const candidates = [result, result?.structuredContent, result?.result]; + for (const candidate of candidates) { + for (const key of ['rows', 'entries', 'results', 'data']) { + if (Array.isArray(candidate?.[key])) return candidate[key]; + } + } + return []; +}; +const resultValue = result => result?.structuredContent || result?.result || result || {}; +const columnsFromResult = (result, rows) => { + const value = resultValue(result); + return Array.isArray(value.columns) && value.columns.length ? value.columns : Object.keys(rows[0] || {}); +}; +const showVisualLoading = () => { $('#visual-output').dataset.busy = 'true'; $('#visual-live').innerHTML = ''; $('#visual-live').hidden = false; }; +const previousVisualId = node => { let previous = node.previousElementSibling; while (previous) { if (previous.dataset.visualId) return previous.dataset.visualId; previous = previous.previousElementSibling; } return null; }; +const activateVisual = id => { if (!id || !visualState.entries.has(id)) return; visualState.entries.forEach((entry, entryId) => entry.classList.toggle('active', entryId === id)); document.querySelectorAll('.message[data-visual-id], .message[data-visual-target]').forEach(node => node.classList.toggle('visual-selected', node.dataset.visualId === id || node.dataset.visualTarget === id)); }; +const bindResponse = node => { node.tabIndex = 0; node.setAttribute('role', 'button'); const select = () => activateVisual(node.dataset.visualId || previousVisualId(node)); node.onclick = select; node.onkeydown = event => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); select(); } }; }; +const runSuggestedAction = prompt => runAgent(prompt).catch(error => { removeThinking(); addMessage(`Error: ${error.message}`); log(error.message); endRun('Failed', 'error'); }); +const addMessage = (text, kind = '', actions = []) => { const node = document.createElement('div'); node.className = `message ${kind}`; node.innerHTML = `${kind === 'user' ? 'you' : 'Agent'}${renderMarkdown(text)}`; if (kind !== 'user' && actions.length) { const actionBar = document.createElement('div'); actionBar.className = 'response-actions'; actions.forEach(action => { const button = document.createElement('button'); button.className = 'prompt'; button.type = 'button'; button.textContent = action.label; button.onclick = () => { if (!state.running) runSuggestedAction(action.prompt); }; actionBar.append(button); }); node.append(actionBar); } $('#messages').append(node); if (kind !== 'user') bindResponse(node); node.scrollIntoView({ block: 'nearest' }); return node; }; +const commitVisual = responseNode => { const live = $('#visual-live'); if (!live || !live.innerHTML.trim()) return; const id = `visual-${++visualState.nextId}`; const entry = document.createElement('section'); entry.className = 'visual-entry'; entry.dataset.visualId = id; entry.innerHTML = live.innerHTML; $('#visual-history').append(entry); visualState.entries.set(id, entry); responseNode.dataset.visualId = id; responseNode.classList.add('has-visual'); live.hidden = true; activateVisual(id); }; +const log = text => { $('#event-log').textContent = text; }; +const setRunProgress = (label, mode = 'working') => { $('#run-progress').hidden = false; $('#run-progress').dataset.mode = mode; $('#run-progress-label').textContent = label; $('#run-state').textContent = label.toLowerCase(); }; +const updateThinking = label => { const status = $('#thinking-status'); if (status) status.textContent = label; }; +const beginRun = () => { state.running = true; state.startedAt = Date.now(); $('#send').disabled = true; $('#send').textContent = 'Working…'; $('#prompt').disabled = true; document.querySelectorAll('.prompt').forEach(button => { button.disabled = true; }); showVisualLoading(); setRunProgress('Thinking…'); state.timer = setInterval(() => { $('#run-elapsed').textContent = `${Math.floor((Date.now() - state.startedAt) / 1000)}s`; }, 250); }; +const endRun = (label, mode = 'complete') => { state.running = false; clearInterval(state.timer); state.timer = null; $('#send').disabled = false; $('#send').textContent = 'Run'; $('#prompt').disabled = false; document.querySelectorAll('.prompt').forEach(button => { button.disabled = false; }); setRunProgress(label, mode); setTimeout(() => { if (!state.running) $('#run-progress').hidden = true; }, 1800); }; +const removeThinking = () => { const node = $('#thinking-message'); if (node) node.remove(); $('#visual-output').dataset.busy = 'false'; }; +const addThinking = () => { removeThinking(); const node = document.createElement('div'); node.id = 'thinking-message'; node.className = 'message thinking'; node.innerHTML = 'Agent
    Planning the investigation…'; $('#messages').append(node); node.scrollIntoView({ block: 'nearest' }); }; +visualState.observer = new IntersectionObserver(entries => { + const visible = entries.filter(entry => entry.isIntersecting && entry.target.dataset.visualId) + .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0]; + if (visible && !state.running) activateVisual(visible.target.dataset.visualId); +}); + +async function refreshProjects() { try { state.projects = await api('/api/projects'); const select = $('#project-select'); select.innerHTML = ''; state.projects.forEach(p => { const option = new Option(`${p.project}${p.activeHandle ? '' : ' (cached)'}`, p.project); select.add(option); }); const active = state.projects.find(p => p.activeHandle); if (active) { select.value = active.project; selectProject(active.project); } $('#mcp-status').textContent = 'MCP connected'; } catch (error) { $('#mcp-status').textContent = 'MCP offline'; log(error.message); } } +async function selectProject(name) { const project = state.projects.find(p => p.project === name); if (!project) return; try { const opened = project.activeHandle ? project : await api('/api/open-project', 'POST', { project: name }); state.project = opened.project; state.handle = opened.handle || opened.activeHandle; $('#project-name').textContent = state.project; await loadOverview(); } catch (error) { log(error.message); } } +async function loadOverview() { const overview = await api('/api/overview', 'POST', { handle: state.handle, limit: 12 }); const values = overview?.snapshot || {}; $('#metrics').innerHTML = [['used heap', values.usedHeapSize, 'blue'], ['objects', values.numberOfObjects, 'green'], ['classes', values.numberOfClasses, 'yellow'], ['class loaders', values.numberOfClassLoaders, 'red']].map(([label, value, tone]) => `
    ${label}${Number(value || 0).toLocaleString()}from current MAT snapshot
    `).join(''); } + +const toolDefinitions = [ + { type: 'function', function: { name: 'heap_get_overview', description: 'Get heap size, object, class, and GC overview.', parameters: { type: 'object', properties: {} } } }, + { type: 'function', function: { name: 'heap_get_oql_grammar', description: 'Get the supported Apache Calcite SQL grammar, heap schema, functions, and examples before constructing an OQL query.', parameters: { type: 'object', properties: {} } } }, + { type: 'function', function: { name: 'heap_get_histogram', description: 'Get classes ranked by heap usage.', parameters: { type: 'object', properties: { sort: { type: 'string' }, limit: { type: 'integer' } } } } }, + { type: 'function', function: { name: 'heap_get_dominators', description: 'Get objects/classes ranked by retained heap.', parameters: { type: 'object', properties: { limit: { type: 'integer' } } } } }, + { type: 'function', function: { name: 'heap_find_leak_suspects', description: 'Find suspected memory leaks.', parameters: { type: 'object', properties: { limit: { type: 'integer' } } } } }, + { type: 'function', function: { name: 'heap_run_oql', description: 'Run only a read-only Apache Calcite SQL SELECT statement (the OQL language) against the selected heap. Use SQL joins, grouping, aggregates, ordering, and pagination.', parameters: { type: 'object', required: ['query'], properties: { query: { type: 'string' }, limit: { type: 'integer' } } } } }, + { type: 'function', function: { name: 'heap_inspect_object', description: 'Inspect a heap object returned by OQL, including its class, fields, sizes, and references.', parameters: { type: 'object', required: ['objectId'], properties: { objectId: { type: 'integer' }, limit: { type: 'integer' } } } } }, + { type: 'function', function: { name: 'heap_find_path_to_gc_roots', description: 'Find reference paths from an object to GC roots.', parameters: { type: 'object', required: ['objectId'], properties: { objectId: { type: 'integer' }, excludeWeakRefs: { type: 'boolean' }, limit: { type: 'integer' } } } } } +]; +async function callTool(name, args) { args = typeof args === 'string' ? JSON.parse(args) : (args || {}); if (name === 'heap_get_oql_grammar') return api('/api/oql-grammar'); if (name === 'heap_run_oql') { console.info('[java-heap-workbench] Generated heap query:', args.query); const validationError = validateOql(args.query); if (validationError) return { error: 'OQL_VALIDATION_ERROR', message: validationError, query: args.query, correction: 'Use one read-only SELECT query. Prefer Apache Calcite SQL for JOIN/GROUP BY/HAVING/COUNT/SUM/ORDER BY/LIMIT/OFFSET and use MAT OQL for MAT-native expressions; do not add a semicolon.' }; } const routes = { heap_get_overview: ['/api/overview', {}], heap_get_histogram: ['/api/histogram', { sort: args.sort || 'retained', limit: args.limit || 10 }], heap_get_dominators: ['/api/dominators', { limit: args.limit || 10 }], heap_find_leak_suspects: ['/api/leaks', { limit: args.limit || 10 }], heap_run_oql: ['/api/oql', { query: args.query, limit: args.limit || 25, offset: 0 }], heap_inspect_object: ['/api/inspect', { objectId: args.objectId, limit: args.limit || 25 }], heap_find_path_to_gc_roots: ['/api/gc-roots', { objectId: args.objectId, excludeWeakRefs: args.excludeWeakRefs !== false, limit: args.limit || 25 }] }; const route = routes[name]; if (!route) throw new Error(`Unsupported tool: ${name}`); const [path, body] = route; return api(path, 'POST', { handle: state.handle, ...body }); } +function visualFromTool(name, result) { if (name === 'heap_get_overview') { const snapshot = result.snapshot || {}, classes = result.topClasses || [], dominators = result.topDominators || []; return { components: [{ type: 'summary', title: 'Used heap', value: Number(snapshot.usedHeapSize || 0).toLocaleString(), detail: `${Number(snapshot.numberOfObjects || 0).toLocaleString()} objects`, tone: 'blue' }, { type: 'summary', title: 'Classes', value: Number(snapshot.numberOfClasses || 0).toLocaleString(), detail: `${Number(snapshot.numberOfClassLoaders || 0).toLocaleString()} class loaders`, tone: 'yellow' }, { type: 'chart', title: 'Top retained classes', chartType: 'bar', data: classes.map(x => ({ label: x.className, value: x.retainedHeapBytes || x.shallowHeapBytes || 0 })) }, { type: 'table', title: 'Top retained contributors', columns: ['className', 'objectCount', 'retainedHeapBytes'], rows: classes }, { type: 'table', title: 'Top dominators', columns: ['className', 'displayName', 'retainedHeapBytes'], rows: dominators }] }; } if (name === 'heap_get_histogram' || name === 'heap_get_dominators') { const rows = rowsFromResult(result); return { components: [{ type: 'chart', title: name === 'heap_get_histogram' ? 'Retained heap by class' : 'Top dominators', chartType: 'bar', data: rows.map(x => ({ label: x.className || x.name || x.displayName || 'object', value: x.retainedHeapBytes || x.retainedHeap || x.retainedBytes || x.usedHeap || x.shallowHeapBytes || x.shallowHeap || x.objectCount || x.count || 0 })) }, { type: 'table', title: 'Analysis rows', rows }] }; } if (name === 'heap_find_leak_suspects') { const rows = Array.isArray(result) ? result : result.suspects || result.rows || []; return { components: [{ type: 'summary', title: 'Leak suspects', value: rows.length, detail: 'candidates returned by MAT', tone: 'red' }, { type: 'table', title: 'Suspect evidence', rows }] }; } if (name === 'heap_inspect_object') { const fields = Array.isArray(result.fields) ? result.fields : result.fields?.rows || []; const references = Array.isArray(result.outboundReferences) ? result.outboundReferences : []; return { components: [{ type: 'summary', title: 'Inspected object', value: result.className || result.displayName || `#${result.objectId}`, detail: `${Number(result.retainedHeapBytes || 0).toLocaleString()} retained bytes`, tone: 'blue' }, { type: 'table', title: 'Attributes and fields', rows: fields }, { type: 'table', title: 'Outbound references', rows: references }] }; } if (name === 'heap_find_path_to_gc_roots') { const rows = Array.isArray(result) ? result : result.paths || result.rows || []; return { components: [{ type: 'summary', title: 'Paths to GC roots', value: rows.length, detail: 'reference paths returned by MAT', tone: 'yellow' }, { type: 'table', title: 'GC root paths', rows }] }; } return { components: [{ type: 'summary', title: name === 'heap_run_oql' ? 'OQL result' : 'Analysis result', value: rowsFromResult(result).length || 'ready', detail: 'tool result returned', tone: 'blue' }, { type: 'table', title: 'Results', rows: rowsFromResult(result) }] }; } + +function referenceGraph(result) { + const rootId = result?.objectId; + const references = Array.isArray(result?.outboundReferences) ? result.outboundReferences : []; + const nodes = [{ id: String(rootId), objectId: rootId, label: result.className || result.displayName || `#${rootId}`, level: 0 }]; + const edges = []; + references.slice(0, 24).forEach(reference => { + if (reference?.objectId === undefined || reference?.objectId === null) return; + const id = String(reference.objectId); + if (!nodes.some(node => node.id === id)) nodes.push({ id, objectId: reference.objectId, label: reference.className || reference.displayName || `#${id}`, level: 1 }); + edges.push({ source: String(rootId), target: id, label: reference.displayName || reference.className || 'reference' }); + }); + return { type: 'graph', title: 'Outbound object references', nodes, edges }; +} + +function appendToolVisual(name, result, toolVisuals) { + const toolView = visualFromTool(name, result); + if (name === 'heap_inspect_object') toolView.components.push(referenceGraph(result)); + toolVisuals.components.push(...toolView.components); +} + +async function runAgent(question) { + if (!state.handle) throw new Error('Select or open a loaded heap project first.'); + beginRun(); + addMessage(question, 'user'); + addThinking(); + const run = new AgUiRun(event => { + if (event.type === 'RUN_STARTED') setRunProgress('Thinking…'); + if (event.type === 'TOOL_CALL_START') setRunProgress(`Calling ${event.name}…`); + if (event.type === 'TOOL_CALL_END') setRunProgress('Reading tool result…'); + if (event.type === 'TEXT_MESSAGE_CONTENT') setRunProgress('Writing visual response…'); + }); + run.start({ question }); + const messages = [{ role: 'system', content: AGENT_SYSTEM_PROMPT }, { role: 'user', content: question }]; + let lastTool = null; + let oqlFailed = false; + let oqlSucceeded = false; + const toolVisuals = { components: [] }; + const maxTurns = 4; + const graphRequest = /\bgraph\b/i.test(question) && /directed|object[- ]reference|outbound/i.test(question); + if (graphRequest) { + updateThinking('Selecting the largest dominator for the object graph…'); + try { + const dominatorArgs = { limit: 10 }; + run.toolStart('heap_get_dominators', dominatorArgs); + const dominatorResult = await callTool('heap_get_dominators', dominatorArgs); + run.toolEnd('heap_get_dominators', dominatorResult); + if (dominatorResult?.error) throw new Error(dominatorResult.message || dominatorResult.error); + appendToolVisual('heap_get_dominators', dominatorResult, toolVisuals); + renderA2UI($('#visual-live'), toolVisuals); + const dominatorRows = Array.isArray(dominatorResult) ? dominatorResult : dominatorResult.entries || dominatorResult.rows || []; + const root = dominatorRows.filter(row => row?.objectId !== undefined && row?.objectId !== null) + .sort((left, right) => Number(right.retainedHeapBytes || right.retainedBytes || 0) - Number(left.retainedHeapBytes || left.retainedBytes || 0))[0]; + if (root) { + updateThinking(`Inspecting dominator object ${root.objectId} for outbound references…`); + const inspectArgs = { objectId: root.objectId, limit: 25 }; + run.toolStart('heap_inspect_object', inspectArgs); + const inspectResult = await callTool('heap_inspect_object', inspectArgs); + run.toolEnd('heap_inspect_object', inspectResult); + if (inspectResult?.error) throw new Error(inspectResult.message || inspectResult.error); + appendToolVisual('heap_inspect_object', inspectResult, toolVisuals); + renderA2UI($('#visual-live'), toolVisuals); + messages.push({ role: 'system', content: `The workbench preloaded the directed graph workflow. Use this evidence to summarize the graph and return the exact A2UI graph shape with top-level nodes and edges. Dominator: ${JSON.stringify(root)}. Inspection: ${JSON.stringify(inspectResult)}` }); + updateThinking('Directed graph is visible; asking the agent to summarize the evidence…'); + } + } catch (error) { + updateThinking(`Graph preflight was unavailable; asking the agent to continue (${error.message})…`); + } + } + for (let turn = 0; turn < maxTurns; turn++) { + const turnStatus = turn === 0 ? 'Planning the investigation…' : `Planning the next step (${turn + 1}/${maxTurns})…`; + setRunProgress(turn === 0 ? 'Thinking…' : 'Planning next step…'); + updateThinking(turnStatus); + const openrouter = state.provider === 'openrouter'; + const endpoint = openrouter ? `${state.openrouter.replace(/\/$/, '')}/chat/completions` : `${state.ollama}/api/chat`; + const headers = { 'Content-Type': 'application/json' }; + if (openrouter) { if (!state.openrouterKey) throw new Error('OpenRouter API key is required. Open **Connections** to add it.'); headers.Authorization = `Bearer ${state.openrouterKey}`; headers['X-Title'] = 'java-heap-workbench'; } + updateThinking('Asking the agent to choose the next evidence step'); + const response = await fetch(endpoint, { method: 'POST', headers, body: JSON.stringify({ model: state.model, stream: false, messages, tools: toolDefinitions }) }); + if (!response.ok) throw new Error(`${openrouter ? 'OpenRouter' : 'Ollama'} request failed (${response.status})`); + const data = await response.json(); + const message = openrouter ? (data.choices?.[0]?.message || {}) : (data.message || {}); + messages.push(message); + const calls = message.tool_calls || []; + if (!calls.length) { + if (oqlFailed && !oqlSucceeded) { + const clarification = 'I’m having trouble correctly determining the data to query. What specific class, field, relationship, or filter should I investigate?'; + run.text(clarification); + removeThinking(); + addMessage(clarification); + run.finish(); + endRun('Needs clarification'); + return; + } + updateThinking('Preparing the final visual summary'); + const parsed = parseAgentContent(message.content || 'Analysis complete.'); + run.text(parsed.text || 'Visual response ready.'); + removeThinking(); + const hydratedView = hydrateVisualData(parsed.view, toolVisuals); + const visualComponents = hydratedView.components.filter(component => component.type !== 'markdown'); + const accumulatedComponents = [...toolVisuals.components, ...visualComponents] + .filter((component, index, components) => components.findIndex(item => JSON.stringify(item) === JSON.stringify(component)) === index); + const finalView = accumulatedComponents.length ? { ...hydratedView, components: accumulatedComponents } : toolVisuals; + if (finalView.components.length) renderA2UI($('#visual-live'), finalView); + const responseNode = addMessage(parsed.text || 'Visual response ready.', '', parsed.actions || extractSuggestedActions(parsed.text)); + if (visualComponents.length) { + commitVisual(responseNode); + visualState.observer.observe(responseNode); + } + run.finish(); + endRun('Complete'); + return; + } + for (const call of calls) { + const name = call.function.name; + const args = call.function.arguments || {}; + run.toolStart(name, args); + lastTool = name; + const toolLabel = name.replace(/^heap_/, '').replaceAll('_', ' '); + updateThinking(`Calling ${toolLabel}…`); + let result; + try { + result = await callTool(name, args); + } catch (error) { + result = { error: error.message, errorCode: error.code || 'TOOL_ERROR' }; + } + run.toolEnd(name, result); + updateThinking(result?.error ? `${toolLabel} returned an error; evaluating the next step…` : `${toolLabel} returned evidence; updating the visual…`); + messages.push({ role: 'tool', content: JSON.stringify(result), ...(openrouter && call.id ? { tool_call_id: call.id } : {}) }); + if (result?.error) { + if (name === 'heap_run_oql') oqlFailed = true; + const retryAvailable = name === 'heap_run_oql' && turn < maxTurns - 1; + if (retryAvailable) { + updateThinking(`The OQL attempt failed; retrying with simpler Calcite SQL (${turn + 2}/${maxTurns})…`); + addMessage(`The OQL attempt failed. I’m re-evaluating it and will retry with simpler Calcite SQL (attempt ${turn + 2} of ${maxTurns}).`, ''); + } + continue; + } + if (name === 'heap_run_oql') oqlSucceeded = true; + const toolView = visualFromTool(name, result); + if (name === 'heap_run_oql') { + const rows = rowsFromResult(result); + const value = resultValue(result); + const components = [{ type: 'table', title: 'OQL results', columns: columnsFromResult(result, rows), rows }]; + if (!rows.length) { + const totalRows = Number(value.totalRows); + components.push({ type: 'markdown', text: Number.isFinite(totalRows) && totalRows === 0 + ? 'The OQL query completed successfully but returned no rows.' + : 'The OQL query completed, but the returned result did not contain tabular rows.' }); + } + toolView.components = components; + } + if (name === 'heap_inspect_object') toolView.components.push(referenceGraph(result)); + toolView.components.push(...planToolVisuals(question, name, args, result)); + toolVisuals.components.push(...toolView.components); + renderA2UI($('#visual-live'), toolVisuals); + updateThinking('Visual updated; continuing the analysis…'); + } + } + removeThinking(); + if (oqlFailed && !oqlSucceeded) { + addMessage('I’m having trouble correctly determining the data to query. What specific class, field, relationship, or filter should I investigate?'); + } else if (lastTool) addMessage('The analysis tools returned results. See the visual report above.'); + run.finish(); + endRun('Complete'); +} + +const inspectObjectRow = row => { + if (!row || state.running) return; + const objectId = row.dataset.objectId; + const className = row.dataset.className || 'the selected object'; + runSuggestedAction(`Inspect object ${objectId} (${className}) and explain its fields, outbound references, retained memory, and path to GC roots.`); +}; +$('#visual-output').addEventListener('click', event => inspectObjectRow(event.target.closest('tr[data-object-id], g.graph-node[data-object-id]'))); +$('#visual-output').addEventListener('keydown', event => { + if (event.key === 'Enter' || event.key === ' ') inspectObjectRow(event.target.closest('tr[data-object-id], g.graph-node[data-object-id]')); +}); + +const content = $('.content'); +const navLinks = [...document.querySelectorAll('.nav a')]; +const showView = view => { + const connections = view === 'connections'; + content.classList.toggle('connections-view', connections); + $('#settings').hidden = !connections; + navLinks.forEach(link => link.classList.toggle('active', connections ? link.hash === '#settings' : link.hash !== '#settings')); +}; + +$('#refresh').onclick = refreshProjects; $('#project-select').onchange = e => selectProject(e.target.value); $('#send').onclick = () => { if (state.running) return; const prompt = $('#prompt').value.trim(); if (!prompt) return; $('#prompt').value = ''; runSuggestedAction(prompt); }; $('#prompt').onkeydown = e => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); $('#send').click(); } }; document.querySelectorAll('.prompt').forEach(button => button.onclick = () => { if (!state.running) runSuggestedAction(button.dataset.prompt); }); navLinks.forEach(link => link.onclick = event => { event.preventDefault(); showView(link.hash === '#settings' ? 'connections' : 'workspace'); }); $('#close-settings').onclick = () => showView('workspace'); $('#provider').onchange = updateProviderFields; $('#save-settings').onclick = () => { state.provider = $('#provider').value; state.mcp = $('#mcp-url').value.replace(/\/$/, ''); state.ollama = $('#ollama-url').value.replace(/\/$/, ''); state.openrouter = $('#openrouter-url').value.replace(/\/$/, ''); state.openrouterKey = $('#openrouter-key').value.trim(); state.model = (state.provider === 'openrouter' ? $('#openrouter-model') : $('#ollama-model')).value.trim(); localStorage.setItem('heap.provider', state.provider); localStorage.setItem('heap.mcp', state.mcp); localStorage.setItem('heap.ollama', state.ollama); localStorage.setItem('heap.openrouter', state.openrouter); localStorage.setItem('heap.openrouterKey', state.openrouterKey); localStorage.setItem('heap.model', state.model); showView('workspace'); refreshProjects(); }; refreshProjects(); diff --git a/java-heap-workbench/src/oql.js b/java-heap-workbench/src/oql.js new file mode 100644 index 0000000..824702c --- /dev/null +++ b/java-heap-workbench/src/oql.js @@ -0,0 +1,36 @@ +export const OQL_AGENT_RULES = `OQL query language (Apache Calcite SQL; full grammar: https://calcite.apache.org/docs/reference.html): +- OQL is backed by Apache Calcite SQL by default. Always formulate OQL as a read-only Calcite SELECT query; do not generate Eclipse MAT OQL syntax or switch dialects. +- Only read-only SELECT statements are supported. Use the Calcite query shape SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT/OFFSET or FETCH. Standard SQL is supported for filtering and projection (WHERE, CASE, DISTINCT), joins (JOIN ... ON), aggregation (COUNT, SUM, AVG, MIN, MAX with GROUP BY/HAVING), sorting (ORDER BY), set operations (UNION/EXCEPT/INTERSECT), and paging (LIMIT/OFFSET/FETCH). Submit one SELECT statement without a semicolon. Do not send EXPLAIN, DESCRIBE, INSERT, UPDATE, DELETE, or other statements to heap_run_oql. +- Heap schema: each Java class is a table containing its direct instances, without subclasses. Use the 'instanceof' schema/table when subclasses should be included. Quote a fully qualified class table when needed, for example FROM "java.util.HashMap" h. The special 'this' column is the current heap object; Java fields are exposed as columns. +- Qualify fields with table aliases. Use this['fieldName'] for dynamic field lookup and this['@className'], this['@class'], this['@shallow'], and this['@retained'] for virtual properties. Use double-quoted identifiers for class names or field names that need quoting; quoted identifiers are case-sensitive. Use single quotes for string literals. Do not use Java method syntax on aliases. +- Useful heap functions include getId, getAddress, getType, toString, shallowSize, retainedSize, length, getSize, getField, getStaticField, getStringContent, getValues, getMapEntries, getInboundReferences, getOutboundReferences, and getRetainedSet. These are SQL functions: call them as toString(s.this), retainedSize(s.this), or getField(s.this, 'fieldName'); never call them as row-alias methods such as s.toString(s.this). +- Expand references and maps with LATERAL TABLE(getOutboundReferences(o.this)), LATERAL TABLE(getInboundReferences(o.this)), or LATERAL TABLE(getMapEntries(o.this)). Use UNNEST(asMultiSet(collection)) for collections and UNNEST(asArray(referenceArray)) for arrays; SQL array indexes start at 1, and WITH ORDINALITY adds an index column. Collection conversion helpers include asMap, asMultiSet, asArray, asByteArray, asShortArray, asIntArray, asLongArray, asBooleanArray, asCharArray, asFloatArray, and asDoubleArray. +- Canonical frequency query for String objects: SELECT toString(s.this) AS val, count(*) AS cnt FROM "java.lang.String" s GROUP BY toString(s.this) ORDER BY COUNT(*) DESC. Keep the function call exactly in function form; do not rewrite it as s.toString(s.this). Add a WHERE clause before GROUP BY when filtering values. +- Examples: SELECT toString(file) AS file_str, COUNT(*) AS cnt, SUM(retainedSize(this)) AS sum_retained, SUM(shallowSize(this)) AS sum_shallow FROM java.net.URL GROUP BY toString(file) HAVING COUNT(*) > 1 ORDER BY SUM(retainedSize(this)) DESC; SELECT s.this, u.this FROM "java.lang.String" s JOIN "java.net.URL" u ON s.this = u.path; SELECT p.this, e.key, e."value" FROM java.util.Properties p, LATERAL TABLE(getMapEntries(p.this)) e; SELECT fpc.this, fp.fp_ref FROM java.io.FilePermissionCollection fpc, UNNEST(asMultiSet(fpc.perms)) fp(fp_ref); SELECT c.this, cs.index, cs.val FROM java.util.GregorianCalendar c, UNNEST(asIntArray(c.stamp)) WITH ORDINALITY cs(val, index). +- Aggregate rule: in an aggregate query, every SELECT, HAVING, and ORDER BY expression must be grouped, constant, or an aggregate. Prefer repeating the aggregate expression in ORDER BY (for example ORDER BY COUNT(*) DESC or ORDER BY SUM(retainedSize(this)) DESC) instead of relying on an alias. +- The MCP tool's limit and offset arguments cap rows returned to the UI. Use SQL LIMIT/OFFSET when it is part of the query's intended semantics; otherwise rely on the tool limit. +- Use the inspection and GC-root tools after an OQL query returns an object reference. Never claim fields or values that the tool did not return.`; + +// Lightweight guard for the Calcite SELECT dialect. Calcite owns the final +// parse; this prevents mutations, multiple statements, and malformed input. +export function validateOql(query) { + const source = String(query || '').trim(); + if (!source) return 'OQL query is empty.'; + if (source.includes(';')) return 'OQL must contain one Calcite SELECT statement without a semicolon.'; + if (!/^SELECT\b/i.test(source)) return 'OQL must be a read-only Calcite SELECT statement.'; + if (!/\bFROM\b/i.test(source)) return 'OQL SELECT must contain a FROM clause naming a heap table.'; + if (/\b(INSERT|UPDATE|DELETE|MERGE|ALTER|DROP|TRUNCATE)\b/i.test(source)) return 'Only read-only Calcite SELECT statements are allowed for heap queries.'; + if (/\b[A-Za-z_][A-Za-z0-9_]*\s*\.\s*toString\s*\(/i.test(source)) return 'Use the Calcite SQL function toString(expression), not alias.toString(expression).'; + let quote = null; + let depth = 0; + for (const character of source) { + if (quote) { if (character === quote) quote = null; continue; } + if (character === '"' || character === "'") { quote = character; continue; } + if (character === '(') depth += 1; + if (character === ')') depth -= 1; + if (depth < 0) return 'OQL has an unmatched closing parenthesis.'; + } + if (quote) return 'OQL has an unterminated quoted identifier or string literal.'; + if (depth !== 0) return 'OQL has unbalanced parentheses.'; + return null; +} diff --git a/java-heap-workbench/src/styles.css b/java-heap-workbench/src/styles.css new file mode 100644 index 0000000..6403795 --- /dev/null +++ b/java-heap-workbench/src/styles.css @@ -0,0 +1,16 @@ +:root{color-scheme:dark;--bg:#0d1117;--panel:#161b22;--panel2:#21262d;--line:#30363d;--text:#f0f6fc;--muted:#8b949e;--blue:#58a6ff;--green:#3fb950;--yellow:#d29922;--red:#f85149}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}button,input,textarea{font:inherit}button{cursor:pointer;border:1px solid var(--line);border-radius:6px;padding:8px 12px;background:#238636;color:#fff;font-weight:600}button:hover{background:#2ea043}button:disabled{opacity:.65;cursor:wait}button.secondary{background:var(--panel2)}.shell{display:grid;grid-template-columns:250px 1fr;min-height:100vh}.sidebar{padding:24px 18px;border-right:1px solid var(--line);background:#010409}.brand{display:flex;gap:10px;align-items:center;font-weight:700;font-size:16px}.mark{display:grid;place-items:center;width:28px;height:28px;border-radius:6px;background:#1f6feb;color:#fff}.nav{margin-top:34px;display:grid;gap:4px}.nav a{padding:9px 10px;color:var(--muted);border-radius:6px;text-decoration:none}.nav a.active,.nav a:hover{color:var(--text);background:var(--panel2)}.connection{position:absolute;bottom:20px;font-size:12px;color:var(--muted);display:grid;gap:5px}.dot{display:inline-block;width:7px;height:7px;border-radius:99px;background:var(--green);margin-right:6px}.main{min-width:0}.topbar{height:70px;padding:0 32px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}.topbar h1{font-size:20px;margin:0}.eyebrow,.muted{color:var(--muted);font-size:12px}.content{max-width:1400px;margin:auto;padding:30px 32px 60px;display:grid;gap:22px}.hero{display:flex;align-items:end;justify-content:space-between;gap:20px}.hero h2{font-size:28px;margin:5px 0}.hero p{margin:0;color:var(--muted)}.controls{display:flex;gap:8px;align-items:center}.select,input,textarea{background:var(--bg);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:8px 10px}.select{max-width:230px}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.summary-card,.panel{border:1px solid var(--line);background:var(--panel);border-radius:6px}.summary-card{padding:17px;display:grid;gap:8px;min-height:112px}.summary-card span,.panel header span{font-size:12px;color:var(--muted)}.summary-card strong{font-size:25px}.summary-card small{color:var(--muted)}.summary-card.blue{border-top:2px solid var(--blue)}.summary-card.green{border-top:2px solid var(--green)}.summary-card.yellow{border-top:2px solid var(--yellow)}.summary-card.red{border-top:2px solid var(--red)}.dashboard-grid{display:grid;grid-template-columns:1.5fr 1fr;gap:14px}.panel{padding:18px}.panel header{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}.panel h3{margin:0;font-size:14px}.chart{min-height:230px}.chart svg{width:100%;height:230px}.chat{display:grid;grid-template-columns:1fr 310px;gap:14px}.chat-panel{min-height:400px;display:grid;grid-template-rows:1fr auto auto}.messages{display:grid;align-content:start;gap:12px;padding-bottom:16px}.message{padding:12px 14px;border:1px solid var(--line);border-radius:6px;background:var(--panel2);line-height:1.6}.message.user{background:#10243e;border-color:#1f6feb}.message strong{color:var(--blue)}.message p{margin:0 0 10px}.message p:last-child{margin-bottom:0}.message h1,.message h2,.message h3,.message h4,.message h5,.message h6{margin:0 0 10px;color:var(--text);line-height:1.3}.message ul,.message ol{margin:4px 0 10px;padding-left:22px}.message li{margin:4px 0}.message code{padding:2px 5px;border-radius:4px;background:var(--bg);color:#ffa657;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}.message.thinking{border-color:rgba(88,166,255,.5);background:linear-gradient(90deg,var(--panel2),#17263a,var(--panel2));background-size:200% 100%;animation:thinking-sheen 2s ease-in-out infinite}.thinking-copy{color:var(--muted)}.thinking-dots{display:inline-flex;gap:3px;margin-left:5px;vertical-align:middle}.thinking-dots i{width:4px;height:4px;border-radius:50%;background:var(--blue);animation:thinking-dot 1.2s infinite ease-in-out}.thinking-dots i:nth-child(2){animation-delay:.16s}.thinking-dots i:nth-child(3){animation-delay:.32s}.run-progress{display:flex;align-items:center;gap:9px;margin:0 0 12px;padding:9px 11px;border:1px solid rgba(88,166,255,.4);border-radius:6px;background:rgba(31,111,235,.1);color:var(--blue);font-size:12px}.run-progress[data-mode=error]{color:var(--red);border-color:rgba(248,81,73,.5);background:rgba(248,81,73,.08)}.run-progress[data-mode=complete]{color:var(--green);border-color:rgba(63,185,80,.45);background:rgba(63,185,80,.08)}.run-progress #run-elapsed{margin-left:auto;color:var(--muted);font-variant-numeric:tabular-nums}.spinner{width:13px;height:13px;border:2px solid rgba(88,166,255,.3);border-top-color:var(--blue);border-radius:50%;animation:spin .8s linear infinite}.run-progress[data-mode=complete] .spinner,.run-progress[data-mode=error] .spinner{display:none}.composer{display:flex;gap:8px;border-top:1px solid var(--line);padding-top:14px}.composer textarea{resize:none;min-height:42px;flex:1}.prompt-list{display:grid;gap:7px}.prompt{text-align:left;background:transparent;color:var(--muted);font-weight:400}.prompt:hover{color:var(--text)}.dropzone{border:1px dashed var(--line);padding:18px;text-align:center;color:var(--muted);border-radius:6px}.a2ui-table{margin-top:14px}.scroll{overflow:auto}.a2ui-table table{width:100%;border-collapse:collapse}.a2ui-table th,.a2ui-table td{padding:9px 8px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}.a2ui-table th{font-size:11px;color:var(--muted)}.empty{padding:55px 15px;text-align:center;color:var(--muted)}.toast{position:fixed;right:20px;bottom:20px;padding:10px 14px;background:var(--panel2);border:1px solid var(--line);border-radius:6px}@keyframes spin{to{transform:rotate(360deg)}}@keyframes thinking-dot{0%,60%,100%{opacity:.25;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}@keyframes thinking-sheen{0%,100%{background-position:0 0}50%{background-position:100% 0}}@media(max-width:1000px){.shell{grid-template-columns:1fr}.sidebar{display:none}.grid{grid-template-columns:repeat(2,1fr)}.dashboard-grid,.chat{grid-template-columns:1fr}}@media(max-width:600px){.content{padding:22px 14px}.topbar{padding:0 14px}.grid{grid-template-columns:1fr}.hero{display:grid}.controls{align-items:stretch;flex-direction:column}} +.content{grid-template-columns:minmax(340px,.9fr) minmax(0,1.4fr);align-items:start}.hero{grid-column:1/-1}.content>#metrics{grid-column:2;grid-row:2}.dashboard-grid{grid-column:2;grid-row:3;display:block}.dashboard-grid>#visuals{width:100%;min-height:520px}.chat{grid-column:1;grid-row:2 / span 2;display:block}.chat-panel{min-height:650px;grid-template-rows:1fr auto auto auto}.chat>.panel:not(.chat-panel){display:none}.chat-prompts{margin:0 0 12px;padding:0;border:0;background:transparent}.chat-prompts header{margin-bottom:8px}.visual-output{display:grid;gap:14px}.visual-output>.empty{min-height:390px;display:grid;place-items:center}.run-progress{display:none}.dashboard-grid .panel+ .panel{display:none}.content>#settings{grid-column:1/-1;grid-row:4}.message.markdown{background:transparent;border:0;padding:0}.message.markdown p{margin:0 0 10px}.message.markdown h1,.message.markdown h2,.message.markdown h3,.message.markdown h4,.message.markdown h5,.message.markdown h6{margin-top:12px} +.content{grid-template-columns:minmax(340px,.9fr) minmax(0,1.4fr);align-items:start}.hero{grid-column:1/-1}.content>#metrics{grid-column:2;grid-row:2}.dashboard-grid{grid-column:2;grid-row:3;display:block}.dashboard-grid>#visuals{width:100%;min-height:520px}.chat{grid-column:1;grid-row:2 / span 2;display:block}.chat-panel{min-height:650px;grid-template-rows:1fr auto auto auto}.chat>.panel:not(.chat-panel){display:none}.chat-prompts{margin:0 0 12px;padding:0;border:0;background:transparent}.chat-prompts header{margin-bottom:8px}.visual-output{display:grid;gap:14px}.visual-output>.empty{min-height:390px;display:grid;place-items:center}.run-progress{display:none}.dashboard-grid .panel+ .panel{display:none}.content>#settings{grid-column:1/-1;grid-row:4}.message.markdown{background:transparent;border:0;padding:0}.message.markdown p{margin:0 0 10px}.message.markdown h1,.message.markdown h2,.message.markdown h3,.message.markdown h4,.message.markdown h5,.message.markdown h6{margin-top:12px} +@media(max-width:1000px){.content{grid-template-columns:1fr}.hero,.content>#metrics,.dashboard-grid,.chat,.content>#settings{grid-column:1;grid-row:auto}.dashboard-grid>#visuals{min-height:0}.chat-panel{min-height:520px}} +.activity-dots{display:inline-flex;gap:3px;align-items:center;height:16px}.activity-dots i{width:5px;height:5px;border-radius:50%;background:var(--blue);animation:visual-pulse 1.2s infinite ease-in-out}.activity-dots i:nth-child(2){animation-delay:.16s}.activity-dots i:nth-child(3){animation-delay:.32s}@keyframes visual-pulse{0%,60%,100%{opacity:.25;transform:scale(.8)}30%{opacity:1;transform:scale(1.25)}} +.dashboard-grid{position:sticky;top:88px}.visual-output{position:relative}#visual-live[hidden]{display:none}.visual-entry{opacity:.28;filter:brightness(.55);transform:scale(.985);transform-origin:top center;transition:opacity .2s ease,filter .2s ease,transform .2s ease;border:1px solid transparent;border-radius:6px;cursor:pointer}.visual-entry.active{opacity:1;filter:none;transform:scale(1);border-color:rgba(88,166,255,.6);box-shadow:0 0 0 1px rgba(88,166,255,.12)}.visual-entry:not(.active) .panel,.visual-entry:not(.active) .summary-card{pointer-events:none}.message.has-visual,.message[data-visual-target]{cursor:pointer;transition:border-color .2s ease,background .2s ease}.message.has-visual:hover,.message.has-visual:focus-visible,.message.visual-selected{border-color:var(--blue);outline:none}.message.has-visual:focus-visible{box-shadow:0 0 0 2px rgba(88,166,255,.25)} +.visual-entry:not(.active){max-height:78px;overflow:hidden} +@media(max-width:1000px){.dashboard-grid{position:static}} +.chat-panel{grid-template-rows:auto 1fr auto auto}#messages{display:grid;align-content:start;gap:12px;padding-bottom:16px;min-height:0;overflow:auto}.response-actions{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}.response-actions .prompt{padding:6px 9px;font-size:12px} +.a2ui-table tr[data-object-id]{cursor:pointer}.a2ui-table tr[data-object-id]:hover,.a2ui-table tr[data-object-id]:focus-visible{background:rgba(88,166,255,.1);outline:none}.a2ui-table tr[data-object-id]:focus-visible{box-shadow:inset 0 0 0 2px rgba(88,166,255,.45)} +.graph{overflow:auto;min-height:190px}.graph svg{display:block;width:100%;min-width:720px;height:auto}.graph-node{cursor:pointer}.graph-node:hover rect,.graph-node:focus rect{stroke:#f0f6fc;stroke-width:2}.graph-node:focus{outline:none} +@media(min-width:1001px){.chat{position:sticky;top:88px;align-self:start}.chat-panel{height:calc(100vh - 112px);max-height:calc(100vh - 112px)}} +.content.connections-view > :not(#settings){display:none}.content.connections-view #settings{display:block;grid-column:1/-1;grid-row:1} +.brand .mark{object-fit:contain;padding:3px;background:transparent}.connection-form{display:grid;gap:12px;max-width:760px}.connection-form label{display:grid;grid-template-columns:180px minmax(0,1fr);align-items:center;gap:16px}.connection-form [hidden]{display:none!important}.connection-form input,.connection-form select{width:100%;max-width:none}.field-control{display:flex;align-items:center;gap:10px;min-width:0}.field-control input{flex:1;min-width:0}.field-control a{color:var(--blue);font-size:12px;white-space:nowrap}.connection-submit{margin-top:6px} +.a2ui-table table{table-layout:fixed}.a2ui-table th,.a2ui-table td{white-space:normal;overflow-wrap:anywhere;word-break:break-word;vertical-align:top} +@media(min-width:1001px){.chat-panel,.dashboard-grid>#visuals{height:calc(100vh - 170px);max-height:calc(100vh - 170px);min-height:0}.chat-panel{overflow:hidden;padding-bottom:34px}.dashboard-grid>#visuals{overflow-y:auto}} diff --git a/java-heap-workbench/src/visualization-policy.js b/java-heap-workbench/src/visualization-policy.js new file mode 100644 index 0000000..0c87951 --- /dev/null +++ b/java-heap-workbench/src/visualization-policy.js @@ -0,0 +1,42 @@ +const rowsFor = result => { + if (Array.isArray(result)) return result; + for (const candidate of [result, result?.structuredContent, result?.result]) { + for (const key of ['rows', 'entries', 'results', 'data']) { + if (Array.isArray(candidate?.[key])) return candidate[key]; + } + } + return []; +}; + +const valueFor = (row, names) => { + const key = Object.keys(row || {}).find(candidate => names.includes(candidate.toLowerCase())); + return key === undefined ? undefined : row[key]; +}; + +const numericValue = value => { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : null; +}; + +export function planToolVisuals(question, name, args, result) { + const source = `${question || ''} ${args?.query || ''}`.toLowerCase(); + const rows = rowsFor(result); + + // A grouped value/count result is a frequency distribution. String frequency + // queries are the primary pie-chart use case and do not depend on model JSON. + if (name === 'heap_run_oql' && rows.length) { + const data = rows.map(row => ({ + label: valueFor(row, ['val', 'value', 'label', 'name']), + value: numericValue(valueFor(row, ['cnt', 'count', 'objectcount', 'frequency'])) + })).filter(point => point.label !== undefined && point.value !== null && point.value > 0).slice(0, 8); + const looksLikeFrequency = data.length > 0 && ( + /string|frequency|common|duplicate|pie/.test(source) + || rows.some(row => valueFor(row, ['val']) !== undefined && valueFor(row, ['cnt', 'count']) !== undefined) + ); + if (looksLikeFrequency) { + return [{ type: 'chart', title: 'Most common values', subtitle: 'Object-count distribution', chartType: 'pie', data }]; + } + } + + return []; +} diff --git a/java-heap-workbench/test/build.test.mjs b/java-heap-workbench/test/build.test.mjs new file mode 100644 index 0000000..35d67a9 --- /dev/null +++ b/java-heap-workbench/test/build.test.mjs @@ -0,0 +1,116 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { stat } from 'node:fs/promises'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { extractSuggestedActions, hydrateVisualData, normalizeAgentResponse, parseAgentContent, renderInlineMarkdown } from '../src/a2ui.js'; +import { AGENT_SYSTEM_PROMPT } from '../src/agent-prompt.js'; +import { OQL_AGENT_RULES, validateOql } from '../src/oql.js'; +import { planToolVisuals } from '../src/visualization-policy.js'; + +test('workbench build contains the app entry points', async () => { + const root = fileURLToPath(new URL('..', import.meta.url)); + await import(join(root, 'build.mjs')); + await stat(join(root, 'dist/index.html')); + await stat(join(root, 'dist/src/main.js')); + await stat(join(root, 'dist/src/a2ui.js')); +}); + +test('agent responses become visual components', () => { + const json = parseAgentContent('{"message":"Found the largest classes.","components":[{"type":"chart","chartType":"line","data":[{"label":"A","value":2}]}]}'); + assert.equal(json.view.components[0].type, 'chart'); + assert.equal(json.view.components[0].chartType, 'line'); + const messageOnly = parseAgentContent('{"message":"The table is shown in Visual Analysis.","components":[]}'); + assert.equal(messageOnly.text, 'The table is shown in Visual Analysis.'); + assert.deepEqual(messageOnly.view.components, []); + + const markdown = parseAgentContent('| Class | Retained |\n| --- | --- |\n| java.lang.String | 42 |'); + assert.equal(markdown.view.components[0].type, 'table'); + assert.equal(markdown.view.components[0].rows[0].Class, 'java.lang.String'); +}); + +test('agent responses preserve pie charts and directed object graphs', () => { + const response = normalizeAgentResponse({ components: [ + { type: 'chart', title: 'String frequency', chartType: 'pie', data: [{ label: 'alpha', value: 8 }] }, + { type: 'graph', title: 'Outbound references', nodes: [{ id: '1', objectId: 1 }, { id: '2', objectId: 2 }], edges: [{ source: '1', target: '2', label: 'value' }] } + ] }); + assert.equal(response.components[0].chartType, 'pie'); + assert.deepEqual(response.components[1].edges[0], { source: '1', target: '2', label: 'value' }); +}); + +test('visualization policy plans a pie chart for String frequency results', () => { + const planned = planToolVisuals('Show the top 5 String values as a pie chart.', 'heap_run_oql', {}, { + columns: ['val', 'cnt'], + rows: [{ val: 'alpha', cnt: 5 }, { val: 'beta', cnt: 3 }] + }); + assert.equal(planned[0].type, 'chart'); + assert.equal(planned[0].chartType, 'pie'); + assert.deepEqual(planned[0].data, [{ label: 'alpha', value: 5 }, { label: 'beta', value: 3 }]); +}); + +test('visualization policy accepts wrapped OQL result rows', () => { + const planned = planToolVisuals('Show common strings as a pie chart.', 'heap_run_oql', {}, { + structuredContent: { rows: [{ val: 'alpha', cnt: 2 }] } + }); + assert.equal(planned[0].chartType, 'pie'); +}); + +test('table cell markdown is rendered as inline markup', () => { + const rendered = renderInlineMarkdown('**1.4KB** \\*\\*`Com.escaper.Escape`\\*\\*'); + assert.match(rendered, /1\.4KB<\/strong>/); + assert.match(rendered, /Com\.escaper\.Escape<\/code>/); + assert.doesNotMatch(rendered, /\\\*\\\*/); +}); + +test('empty agent tables are hydrated from tool data', () => { + const hydrated = hydrateVisualData( + { components: [{ type: 'table', title: 'Top 10 Classes Ranked by Retained Heap Bytes', rows: [] }] }, + { components: [{ type: 'table', rows: [{ className: 'java.lang.String', retainedHeapBytes: 123 }] }] } + ); + assert.equal(hydrated.components[0].rows[0].className, 'java.lang.String'); +}); + +test('plain-text investigation guidance becomes action buttons', () => { + const actions = extractSuggestedActions('Overall Memory Usage\nTop Memory Consumers (Classes)\nDominant Objects\nLeak Detection\nDeep Inspection'); + assert.deepEqual(actions.map(action => action.label), ['Overall Memory Usage', 'Top Memory Consumers', 'Dominant Objects', 'Leak Detection', 'Deep Inspection']); +}); + +test('duplicate visual components render only once', () => { + const view = normalizeAgentResponse({ components: [ + { type: 'chart', title: 'Retained classes', chartType: 'bar', data: [{ label: 'A', value: 1 }] }, + { type: 'chart', title: 'Retained classes', chartType: 'bar', data: [{ label: 'A', value: 1 }] } + ] }); + assert.equal(view.components.length, 1); +}); + +test('OQL guard follows the Calcite SQL dialect', () => { + assert.equal(validateOql('SELECT * FROM java.lang.String s WHERE s.count > 10'), null); + assert.equal(validateOql('SELECT title FROM ConferenceSession'), null); + assert.equal(validateOql('SELECT * FROM java.lang.String LIMIT 10'), null); + assert.equal(validateOql('SELECT DISTINCT title FROM ConferenceSession'), null); + assert.equal(validateOql('SELECT s.this, e.key FROM java.util.Properties s, LATERAL TABLE(getMapEntries(s.this)) e'), null); + assert.equal(validateOql('SELECT toString(s.this) AS unique_value, COUNT(*) AS count FROM "java.lang.String" s GROUP BY toString(s.this) ORDER BY COUNT(*) DESC'), null); + assert.match(validateOql('SELECT * FROM java.lang.String;'), /one Calcite SELECT statement/); + assert.match(validateOql('SELECT * FROM java.lang.String WHERE ('), /unbalanced parentheses/); + assert.match(validateOql('UPDATE java.lang.String SET value = 1'), /read-only Calcite SELECT/); + assert.match(validateOql('SELECT s.toString(s.this) FROM "java.lang.String" s'), /Calcite SQL function toString/); +}); + +test('OQL agent context uses Calcite function syntax for common String values', () => { + assert.match(OQL_AGENT_RULES, /toString\(s\.this\).*never.*s\.toString\(s\.this\)/s); + assert.match(OQL_AGENT_RULES, /toString\(s\.this\) AS val, count\(\*\) AS cnt FROM "java\.lang\.String" s GROUP BY toString\(s\.this\) ORDER BY COUNT\(\*\) DESC/); + assert.match(OQL_AGENT_RULES, /HAVING COUNT\(\*\) > 1 ORDER BY SUM\(retainedSize\(this\)\) DESC/); + assert.match(OQL_AGENT_RULES, /LATERAL TABLE\(getMapEntries\(p\.this\)\)/); + assert.match(OQL_AGENT_RULES, /UNNEST\(asMultiSet\(fpc\.perms\)\)/); +}); + +test('agent context instructs query retries to simplify failed OQL', () => { + assert.match(AGENT_SYSTEM_PROMPT, /Before constructing or calling heap_run_oql, always call heap_get_oql_grammar/); + assert.match(AGENT_SYSTEM_PROMPT, /Do not call heap_find_path_to_gc_roots as a substitute for outboundReferences/); + assert.match(AGENT_SYSTEM_PROMPT, /Graph nodes and edges must be top-level graph properties/); + assert.match(AGENT_SYSTEM_PROMPT, /heap_run_oql fails, do not stop/); + assert.match(AGENT_SYSTEM_PROMPT, /retry up to three times/); + assert.match(AGENT_SYSTEM_PROMPT, /Do not repeat the same failed query/); + assert.match(AGENT_SYSTEM_PROMPT, /all OQL attempts fail, stop trying to guess/); + assert.match(AGENT_SYSTEM_PROMPT, /need more information/); +}); diff --git a/java-perf-workshop-server/pom.xml b/java-perf-workshop-server/pom.xml index 4faec7a..6041dbb 100644 --- a/java-perf-workshop-server/pom.xml +++ b/java-perf-workshop-server/pom.xml @@ -134,7 +134,7 @@ latest ${project.version} - openjdk:21 + openjdk:25 server-assembly.xml diff --git a/java-perf-workshop-tester/pom.xml b/java-perf-workshop-tester/pom.xml index 092a90f..1490cfc 100644 --- a/java-perf-workshop-tester/pom.xml +++ b/java-perf-workshop-tester/pom.xml @@ -11,8 +11,8 @@ java-perf-workshop-tester - 21 - 21 + 25 + 25 UTF-8 @@ -47,10 +47,11 @@ testCompile + 25 -Jbackend:GenBCode -Jdelambdafy:method - -target:jvm-21 + -target:jvm-25 -deprecation -feature -unchecked diff --git a/pom.xml b/pom.xml index 0262507..39328eb 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,19 @@ 3.14.9 - 2.13.12 + 2.13.17 + + + 3.31.0 + 3.22.0 + 3.12.0 + 76.1 + 5.12.2 + 3.27.3 + 1.41.0 + 3.1.12 + 1.16.1.202501091339 + 1.1.4 4.7.1 @@ -60,6 +72,7 @@ java-perf-workshop-server java-perf-workshop-tester + java-heap-mcp @@ -138,6 +151,56 @@ scala-library ${scala.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + org.eclipse.platform + org.eclipse.core.runtime + ${eclipse.platform.version} + + + org.eclipse.platform + org.eclipse.core.resources + ${eclipse.core.resources.version} + + + org.eclipse.platform + org.eclipse.core.commands + ${eclipse.core.commands.version} + + + com.ibm.icu + icu4j + ${icu4j.version} + + + org.apache.calcite + calcite-core + ${calcite.version} + + + org.codehaus.janino + janino + ${janino.version} + + + org.codehaus.janino + commons-compiler + ${janino.version} + + + org.junit.jupiter + junit-jupiter + ${junit.version} + + + org.assertj + assertj-core + ${assertj.version} + @@ -167,8 +230,8 @@ true true - 21 - 21 + 25 + 25