diff -pruN 2.1.10-1/README.md 2.2-1/README.md
--- 2.1.10-1/README.md	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/README.md	2025-04-17 09:07:34.000000000 +0000
@@ -1,4 +1,4 @@
-# VisualVM (2.1.10) sources repository
+# VisualVM (2.2) sources repository
 
 VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling capabilities. See https://visualvm.github.io for details, downloads and documentation.
 
@@ -14,7 +14,7 @@ First download or clone this repository
 
 ## Configure the dependencies
 
-Then download and extract the [NetBeans Platform 22](https://github.com/oracle/visualvm/releases/download/2.1.10/nb220_platform_20240628.zip) into directory `visualvm/visualvm` (should create `visualvm/visualvm/netbeans`).
+Then download and extract the [NetBeans Platform 22](https://github.com/oracle/visualvm/releases/download/2.2/nb220_platform_20250323.zip) into directory `visualvm/visualvm` (should create `visualvm/visualvm/netbeans`).
 
 ## How to build
 
@@ -28,43 +28,44 @@ To run VisualVM, use `ant run` command i
 
 To build or run the plugins suite, use `ant build` or `ant run` in the `visualvm/plugins` directory. This will automatically build the zip distribution of the core VisualVM tool into `visualvm/visualvm/dist/visualvm.zip` and extract it into the `visualvm/plugins/visualvm` directory. After that the build of the plugins suite continues to build each of the individual plugins. Running the plugins suite means starting VisualVM with all the plugins installed.
 
- Generate the Maven artifacts
-
-First prepare the binaries:
-
-  1. Build VisualVM tool as described above
-  2. Expand/decompress the generated `visualvm.zip` file in `visualvm/dist`.
-  3. Generate the NBMs by running: `ant nbms`. This will generate a folder `build/updates` containing all the NBMs.
-
-To generate the artifacts use [`org.apache.netbeans.utilities:nb-repository-plugin`](https://bits.netbeans.org/mavenutilities/nb-repository-plugin/index.html). Make sure the current directory is still `visualvm/visualvm`.
-
-To install the artifacts into your local repository use the following command:
-
-```
-mvn \
--DnetbeansInstallDirectory=dist/visualvm   \
--DnetbeansNbmDirectory=build/updates   \
--DgroupIdPrefix=org.graalvm.visualvm  \
--DforcedVersion=RELEASE2110   \
-org.apache.netbeans.utilities:nb-repository-plugin:populate
-```
-
-To publish the artifacts into a remote repository use the following command:
-
-```
-mvn
--DnetbeansInstallDirectory=dist/visualvm   \
--DnetbeansNbmDirectory=build/updates   \
--DgroupIdPrefix=org.graalvm.visualvm  \
--DforcedVersion=RELEASE2110   \
--DdeployUrl=<URL to the remote repo> \
--DdeployId=<repository id referenced in your settings.xml>   \
--DskipInstall=true  \
-org.apache.netbeans.utilities:nb-repository-plugin:populate
-```
-
-For more information about `nb-repository-plugin` see https://bits.netbeans.org/mavenutilities/nb-repository-plugin/index.html
-
+Generate the Maven artifacts
+ 
+ First prepare the binaries:
+ 
+   1. Build VisualVM tool as described above
+   2. Expand/decompress the generated `visualvm.zip` file in `visualvm/dist`.
+   3. Generate the NBMs by running: `ant nbms`. This will generate a folder `build/updates` containing all the NBMs.
+ 
+ To generate the artifacts use [`org.apache.netbeans.utilities:nb-repository-plugin`](https://bits.netbeans.org/mavenutilities/nb-repository-plugin/index.html). Make sure the current directory is still `visualvm/visualvm`.
+ 
+ To install the artifacts into your local repository use the following command:
+ 
+ ```
+ mvn \
+ -DnetbeansInstallDirectory=dist/visualvm   \
+ -DnetbeansNbmDirectory=build/updates   \
+ -DgroupIdPrefix=org.graalvm.visualvm  \
+ -DforcedVersion=RELEASE22   \
+ org.apache.netbeans.utilities:nb-repository-plugin:populate
+ ```
+ 
+ To publish the artifacts into a remote repository use the following command:
+ 
+ ```
+ mvn
+ -DnetbeansInstallDirectory=dist/visualvm   \
+ -DnetbeansNbmDirectory=build/updates   \
+ -DgroupIdPrefix=org.graalvm.visualvm  \
+ -DforcedVersion=RELEASE22   \
+ -DdeployUrl=<URL to the remote repo> \
+ -DdeployId=<repository id referenced in your settings.xml>   \
+ -DskipInstall=true  \
+ org.apache.netbeans.utilities:nb-repository-plugin:populate
+ ```
+ 
+ For more information about `nb-repository-plugin` see https://bits.netbeans.org/mavenutilities/nb-repository-plugin/index.html
+ 
+ 
 ## Contributing
 
 We highly appreciate any feedback! Please let us know your ideas, missing features, or bugs found. Either [file a RFE/bug](https://github.com/oracle/visualvm/issues/new/choose) or [leave us a message](https://visualvm.github.io/feedback.html). For legal reasons, we cannot accept external pull requests. See 
@@ -77,5 +78,5 @@ Please consult the [security guide](./SE
 
 ## License
 
-Copyright (c) 2017, 2023 Oracle and/or its affiliates.
+Copyright (c) 2017, 2025 Oracle and/or its affiliates.
 Released under the GNU General Public License, version 2, with the Classpath Exception.
diff -pruN 2.1.10-1/debian/changelog 2.2-1/debian/changelog
--- 2.1.10-1/debian/changelog	2025-01-23 06:03:41.000000000 +0000
+++ 2.2-1/debian/changelog	2025-09-05 11:48:04.000000000 +0000
@@ -1,3 +1,10 @@
+visualvm (2.2-1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * New upstream version.
+
+ -- Matthias Klose <doko@debian.org>  Fri, 05 Sep 2025 13:48:04 +0200
+
 visualvm (2.1.10-1) unstable; urgency=medium
 
   [ Matthias Klose ]
diff -pruN 2.1.10-1/debian/patches/drop-nashorn.jdk15.patch 2.2-1/debian/patches/drop-nashorn.jdk15.patch
--- 2.1.10-1/debian/patches/drop-nashorn.jdk15.patch	2024-04-16 02:00:48.000000000 +0000
+++ 2.2-1/debian/patches/drop-nashorn.jdk15.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-Description: drop nashorn Java 15 plugin
- Nashorn was removed from Java 15 and is a separate project[1] now.
- Debian does not package Nashorn[1] and the plugin depends on it.
- Disable plugin until Nashorn[1] is available.
-[1] https://github.com/openjdk/nashorn
-Author: Vladimir Petko <vladimir.petko@canonical.com>
-Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1069003
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/visualvm/+bug/2060246
-Forwarded: not-needed
-Last-Update: 2024-04-15
-
---- a/visualvm/nbproject/project.properties
-+++ b/visualvm/nbproject/project.properties
-@@ -44,7 +44,6 @@
-     ${project.org.graalvm.visualvm.lib.profiler.oql}:\
-     ${project.org.graalvm.visualvm.lib.profiler.snaptracer}:\
-     ${project.org.graalvm.visualvm.lib.profiler.utilities}:\
--    ${project.org.graalvm.visualvm.nashorn.jdk15}:\
-     ${project.org.graalvm.visualvm.jfr}:
- #    ${project.org.graalvm.visualvm.jfr.jdk11}
- project.org.graalvm.visualvm.api.caching=caching.api
-@@ -61,7 +60,6 @@
- project.org.graalvm.visualvm.host=host
- project.org.graalvm.visualvm.host.remote=hostremote
- project.org.graalvm.visualvm.host.views=hostviews
--project.org.graalvm.visualvm.nashorn.jdk15=nashorn.jdk15
- project.org.graalvm.visualvm.jfr=jfr
- #project.org.graalvm.visualvm.jfr.jdk11=jfr.jdk11
- project.org.graalvm.visualvm.jmx=jmx
diff -pruN 2.1.10-1/debian/patches/jfr.generic.patch 2.2-1/debian/patches/jfr.generic.patch
--- 2.1.10-1/debian/patches/jfr.generic.patch	2024-04-16 02:00:53.000000000 +0000
+++ 2.2-1/debian/patches/jfr.generic.patch	2025-09-05 11:48:04.000000000 +0000
@@ -10,19 +10,19 @@ precisely flightrecorder.
 
 --- a/visualvm/nbproject/project.properties
 +++ b/visualvm/nbproject/project.properties
-@@ -45,8 +45,7 @@
+@@ -45,8 +45,7 @@ modules=\
+     ${project.org.graalvm.visualvm.lib.profiler.oql}:\
      ${project.org.graalvm.visualvm.lib.profiler.snaptracer}:\
      ${project.org.graalvm.visualvm.lib.profiler.utilities}:\
-     ${project.org.graalvm.visualvm.nashorn.jdk15}:\
 -    ${project.org.graalvm.visualvm.jfr}:\
 -    ${project.org.graalvm.visualvm.jfr.generic}
 +    ${project.org.graalvm.visualvm.jfr}:
  #    ${project.org.graalvm.visualvm.jfr.jdk11}
+ #    ${project.org.graalvm.visualvm.nashorn.jdk15}
  project.org.graalvm.visualvm.api.caching=caching.api
- project.org.graalvm.visualvm.application=application
-@@ -64,7 +63,6 @@
+@@ -65,7 +64,6 @@ project.org.graalvm.visualvm.host.remote
  project.org.graalvm.visualvm.host.views=hostviews
- project.org.graalvm.visualvm.nashorn.jdk15=nashorn.jdk15
+ #project.org.graalvm.visualvm.nashorn.jdk15=nashorn.jdk15
  project.org.graalvm.visualvm.jfr=jfr
 -project.org.graalvm.visualvm.jfr.generic=jfr.generic
  #project.org.graalvm.visualvm.jfr.jdk11=jfr.jdk11
diff -pruN 2.1.10-1/debian/patches/series 2.2-1/debian/patches/series
--- 2.1.10-1/debian/patches/series	2024-04-16 02:00:53.000000000 +0000
+++ 2.2-1/debian/patches/series	2025-09-05 11:48:04.000000000 +0000
@@ -4,4 +4,3 @@ jfr.generic.patch
 no-flatlaf-support.patch
 org.openide.util.lookup.patch
 use-older-keyring.patch
-drop-nashorn.jdk15.patch
diff -pruN 2.1.10-1/integrations/vscode/README.md 2.2-1/integrations/vscode/README.md
--- 2.1.10-1/integrations/vscode/README.md	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/README.md	2025-04-17 09:07:34.000000000 +0000
@@ -178,12 +178,12 @@ For VisualVM specific troubleshooting, r
 ## Contributing
 
 We highly appreciate any feedback! Please let us know your ideas, missing features, or bugs found. Either [file a RFE/bug](https://github.com/oracle/visualvm/issues/new/choose) or [leave us a message](https://visualvm.github.io/feedback.html). For legal reasons, we cannot accept external pull requests. See 
-[CONTRIBUTING](./CONTRIBUTING.md)
+[CONTRIBUTING](https://github.com/oracle/visualvm/blob/master/CONTRIBUTING.md)
 for details.
 
 ## Security
 
-Please consult the [security guide](./SECURITY.md) for our responsible security vulnerability disclosure process
+Please consult the [security guide](https://github.com/oracle/visualvm/blob/master/SECURITY.md) for our responsible security vulnerability disclosure process
 
 ## License
 
@@ -192,4 +192,4 @@ Released under the GNU General Public Li
 
 ## Release Notes
 
-See the [CHANGELOG](CHANGELOG.md).
\ No newline at end of file
+See the [CHANGELOG](https://github.com/oracle/visualvm/blob/master/integrations/vscode/CHANGELOG.md).
\ No newline at end of file
diff -pruN 2.1.10-1/integrations/vscode/package-lock.json 2.2-1/integrations/vscode/package-lock.json
--- 2.1.10-1/integrations/vscode/package-lock.json	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/package-lock.json	2025-04-17 09:07:34.000000000 +0000
@@ -1,12 +1,12 @@
 {
 	"name": "visualvm-vscode",
-	"version": "1.0.0",
+	"version": "1.0.0-dev",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "visualvm-vscode",
-			"version": "1.0.0",
+			"version": "1.0.0-dev",
 			"license": "GPLv2+CPE",
 			"dependencies": {
 				"decompress": "^4.2.1"
@@ -36,7 +36,7 @@
 				"node-abort-controller": "^3.1.1",
 				"ts-loader": "^9.4.2",
 				"typescript": "^4.9.5",
-				"webpack": "^5.74.0",
+				"webpack": "^5.94.0",
 				"webpack-cli": "^4.10.0"
 			},
 			"engines": {
@@ -1200,10 +1200,10 @@
 				"node": ">=0.4.0"
 			}
 		},
-               "node_modules/acorn-import-attributes": {
-                       "version": "1.9.5",
-                       "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
-                       "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+		"node_modules/acorn-import-attributes": {
+			"version": "1.9.5",
+			"resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+			"integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
 			"dev": true,
 			"peerDependencies": {
 				"acorn": "^8"
@@ -1295,9 +1295,9 @@
 			}
 		},
 		"node_modules/ansi-colors": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+			"version": "4.1.3",
+			"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+			"integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -1884,9 +1884,9 @@
 			}
 		},
 		"node_modules/cross-spawn": {
-			"version": "7.0.3",
-			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-			"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+			"version": "7.0.6",
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+			"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
 			"dev": true,
 			"dependencies": {
 				"path-key": "^3.1.0",
@@ -1935,12 +1935,12 @@
 			}
 		},
 		"node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+			"version": "4.4.0",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+			"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
 			"dev": true,
 			"dependencies": {
-				"ms": "2.1.2"
+				"ms": "^2.1.3"
 			},
 			"engines": {
 				"node": ">=6.0"
@@ -2153,9 +2153,9 @@
 			"dev": true
 		},
 		"node_modules/diff": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
-			"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+			"integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
 			"dev": true,
 			"engines": {
 				"node": ">=0.3.1"
@@ -2279,9 +2279,9 @@
 			}
 		},
 		"node_modules/enhanced-resolve": {
-                       "version": "5.17.1",
-                       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
-                       "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+			"version": "5.17.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+			"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
 			"dev": true,
 			"dependencies": {
 				"graceful-fs": "^4.2.4",
@@ -4230,31 +4230,31 @@
 			"optional": true
 		},
 		"node_modules/mocha": {
-			"version": "10.4.0",
-			"resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz",
-			"integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==",
-			"dev": true,
-			"dependencies": {
-				"ansi-colors": "4.1.1",
-				"browser-stdout": "1.3.1",
-				"chokidar": "3.5.3",
-				"debug": "4.3.4",
-				"diff": "5.0.0",
-				"escape-string-regexp": "4.0.0",
-				"find-up": "5.0.0",
-				"glob": "8.1.0",
-				"he": "1.2.0",
-				"js-yaml": "4.1.0",
-				"log-symbols": "4.1.0",
-				"minimatch": "5.0.1",
-				"ms": "2.1.3",
-				"serialize-javascript": "6.0.0",
-				"strip-json-comments": "3.1.1",
-				"supports-color": "8.1.1",
-				"workerpool": "6.2.1",
-				"yargs": "16.2.0",
-				"yargs-parser": "20.2.4",
-				"yargs-unparser": "2.0.0"
+			"version": "10.8.2",
+			"resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz",
+			"integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==",
+			"dev": true,
+			"dependencies": {
+				"ansi-colors": "^4.1.3",
+				"browser-stdout": "^1.3.1",
+				"chokidar": "^3.5.3",
+				"debug": "^4.3.5",
+				"diff": "^5.2.0",
+				"escape-string-regexp": "^4.0.0",
+				"find-up": "^5.0.0",
+				"glob": "^8.1.0",
+				"he": "^1.2.0",
+				"js-yaml": "^4.1.0",
+				"log-symbols": "^4.1.0",
+				"minimatch": "^5.1.6",
+				"ms": "^2.1.3",
+				"serialize-javascript": "^6.0.2",
+				"strip-json-comments": "^3.1.1",
+				"supports-color": "^8.1.1",
+				"workerpool": "^6.5.1",
+				"yargs": "^16.2.0",
+				"yargs-parser": "^20.2.9",
+				"yargs-unparser": "^2.0.0"
 			},
 			"bin": {
 				"_mocha": "bin/_mocha",
@@ -4295,9 +4295,9 @@
 			}
 		},
 		"node_modules/mocha/node_modules/minimatch": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
-			"integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+			"version": "5.1.6",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+			"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
 			"dev": true,
 			"dependencies": {
 				"brace-expansion": "^2.0.1"
@@ -4306,12 +4306,6 @@
 				"node": ">=10"
 			}
 		},
-		"node_modules/mocha/node_modules/ms": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-			"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-			"dev": true
-		},
 		"node_modules/mocha/node_modules/supports-color": {
 			"version": "8.1.1",
 			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -4553,9 +4547,9 @@
 			}
 		},
 		"node_modules/ms": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+			"version": "2.1.3",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+			"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
 			"dev": true
 		},
 		"node_modules/mute-stream": {
@@ -5509,9 +5503,9 @@
 			}
 		},
 		"node_modules/serialize-javascript": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
-			"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+			"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
 			"dev": true,
 			"dependencies": {
 				"randombytes": "^2.1.0"
@@ -5784,9 +5778,9 @@
 			}
 		},
 		"node_modules/tar-fs": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
-			"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
+			"integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
 			"dev": true,
 			"optional": true,
 			"dependencies": {
@@ -5965,15 +5959,6 @@
 				"url": "https://opencollective.com/webpack"
 			}
 		},
-		"node_modules/terser-webpack-plugin/node_modules/serialize-javascript": {
-			"version": "6.0.2",
-			"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
-			"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
-			"dev": true,
-			"dependencies": {
-				"randombytes": "^2.1.0"
-			}
-		},
 		"node_modules/terser-webpack-plugin/node_modules/supports-color": {
 			"version": "8.1.1",
 			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -6350,9 +6335,9 @@
 			}
 		},
 		"node_modules/webpack": {
-                       "version": "5.94.0",
-                       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
-                       "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
+			"version": "5.94.0",
+			"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
+			"integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
 			"dev": true,
 			"dependencies": {
 				"@types/estree": "^1.0.5",
@@ -6360,10 +6345,10 @@
 				"@webassemblyjs/wasm-edit": "^1.12.1",
 				"@webassemblyjs/wasm-parser": "^1.12.1",
 				"acorn": "^8.7.1",
-                               "acorn-import-attributes": "^1.9.5",
+				"acorn-import-attributes": "^1.9.5",
 				"browserslist": "^4.21.10",
 				"chrome-trace-event": "^1.0.2",
-                               "enhanced-resolve": "^5.17.1",
+				"enhanced-resolve": "^5.17.1",
 				"es-module-lexer": "^1.2.1",
 				"eslint-scope": "5.1.1",
 				"events": "^3.2.0",
@@ -6523,9 +6508,9 @@
 			}
 		},
 		"node_modules/workerpool": {
-			"version": "6.2.1",
-			"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
-			"integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+			"version": "6.5.1",
+			"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
+			"integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
 			"dev": true
 		},
 		"node_modules/wrap-ansi": {
@@ -6647,9 +6632,9 @@
 			}
 		},
 		"node_modules/yargs-parser": {
-			"version": "20.2.4",
-			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
-			"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+			"version": "20.2.9",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+			"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
 			"dev": true,
 			"engines": {
 				"node": ">=10"
diff -pruN 2.1.10-1/integrations/vscode/package.json 2.2-1/integrations/vscode/package.json
--- 2.1.10-1/integrations/vscode/package.json	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/package.json	2025-04-17 09:07:34.000000000 +0000
@@ -2,8 +2,8 @@
 	"name": "visualvm-vscode",
 	"displayName": "VisualVM for VS Code",
 	"description": "VisualVM integration for Visual Studio Code",
-	"version": "1.0.0",
-	"preview": false,
+	"version": "1.0.0-dev",
+	"preview": true,
 	"license": "GPLv2+CPE",
 	"publisher": "oracle-labs-graalvm",
 	"author": {
diff -pruN 2.1.10-1/integrations/vscode/src/test/README.md 2.2-1/integrations/vscode/src/test/README.md
--- 2.1.10-1/integrations/vscode/src/test/README.md	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/src/test/README.md	2025-04-17 09:07:34.000000000 +0000
@@ -1,25 +1,25 @@
-# Proxy setup
-
-In case of network behind the proxy, the following variables must be set:
-
-- `http_proxy` - URL to proxy, incl. protocol and port, e.g. http://acme.com:80
-- `no_proxy`   - URL patterns that must not use proxy. In particular, corporate/internal NPM module repositories must be enumerated in no_proxy env var.
-
-Internally (in package.json), the globalAgent/bootstrap is used with `GLOBAL_AGENT_{HTTP,NO}_PROXY`
-set to the appropriate env variable. The environment variables `http_proxy` and `no_proxy` are read by npm package manager. 
-
-
-# Prepare for testing
-
-Ensure that all necessary npm modules are installed. Run
-- `npm install`
-to update the local node_modules module cache, if any changes were pulled for `package.json`.
-
-You need to compile the VisualVM extension itself, and the test code before launching the tests.
-- `npm run compile`
-- `npm run pretest`
-
-
-# Run the tests from the CLI
-
+# Proxy setup
+
+In case of network behind the proxy, the following variables must be set:
+
+- `http_proxy` - URL to proxy, incl. protocol and port, e.g. http://acme.com:80
+- `no_proxy`   - URL patterns that must not use proxy. In particular, corporate/internal NPM module repositories must be enumerated in no_proxy env var.
+
+Internally (in package.json), the globalAgent/bootstrap is used with `GLOBAL_AGENT_{HTTP,NO}_PROXY`
+set to the appropriate env variable. The environment variables `http_proxy` and `no_proxy` are read by npm package manager. 
+
+
+# Prepare for testing
+
+Ensure that all necessary npm modules are installed. Run
+- `npm install`
+to update the local node_modules module cache, if any changes were pulled for `package.json`.
+
+You need to compile the VisualVM extension itself, and the test code before launching the tests.
+- `npm run compile`
+- `npm run pretest`
+
+
+# Run the tests from the CLI
+
 Tests can be executed by `npm run test`. The test bootstrap will download a separate installation of vscode into `.vscode-test` directory and then duplicated into `output/a vscode-test` to test the space in path of vscode installation. The testing environment will use a **separate** extensions dir (`.vscode-test/extensions`) and user dir (`.vscode-test/user-data`). The tested vscode installation is completely separated from the development one.
\ No newline at end of file
diff -pruN 2.1.10-1/integrations/vscode/src/test/runTest.ts 2.2-1/integrations/vscode/src/test/runTest.ts
--- 2.1.10-1/integrations/vscode/src/test/runTest.ts	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/src/test/runTest.ts	2025-04-17 09:07:34.000000000 +0000
@@ -1,106 +1,106 @@
-/*
- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import { downloadAndUnzipVSCode,
-    runTests 
-} from '@vscode/test-electron';
-import * as path from 'path';
-import * as fs from 'fs';
-
-
-
-
-async function main() {
-try {
-    // The folder containing the Extension Manifest package.json
-    // Passed to `--extensionDevelopmentPath`
-    const extensionDevelopmentPath = path.resolve(__dirname, '../../');
-
-    // The path to the extension test runner script
-    // Passed to --extensionTestsPath
-    const extensionTestsPath = path.resolve(__dirname, './suite/index');
-
-    // The path to the test project 
-    const testWorkspace = path.resolve(__dirname, '../../fixtures/test projects/demo');
-
-    // Manually download latest stable VS Code release for testing.
-    const vscodeExecutablePath = await downloadAndUnzipVSCode('1.89.0'); 
-
-    const outputFolder = path.resolve(__dirname, '../../output');
-
-    if (!fs.existsSync(outputFolder)) {   
-        fs.mkdirSync(outputFolder);
-    }
-
-    const noSpacePath = path.resolve(__dirname, '../../.vscode-test');
-    const spacePath = path.resolve(__dirname, '../../output/a vscode-test');
-    const splitPath = vscodeExecutablePath.split('\\');
-    const exeFile = splitPath.pop();
-    const vscodeFolder = splitPath.pop();
-
-    let newVscodeExecutablePath: string = vscodeExecutablePath;
-    if (vscodeFolder && exeFile) {
-        newVscodeExecutablePath = path.join(spacePath, vscodeFolder, exeFile);
-    }
-    
-    if (!fs.existsSync(spacePath)) {
-        duplicate(noSpacePath, spacePath);
-    }
-
-    await runTests({
-        vscodeExecutablePath: newVscodeExecutablePath,
-        extensionDevelopmentPath, 
-        extensionTestsPath,
-        launchArgs: [testWorkspace]
-    });
-
-} catch (err) {
-    console.error(err);
-    console.error('Failed to run tests');
-    process.exit(1);
-}
-}
-
-main();
-
-function duplicate(sourceFolder: string, targetFolder: string) {
-
-if (!fs.existsSync(targetFolder)) {
-    fs.mkdirSync(targetFolder);
-}
-
-const content = fs.readdirSync(sourceFolder);
-
-content.forEach((element) => {
-    const sourcePath = path.join(sourceFolder, element);
-    const targetPath = path.join(targetFolder, element);
-
-    if (fs.lstatSync(sourcePath).isDirectory()) {
-        duplicate(sourcePath, targetPath);
-    } else {
-        fs.copyFileSync(sourcePath, targetPath);
-    }
-});
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import { downloadAndUnzipVSCode,
+    runTests 
+} from '@vscode/test-electron';
+import * as path from 'path';
+import * as fs from 'fs';
+
+
+
+
+async function main() {
+try {
+    // The folder containing the Extension Manifest package.json
+    // Passed to `--extensionDevelopmentPath`
+    const extensionDevelopmentPath = path.resolve(__dirname, '../../');
+
+    // The path to the extension test runner script
+    // Passed to --extensionTestsPath
+    const extensionTestsPath = path.resolve(__dirname, './suite/index');
+
+    // The path to the test project 
+    const testWorkspace = path.resolve(__dirname, '../../fixtures/test projects/demo');
+
+    // Manually download latest stable VS Code release for testing.
+    const vscodeExecutablePath = await downloadAndUnzipVSCode('1.89.0'); 
+
+    const outputFolder = path.resolve(__dirname, '../../output');
+
+    if (!fs.existsSync(outputFolder)) {   
+        fs.mkdirSync(outputFolder);
+    }
+
+    const noSpacePath = path.resolve(__dirname, '../../.vscode-test');
+    const spacePath = path.resolve(__dirname, '../../output/a vscode-test');
+    const splitPath = vscodeExecutablePath.split('\\');
+    const exeFile = splitPath.pop();
+    const vscodeFolder = splitPath.pop();
+
+    let newVscodeExecutablePath: string = vscodeExecutablePath;
+    if (vscodeFolder && exeFile) {
+        newVscodeExecutablePath = path.join(spacePath, vscodeFolder, exeFile);
+    }
+    
+    if (!fs.existsSync(spacePath)) {
+        duplicate(noSpacePath, spacePath);
+    }
+
+    await runTests({
+        vscodeExecutablePath: newVscodeExecutablePath,
+        extensionDevelopmentPath, 
+        extensionTestsPath,
+        launchArgs: [testWorkspace]
+    });
+
+} catch (err) {
+    console.error(err);
+    console.error('Failed to run tests');
+    process.exit(1);
+}
+}
+
+main();
+
+function duplicate(sourceFolder: string, targetFolder: string) {
+
+if (!fs.existsSync(targetFolder)) {
+    fs.mkdirSync(targetFolder);
+}
+
+const content = fs.readdirSync(sourceFolder);
+
+content.forEach((element) => {
+    const sourcePath = path.join(sourceFolder, element);
+    const targetPath = path.join(targetFolder, element);
+
+    if (fs.lstatSync(sourcePath).isDirectory()) {
+        duplicate(sourcePath, targetPath);
+    } else {
+        fs.copyFileSync(sourcePath, targetPath);
+    }
+});
 }
\ No newline at end of file
diff -pruN 2.1.10-1/integrations/vscode/src/test/suite/utils.ts 2.2-1/integrations/vscode/src/test/suite/utils.ts
--- 2.1.10-1/integrations/vscode/src/test/suite/utils.ts	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/src/test/suite/utils.ts	2025-04-17 09:07:34.000000000 +0000
@@ -1,157 +1,157 @@
-/*
- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import { downloadLatestVisualVM, getReleaseMetadata } from '../../download';
-import * as cp from 'child_process';
-import * as vscode from 'vscode';
-import * as assert from 'assert';
-import * as path from 'path';
-import * as fs from 'fs';
-
-
-
-export async function setupSelectEnvironment() {
-
-    // Before download check
-    const releaseMetadata = await getReleaseMetadata();
-    assert(releaseMetadata, 'No release meta data found.');
-
-    const outputPath = path.resolve(__dirname, '../../../output');
-    const dirPath = path.join(outputPath, 'visualvm-test');
-    const firstSubDirPath = path.join(outputPath, 'visualvm-test', 'version 1');
-    const secondSubDirPath = path.join(outputPath, 'visualvm-test', 'version 2');
-
-    await fs.promises.mkdir(dirPath);
-    await fs.promises.mkdir(firstSubDirPath);
-    await fs.promises.mkdir(secondSubDirPath);
-
-    const firstFinalPath : string = vscode.Uri.file(firstSubDirPath).fsPath;
-    const secondFinalPath : string = vscode.Uri.file(secondSubDirPath).fsPath;
-
-    const firstReturnPath = await downloadLatestVisualVM(firstFinalPath);
-    assert(firstReturnPath, 'VisualVM download failed');
-    const secondReturnPath = await downloadLatestVisualVM(secondFinalPath);
-    assert(secondReturnPath, 'VisualVM download failed');
-
-    const returnPaths = {
-        'dirPath': dirPath,
-        'firstReturnPath' : firstReturnPath,
-        'secondReturnPath' : secondReturnPath
-    };
-
-    return returnPaths;
-}
-
-export async function clean(yourPath: string) {
-
-    try{
-        await fs.promises.rm(yourPath, { recursive: true });
-    } catch (error) {
-        console.error(`Can't delete directory: ${error}`);
-    }
-
-}
-
-export async function installExtensions(): Promise<void> {
-    const redhatPath = path.resolve(__dirname, '../../../.vscode-test/extensions/redhat.java*');
-    const nblsPath = path.resolve(__dirname, '../../../.vscode-test/extensions/asf.apache-netbeans-java*');
-
-    const redhat = fs.existsSync(redhatPath);
-    const nbls = fs.existsSync(nblsPath);
-
-    if ( !redhat ) {
-        try {
-                await vscode.commands.executeCommand('workbench.extensions.installExtension', 'redhat.java');
-        } catch (error) {
-            console.error('Can\'t install Redhat Java extension: ', error);
-        }
-    }
-    if ( !nbls ) {
-        try {
-                await vscode.commands.executeCommand('workbench.extensions.installExtension', 'asf.apache-netbeans-java');
-        } catch (error) {
-            console.error('Can\'t install Netbeans Language Server extension: ', error);
-        }
-    }
-
-    await waitForExtensionsToFinish();
-
-}
-
-async function waitForExtensionsToFinish(): Promise<void> {
-    return new Promise<void>((resolve) => {
-
-        const interval = setInterval(() => {
-            const nblsExtension = vscode.extensions.getExtension('asf.apache-netbeans-java');
-            const redhatExtension = vscode.extensions.getExtension('redhat.java');
-
-            if (nblsExtension && redhatExtension) {
-                clearInterval(interval);
-                resolve();
-            }
-        }, 20000);
-    });
-}
-
-export function duplicate(sourceFolder: string, targetFolder: string) {
-
-    if (!fs.existsSync(targetFolder)) {
-        fs.mkdirSync(targetFolder);
-    }
-
-    const content = fs.readdirSync(sourceFolder);
-
-    content.forEach((element) => {
-        const sourcePath = path.join(sourceFolder, element);
-        const targetPath = path.join(targetFolder, element);
-
-        if (fs.lstatSync(sourcePath).isDirectory()) {
-            duplicate(sourcePath, targetPath);
-        } else {
-            fs.copyFileSync(sourcePath, targetPath);
-        }
-    });
-}
-
-
-export async function buildJavaProject (pathToProject: string) {
-    // Check maven existence    
-    cp.exec('mvn -v', (error) => {
-        if (error) {
-            console.error(`Check MAVEN installation :: Error checking Maven installation: ${error.message}`);
-        }
-    });
-    return new Promise<void> ((resolve, reject) => {
-        cp.exec('mvn clean install', { cwd: pathToProject }, (error) => {
-            if (error) {
-                console.log(`Error executing Maven build: ${error.message}`);
-                reject(error);
-                return;
-            }
-            resolve();
-        });
-    });
-}
-
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import { downloadLatestVisualVM, getReleaseMetadata } from '../../download';
+import * as cp from 'child_process';
+import * as vscode from 'vscode';
+import * as assert from 'assert';
+import * as path from 'path';
+import * as fs from 'fs';
+
+
+
+export async function setupSelectEnvironment() {
+
+    // Before download check
+    const releaseMetadata = await getReleaseMetadata();
+    assert(releaseMetadata, 'No release meta data found.');
+
+    const outputPath = path.resolve(__dirname, '../../../output');
+    const dirPath = path.join(outputPath, 'visualvm-test');
+    const firstSubDirPath = path.join(outputPath, 'visualvm-test', 'version 1');
+    const secondSubDirPath = path.join(outputPath, 'visualvm-test', 'version 2');
+
+    await fs.promises.mkdir(dirPath);
+    await fs.promises.mkdir(firstSubDirPath);
+    await fs.promises.mkdir(secondSubDirPath);
+
+    const firstFinalPath : string = vscode.Uri.file(firstSubDirPath).fsPath;
+    const secondFinalPath : string = vscode.Uri.file(secondSubDirPath).fsPath;
+
+    const firstReturnPath = await downloadLatestVisualVM(firstFinalPath);
+    assert(firstReturnPath, 'VisualVM download failed');
+    const secondReturnPath = await downloadLatestVisualVM(secondFinalPath);
+    assert(secondReturnPath, 'VisualVM download failed');
+
+    const returnPaths = {
+        'dirPath': dirPath,
+        'firstReturnPath' : firstReturnPath,
+        'secondReturnPath' : secondReturnPath
+    };
+
+    return returnPaths;
+}
+
+export async function clean(yourPath: string) {
+
+    try{
+        await fs.promises.rm(yourPath, { recursive: true });
+    } catch (error) {
+        console.error(`Can't delete directory: ${error}`);
+    }
+
+}
+
+export async function installExtensions(): Promise<void> {
+    const redhatPath = path.resolve(__dirname, '../../../.vscode-test/extensions/redhat.java*');
+    const nblsPath = path.resolve(__dirname, '../../../.vscode-test/extensions/asf.apache-netbeans-java*');
+
+    const redhat = fs.existsSync(redhatPath);
+    const nbls = fs.existsSync(nblsPath);
+
+    if ( !redhat ) {
+        try {
+                await vscode.commands.executeCommand('workbench.extensions.installExtension', 'redhat.java');
+        } catch (error) {
+            console.error('Can\'t install Redhat Java extension: ', error);
+        }
+    }
+    if ( !nbls ) {
+        try {
+                await vscode.commands.executeCommand('workbench.extensions.installExtension', 'asf.apache-netbeans-java');
+        } catch (error) {
+            console.error('Can\'t install Netbeans Language Server extension: ', error);
+        }
+    }
+
+    await waitForExtensionsToFinish();
+
+}
+
+async function waitForExtensionsToFinish(): Promise<void> {
+    return new Promise<void>((resolve) => {
+
+        const interval = setInterval(() => {
+            const nblsExtension = vscode.extensions.getExtension('asf.apache-netbeans-java');
+            const redhatExtension = vscode.extensions.getExtension('redhat.java');
+
+            if (nblsExtension && redhatExtension) {
+                clearInterval(interval);
+                resolve();
+            }
+        }, 20000);
+    });
+}
+
+export function duplicate(sourceFolder: string, targetFolder: string) {
+
+    if (!fs.existsSync(targetFolder)) {
+        fs.mkdirSync(targetFolder);
+    }
+
+    const content = fs.readdirSync(sourceFolder);
+
+    content.forEach((element) => {
+        const sourcePath = path.join(sourceFolder, element);
+        const targetPath = path.join(targetFolder, element);
+
+        if (fs.lstatSync(sourcePath).isDirectory()) {
+            duplicate(sourcePath, targetPath);
+        } else {
+            fs.copyFileSync(sourcePath, targetPath);
+        }
+    });
+}
+
+
+export async function buildJavaProject (pathToProject: string) {
+    // Check maven existence    
+    cp.exec('mvn -v', (error) => {
+        if (error) {
+            console.error(`Check MAVEN installation :: Error checking Maven installation: ${error.message}`);
+        }
+    });
+    return new Promise<void> ((resolve, reject) => {
+        cp.exec('mvn clean install', { cwd: pathToProject }, (error) => {
+            if (error) {
+                console.log(`Error executing Maven build: ${error.message}`);
+                reject(error);
+                return;
+            }
+            resolve();
+        });
+    });
+}
+
diff -pruN 2.1.10-1/integrations/vscode/src/test/suite/visualvm.test.ts 2.2-1/integrations/vscode/src/test/suite/visualvm.test.ts
--- 2.1.10-1/integrations/vscode/src/test/suite/visualvm.test.ts	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/integrations/vscode/src/test/suite/visualvm.test.ts	2025-04-17 09:07:34.000000000 +0000
@@ -1,333 +1,333 @@
-/*
- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import { cpuSamplerStart, encode, getJdkSourceRoots, getTmpDir, getWorkspaceSourceRoots, goToSource, heapDump, jdkHome, jfrRecordingDump, jfrRecordingStart, jfrRecordingStop, memorySamplerStart, openPid, resolveSamplingFilter, samplerSnapshot, samplerStop, threadDump, vmArgDisplayName, vmArgId } from '../../parameters';
-import { buildJavaProject, clean,duplicate,installExtensions, setupSelectEnvironment } from './utils'; 
-import { getUsingJps } from '../../runningProcesses';
-import { getPath, getJpsPath } from '../../jdk';
-import { getSourceRoots } from '../../projectUtils';
-import { findLauncher } from '../../vscodeUtils';
-import { invoke, select} from '../../visualvm';
-import * as cp from 'child_process';
-import * as assert from 'assert';
-import * as vscode from 'vscode';
-import * as path from 'path';
-import * as fs from 'fs';
-
-
-// Get work space folders
-let wf = vscode.workspace.workspaceFolders;
-suite('VisualVm Suite Tests', function () {
-
-    // The timeout will propagate to setup dependencies and tests
-    this.timeout(1000000);
-
-    this.beforeAll(async () => {
-        this.timeout(1000000);
-        // Install NBLS & JDT   
-        await installExtensions();
-        // wait for build project
-        const projectPath = path.resolve(__dirname, '../../../fixtures/test projects/demo');
-        await buildJavaProject(projectPath);
-    });
-
-    let downloadPaths: { firstReturnPath: string; dirPath: string; secondReturnPath: string};
-    test('Select new visualvm done', async function () {
-
-        // Setup a test environment    
-        downloadPaths = await setupSelectEnvironment();
-        // Alter the path to which VisualVM is pointing
-        await select(downloadPaths.firstReturnPath);
-
-        // Get from vscode conf. the actual VisualVM path
-        const actualPath = vscode.workspace.getConfiguration().get<string>('visualvm.installation.visualvmPath');
-
-        // Check if the current path matches the expected path
-        assert.strictEqual(actualPath, downloadPaths.firstReturnPath);  
-    });
-
-    let jdk: string | undefined;
-    test('Prerequisites done', async function () {
-
-        // JDK configuration       
-        jdk = await jdkHome();
-        assert(jdk, 'no JDK available');
-
-        // Workspace and java project opened 
-        assert(wf, 'workspace not found');
-        assert(wf[0].uri.toString(), 'project not found');
-
-        // Source Roots resolved 
-        const sourceRoot = await getSourceRoots(wf[0]);
-        assert(sourceRoot, 'source root not found');
-
-    });
-
-    let testPid: number = 0; // pid of a test Java process
-    let visualvmPid: number = 0; // pid of a VisualVM process
-    test('Manually Selecting Project Process', async function () {
-
-        this.timeout(20000);
-
-        const projectPath = path.resolve(__dirname, '../../../fixtures/test projects/demo');
-
-        // Run Java Project
-        const TEST_JAVA_PROCESS_PARAMETER = '-Dtest.java.process=true';
-        try {
-            const jarFilePath = path.join(projectPath, 'oci/target/oci-1.0-SNAPSHOT.jar');
-            if (fs.existsSync(jarFilePath)) {
-                cp.spawn('java', [TEST_JAVA_PROCESS_PARAMETER, '-jar', 'oci/target/oci-1.0-SNAPSHOT.jar'], { cwd: projectPath });
-            } else {
-                assert(undefined, 'JAR File does not exist ... The build does not done correctly');
-            }
-        } catch (error) {
-            console.error('Error running JAR file:', error);
-        }
-
-        // Wait for the test process to fully start
-        await new Promise(f => setTimeout(f, 1500));
-
-        const jdkPath = await getPath(false);
-        assert(jdkPath, 'no JDK available');
-        const jpsPath = getJpsPath(jdkPath);
-        assert(jpsPath, 'no jps available');
-        const processes = await getUsingJps(jpsPath);
-        assert(processes, 'Can\'t get running java processes');
-
-        let isProcessExist: boolean = false;
-        for (const process of processes) {
-            if (process.displayName.includes(TEST_JAVA_PROCESS_PARAMETER)) {
-                isProcessExist = true;
-                testPid = process.pid;
-                break;
-            }
-        }
-        assert.strictEqual(isProcessExist, true, 'Java test process not found !');
-    });
-
-    test('CPU Sampler Configuration Correctly Generated', async () => {
-        assert(wf);
-        const projectClasses = await resolveSamplingFilter('include-classes', wf[0]);
-        assert(projectClasses, 'Any project classes resolved');
-        const samplingRateP = `sampling-rate=1000`;
-        const suffix = '--start-cpu-sampler '+testPid+'@';
-
-        const withoutFile = projectClasses+','+samplingRateP;
-        const expectedParameterWithoutFile = suffix+withoutFile;
-
-        const tmp = getTmpDir();
-        assert(tmp, 'Can\'t get tmp directory');
-        const confFile = path.join(tmp, 'visualvm-sampler-config');
-        assert(confFile);
-        const withFile = `settings-file="${confFile}"`;
-        const expectedParameterWithFile = `${suffix+withFile}`;
-
-        // cases : exclude-classes - include-classes - default
-        const visualvmParameter = await cpuSamplerStart(testPid, 'include-classes', 1000, wf[0]);
-
-        assert(visualvmParameter, 'CPU Sampler can\'t start');
-
-        if (projectClasses.length + samplingRateP.length > 200) {
-            assert.strictEqual(visualvmParameter, expectedParameterWithFile);
-        } else {
-            assert.strictEqual(visualvmParameter, expectedParameterWithoutFile);
-        }
-    });
-
-    test('Go to Source Configuration Correctly Generated', async () => {
-        assert(wf);
-
-        const jdkSourceRoot = await getJdkSourceRoots();
-        assert(jdkSourceRoot, 'Can\'t get jdk source roots');
-
-        const workspaceSourceRoots = await getWorkspaceSourceRoots(wf[0]);
-        assert(workspaceSourceRoots, 'Can\'t get work space source roots');
-        workspaceSourceRoots.push(jdkSourceRoot);
-
-        const launcher = findLauncher();
-        assert(launcher, 'Can\'t found vs code launcher');
-        const vsCodeLauncherParameters = vscode.workspace.getConfiguration().get<string>('visualvm.integration.visualStudioCodeParameters', '');
-        
-        let firstParamName: string = '';
-        let secondParamName: string = '';
-
-        const params = vsCodeLauncherParameters ? ' ' + vsCodeLauncherParameters : '';
-        const sourceRouts = workspaceSourceRoots.join(path.delimiter);
-        const notFinalSourceViewer = `=${encode(`${launcher}${params}`)} -g {file}:{line}:{column}`;
-        const notFinalSourceRoots = `=${sourceRouts}`;
-
-        let expectedParameters: string = '';
-        let finalSourceRoots: string = '';
-        let finalSourceViewer: string = '';
-
-        // invoke go to source
-        const parameters = await goToSource(wf[0]);
-        assert(parameters);
-
-        if (notFinalSourceViewer.length + notFinalSourceRoots.length > 201) {
-            firstParamName = 'source-viewer';
-            secondParamName = 'source-roots';
-            finalSourceRoots = secondParamName+notFinalSourceRoots.replace(/\\/g, '\\\\') + '\n';
-            finalSourceViewer = firstParamName+notFinalSourceViewer.replace(/\\/g, '\\\\') + '\n';
-            expectedParameters = finalSourceViewer+finalSourceRoots;
-
-            const tmp = getTmpDir();
-            assert(tmp, 'Can\'t get tmp directory');
-            const confFile = path.join(tmp, 'visualvm-source-config');
-            assert(confFile);
-            const expectedReturn = `--source-config="${encode(confFile)}"`;
-            assert.strictEqual(expectedReturn, parameters);
-            
-            let contentOfFile = fs.readFileSync(confFile, 'utf8');
-            assert.strictEqual(expectedParameters, contentOfFile, 'parameters not set correctly');
-        } else {
-            firstParamName = '--source-viewer';
-            secondParamName = '--source-roots';
-            expectedParameters = `${firstParamName}${notFinalSourceViewer} ${secondParamName}${notFinalSourceRoots}`;
-
-            assert(expectedParameters ,parameters);
-        }
-    });
-
-    test('Test open process', () => {
-        const parameter = openPid(testPid);
-        assert.strictEqual(parameter, `--openpid ${testPid.toString()}@2`, 'Test open process failed');
-    });
-
-    test('Test thread Dump', () => {
-        const parameter = threadDump(testPid);
-        assert.strictEqual(parameter, `--threaddump ${testPid.toString()}`, 'Test thread Dump failed');
-    });
-
-    test('Test heap Dump', () => {
-        const parameter = heapDump(testPid);
-        assert.strictEqual(parameter, `--heapdump ${testPid.toString()}`, 'Test heap Dump failed');
-    });
-
-    test('Test memory Sampler Start', () => {
-        const parameter = memorySamplerStart(testPid, 2000);
-        assert.strictEqual(parameter, `--start-memory-sampler ${testPid}@sampling-rate=2000`, 'Test memory Sampler Start failed');
-    });
-
-    test('Test sampler Snapshot', () => {
-        const parameter = samplerSnapshot(testPid);
-        assert.strictEqual(parameter, `--snapshot-sampler ${testPid.toString()}`, 'Test sampler Snapshot failed');
-    });
-
-    test('Test sampler Stop', () => {
-        const parameter = samplerStop(testPid);
-        assert.strictEqual(parameter, `--stop-sampler ${testPid.toString()}`, 'Test sampler Stop failed');
-    });
-
-    test('Test jfr Recording Start', () => {
-        const parameter = jfrRecordingStart(testPid, 'my jfr', 'profile1');
-        assert.strictEqual(parameter, `--start-jfr ${testPid.toString()}@name=my%20jfr,settings=profile1`, 'Test jfr Recording Start failed');
-    });
-
-    test('Test jfr Recording Dump', () => {
-        const parameter = jfrRecordingDump(testPid);
-        assert.strictEqual(parameter, `--dump-jfr ${testPid.toString()}`, 'Test jfr Recording Dump failed');
-    });
-
-    test('Test jfr Recording Stop', () => {
-        const parameter = jfrRecordingStop(testPid);
-        assert.strictEqual(parameter, `--stop-jfr ${testPid.toString()}`, 'Test jfr Recording Stop failed');
-    });
-
-    test('Test vmArg Id', () => {
-        const parameter = vmArgId('Java_ID');
-        assert.strictEqual(parameter, `-Dvisualvm.id=Java_ID`, 'Test vmArg Id failed');
-    });
-
-    test('Test vmArg Display Name', () => {
-        const parameter = vmArgDisplayName('Java Process');
-        assert.strictEqual(parameter, `-Dvisualvm.display.name=Java_Process%PID`, 'Test vmArg Display Name failed');
-    });
-
-    test('Space in Home JDK path Then invoke', async () => {
-
-        let homeJdkPath = process.env['JAVA_HOME'];
-        if (!homeJdkPath) {
-            homeJdkPath = process.env['JDK_HOME'];
-        }
-        assert(homeJdkPath, 'JDK Home not Configured in your machine');
-        const spaceMockPath = path.resolve(__dirname, '../../../output/space JDK');
-
-        if (!fs.existsSync(spaceMockPath)) {
-            duplicate(homeJdkPath, spaceMockPath);
-        }
-
-        const spacePath =  await jdkHome(spaceMockPath);
-        assert.strictEqual(spacePath, `--jdkhome "${spaceMockPath}"`);
-
-
-        assert(wf);
-        
-        const TEST_VISUALVM_PROCESS_PARAMETER = '-Dvisualvm.test.process=true';
-        const isShow = await invoke(`-J${TEST_VISUALVM_PROCESS_PARAMETER}`, wf[0], spaceMockPath);
-        if (isShow) {
-            await new Promise(f => setTimeout(f, 3000));
-
-            const jdkPath = await getPath(false);
-            assert(jdkPath, 'no JDK available');
-            const jpsPath = getJpsPath(jdkPath);
-            assert(jpsPath, 'no jps available');
-            const processes = await getUsingJps(jpsPath);
-            assert(processes, 'Can\'t get running java processes');
-
-            for (const process of processes) {
-                if (process.displayName.includes(TEST_VISUALVM_PROCESS_PARAMETER)) {
-                    visualvmPid = process.pid;
-                    break;
-                }
-            }
-        }
-
-        assert.strictEqual(isShow && !!visualvmPid, true, 'VisualVM can\'t started');
-    });
-
-
-    this.afterAll(async () => {
-        this.timeout(15000);
-        if (testPid) {
-            try {
-                process.kill(testPid);
-            } catch (err) {
-                console.log(`Failed to kill test process PID=${testPid}: ${err}`)
-            }
-        }
-        if (visualvmPid) {
-            try {
-                process.kill(visualvmPid);
-            } catch (err) {
-                console.log(`Failed to kill visualvm process PID=${visualvmPid}: ${err}`)
-            }
-        }
-        // Wait for a while to have all resources released before the final cleanup
-        await new Promise(f => setTimeout(f, 3000));
-        // Clean the test installations
-        await clean(downloadPaths.dirPath);
-    });
-});
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import { cpuSamplerStart, encode, getJdkSourceRoots, getTmpDir, getWorkspaceSourceRoots, goToSource, heapDump, jdkHome, jfrRecordingDump, jfrRecordingStart, jfrRecordingStop, memorySamplerStart, openPid, resolveSamplingFilter, samplerSnapshot, samplerStop, threadDump, vmArgDisplayName, vmArgId } from '../../parameters';
+import { buildJavaProject, clean,duplicate,installExtensions, setupSelectEnvironment } from './utils'; 
+import { getUsingJps } from '../../runningProcesses';
+import { getPath, getJpsPath } from '../../jdk';
+import { getSourceRoots } from '../../projectUtils';
+import { findLauncher } from '../../vscodeUtils';
+import { invoke, select} from '../../visualvm';
+import * as cp from 'child_process';
+import * as assert from 'assert';
+import * as vscode from 'vscode';
+import * as path from 'path';
+import * as fs from 'fs';
+
+
+// Get work space folders
+let wf = vscode.workspace.workspaceFolders;
+suite('VisualVM Suite Tests', function () {
+
+    // The timeout will propagate to setup dependencies and tests
+    this.timeout(1000000);
+
+    this.beforeAll(async () => {
+        this.timeout(1000000);
+        // Install NBLS & JDT   
+        await installExtensions();
+        // wait for build project
+        const projectPath = path.resolve(__dirname, '../../../fixtures/test projects/demo');
+        await buildJavaProject(projectPath);
+    });
+
+    let downloadPaths: { firstReturnPath: string; dirPath: string; secondReturnPath: string};
+    test('Select new visualvm done', async function () {
+
+        // Setup a test environment    
+        downloadPaths = await setupSelectEnvironment();
+        // Alter the path to which VisualVM is pointing
+        await select(downloadPaths.firstReturnPath);
+
+        // Get from vscode conf. the actual VisualVM path
+        const actualPath = vscode.workspace.getConfiguration().get<string>('visualvm.installation.visualvmPath');
+
+        // Check if the current path matches the expected path
+        assert.strictEqual(actualPath, downloadPaths.firstReturnPath);  
+    });
+
+    let jdk: string | undefined;
+    test('Prerequisites done', async function () {
+
+        // JDK configuration       
+        jdk = await jdkHome();
+        assert(jdk, 'no JDK available');
+
+        // Workspace and java project opened 
+        assert(wf, 'workspace not found');
+        assert(wf[0].uri.toString(), 'project not found');
+
+        // Source Roots resolved 
+        const sourceRoot = await getSourceRoots(wf[0]);
+        assert(sourceRoot, 'source root not found');
+
+    });
+
+    let testPid: number = 0; // pid of a test Java process
+    let visualvmPid: number = 0; // pid of a VisualVM process
+    test('Manually Selecting Project Process', async function () {
+
+        this.timeout(20000);
+
+        const projectPath = path.resolve(__dirname, '../../../fixtures/test projects/demo');
+
+        // Run Java Project
+        const TEST_JAVA_PROCESS_PARAMETER = '-Dtest.java.process=true';
+        try {
+            const jarFilePath = path.join(projectPath, 'oci/target/oci-1.0-SNAPSHOT.jar');
+            if (fs.existsSync(jarFilePath)) {
+                cp.spawn('java', [TEST_JAVA_PROCESS_PARAMETER, '-jar', 'oci/target/oci-1.0-SNAPSHOT.jar'], { cwd: projectPath });
+            } else {
+                assert(undefined, 'JAR File does not exist ... The build does not done correctly');
+            }
+        } catch (error) {
+            console.error('Error running JAR file:', error);
+        }
+
+        // Wait for the test process to fully start
+        await new Promise(f => setTimeout(f, 1500));
+
+        const jdkPath = await getPath(false);
+        assert(jdkPath, 'no JDK available');
+        const jpsPath = getJpsPath(jdkPath);
+        assert(jpsPath, 'no jps available');
+        const processes = await getUsingJps(jpsPath);
+        assert(processes, 'Can\'t get running java processes');
+
+        let isProcessExist: boolean = false;
+        for (const process of processes) {
+            if (process.displayName.includes(TEST_JAVA_PROCESS_PARAMETER)) {
+                isProcessExist = true;
+                testPid = process.pid;
+                break;
+            }
+        }
+        assert.strictEqual(isProcessExist, true, 'Java test process not found !');
+    });
+
+    test('CPU Sampler Configuration Correctly Generated', async () => {
+        assert(wf);
+        const projectClasses = await resolveSamplingFilter('include-classes', wf[0]);
+        assert(projectClasses, 'Any project classes resolved');
+        const samplingRateP = `sampling-rate=1000`;
+        const suffix = '--start-cpu-sampler '+testPid+'@';
+
+        const withoutFile = projectClasses+','+samplingRateP;
+        const expectedParameterWithoutFile = suffix+withoutFile;
+
+        const tmp = getTmpDir();
+        assert(tmp, 'Can\'t get tmp directory');
+        const confFile = path.join(tmp, 'visualvm-sampler-config');
+        assert(confFile);
+        const withFile = `settings-file="${confFile}"`;
+        const expectedParameterWithFile = `${suffix+withFile}`;
+
+        // cases : exclude-classes - include-classes - default
+        const visualvmParameter = await cpuSamplerStart(testPid, 'include-classes', 1000, wf[0]);
+
+        assert(visualvmParameter, 'CPU Sampler can\'t start');
+
+        if (projectClasses.length + samplingRateP.length > 200) {
+            assert.strictEqual(visualvmParameter, expectedParameterWithFile);
+        } else {
+            assert.strictEqual(visualvmParameter, expectedParameterWithoutFile);
+        }
+    });
+
+    test('Go to Source Configuration Correctly Generated', async () => {
+        assert(wf);
+
+        const jdkSourceRoot = await getJdkSourceRoots();
+        assert(jdkSourceRoot, 'Can\'t get jdk source roots');
+
+        const workspaceSourceRoots = await getWorkspaceSourceRoots(wf[0]);
+        assert(workspaceSourceRoots, 'Can\'t get work space source roots');
+        workspaceSourceRoots.push(jdkSourceRoot);
+
+        const launcher = findLauncher();
+        assert(launcher, 'Can\'t found vs code launcher');
+        const vsCodeLauncherParameters = vscode.workspace.getConfiguration().get<string>('visualvm.integration.visualStudioCodeParameters', '');
+        
+        let firstParamName: string = '';
+        let secondParamName: string = '';
+
+        const params = vsCodeLauncherParameters ? ' ' + vsCodeLauncherParameters : '';
+        const sourceRouts = workspaceSourceRoots.join(path.delimiter);
+        const notFinalSourceViewer = `=${encode(`${launcher}${params}`)} -g {file}:{line}:{column}`;
+        const notFinalSourceRoots = `=${sourceRouts}`;
+
+        let expectedParameters: string = '';
+        let finalSourceRoots: string = '';
+        let finalSourceViewer: string = '';
+
+        // invoke go to source
+        const parameters = await goToSource(wf[0]);
+        assert(parameters);
+
+        if (notFinalSourceViewer.length + notFinalSourceRoots.length > 201) {
+            firstParamName = 'source-viewer';
+            secondParamName = 'source-roots';
+            finalSourceRoots = secondParamName+notFinalSourceRoots.replace(/\\/g, '\\\\') + '\n';
+            finalSourceViewer = firstParamName+notFinalSourceViewer.replace(/\\/g, '\\\\') + '\n';
+            expectedParameters = finalSourceViewer+finalSourceRoots;
+
+            const tmp = getTmpDir();
+            assert(tmp, 'Can\'t get tmp directory');
+            const confFile = path.join(tmp, 'visualvm-source-config');
+            assert(confFile);
+            const expectedReturn = `--source-config="${encode(confFile)}"`;
+            assert.strictEqual(expectedReturn, parameters);
+            
+            let contentOfFile = fs.readFileSync(confFile, 'utf8');
+            assert.strictEqual(expectedParameters, contentOfFile, 'parameters not set correctly');
+        } else {
+            firstParamName = '--source-viewer';
+            secondParamName = '--source-roots';
+            expectedParameters = `${firstParamName}${notFinalSourceViewer} ${secondParamName}${notFinalSourceRoots}`;
+
+            assert(expectedParameters ,parameters);
+        }
+    });
+
+    test('Test open process', () => {
+        const parameter = openPid(testPid);
+        assert.strictEqual(parameter, `--openpid ${testPid.toString()}@2`, 'Test open process failed');
+    });
+
+    test('Test thread Dump', () => {
+        const parameter = threadDump(testPid);
+        assert.strictEqual(parameter, `--threaddump ${testPid.toString()}`, 'Test thread Dump failed');
+    });
+
+    test('Test heap Dump', () => {
+        const parameter = heapDump(testPid);
+        assert.strictEqual(parameter, `--heapdump ${testPid.toString()}`, 'Test heap Dump failed');
+    });
+
+    test('Test memory Sampler Start', () => {
+        const parameter = memorySamplerStart(testPid, 2000);
+        assert.strictEqual(parameter, `--start-memory-sampler ${testPid}@sampling-rate=2000`, 'Test memory Sampler Start failed');
+    });
+
+    test('Test sampler Snapshot', () => {
+        const parameter = samplerSnapshot(testPid);
+        assert.strictEqual(parameter, `--snapshot-sampler ${testPid.toString()}`, 'Test sampler Snapshot failed');
+    });
+
+    test('Test sampler Stop', () => {
+        const parameter = samplerStop(testPid);
+        assert.strictEqual(parameter, `--stop-sampler ${testPid.toString()}`, 'Test sampler Stop failed');
+    });
+
+    test('Test jfr Recording Start', () => {
+        const parameter = jfrRecordingStart(testPid, 'my jfr', 'profile1');
+        assert.strictEqual(parameter, `--start-jfr ${testPid.toString()}@name=my%20jfr,settings=profile1`, 'Test jfr Recording Start failed');
+    });
+
+    test('Test jfr Recording Dump', () => {
+        const parameter = jfrRecordingDump(testPid);
+        assert.strictEqual(parameter, `--dump-jfr ${testPid.toString()}`, 'Test jfr Recording Dump failed');
+    });
+
+    test('Test jfr Recording Stop', () => {
+        const parameter = jfrRecordingStop(testPid);
+        assert.strictEqual(parameter, `--stop-jfr ${testPid.toString()}`, 'Test jfr Recording Stop failed');
+    });
+
+    test('Test vmArg Id', () => {
+        const parameter = vmArgId('Java_ID');
+        assert.strictEqual(parameter, `-Dvisualvm.id=Java_ID`, 'Test vmArg Id failed');
+    });
+
+    test('Test vmArg Display Name', () => {
+        const parameter = vmArgDisplayName('Java Process');
+        assert.strictEqual(parameter, `-Dvisualvm.display.name=Java_Process%PID`, 'Test vmArg Display Name failed');
+    });
+
+    test('Space in Home JDK path Then invoke', async () => {
+
+        let homeJdkPath = process.env['JAVA_HOME'];
+        if (!homeJdkPath) {
+            homeJdkPath = process.env['JDK_HOME'];
+        }
+        assert(homeJdkPath, 'JDK Home not Configured in your machine');
+        const spaceMockPath = path.resolve(__dirname, '../../../output/space JDK');
+
+        if (!fs.existsSync(spaceMockPath)) {
+            duplicate(homeJdkPath, spaceMockPath);
+        }
+
+        const spacePath =  await jdkHome(spaceMockPath);
+        assert.strictEqual(spacePath, `--jdkhome "${spaceMockPath}"`);
+
+
+        assert(wf);
+        
+        const TEST_VISUALVM_PROCESS_PARAMETER = '-Dvisualvm.test.process=true';
+        const isShow = await invoke(`-J${TEST_VISUALVM_PROCESS_PARAMETER}`, wf[0], spaceMockPath);
+        if (isShow) {
+            await new Promise(f => setTimeout(f, 3000));
+
+            const jdkPath = await getPath(false);
+            assert(jdkPath, 'no JDK available');
+            const jpsPath = getJpsPath(jdkPath);
+            assert(jpsPath, 'no jps available');
+            const processes = await getUsingJps(jpsPath);
+            assert(processes, 'Can\'t get running java processes');
+
+            for (const process of processes) {
+                if (process.displayName.includes(TEST_VISUALVM_PROCESS_PARAMETER)) {
+                    visualvmPid = process.pid;
+                    break;
+                }
+            }
+        }
+
+        assert.strictEqual(isShow && !!visualvmPid, true, 'VisualVM can\'t started');
+    });
+
+
+    this.afterAll(async () => {
+        this.timeout(15000);
+        if (testPid) {
+            try {
+                process.kill(testPid);
+            } catch (err) {
+                console.log(`Failed to kill test process PID=${testPid}: ${err}`)
+            }
+        }
+        if (visualvmPid) {
+            try {
+                process.kill(visualvmPid);
+            } catch (err) {
+                console.log(`Failed to kill visualvm process PID=${visualvmPid}: ${err}`)
+            }
+        }
+        // Wait for a while to have all resources released before the final cleanup
+        await new Promise(f => setTimeout(f, 3000));
+        // Clean the test installations
+        await clean(downloadPaths.dirPath);
+    });
+});
diff -pruN 2.1.10-1/plugins/buffermonitor/nbproject/project.properties 2.2-1/plugins/buffermonitor/nbproject/project.properties
--- 2.1.10-1/plugins/buffermonitor/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/buffermonitor/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/plugins/extensions/nbproject/project.properties 2.2-1/plugins/extensions/nbproject/project.properties
--- 2.1.10-1/plugins/extensions/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/extensions/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/plugins/jconsole/nbproject/project.properties 2.2-1/plugins/jconsole/nbproject/project.properties
--- 2.1.10-1/plugins/jconsole/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/jconsole/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/plugins/jfr.streaming/manifest.mf 2.2-1/plugins/jfr.streaming/manifest.mf
--- 2.1.10-1/plugins/jfr.streaming/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/jfr.streaming/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -4,4 +4,4 @@ OpenIDE-Module: org.graalvm.visualvm.jfr
 OpenIDE-Module-Install: org/graalvm/visualvm/jfr/streaming/Installer.class
 OpenIDE-Module-Java-Dependencies: Java > 17
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/jfr/streaming/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.5
+OpenIDE-Module-Specification-Version: 1.6
diff -pruN 2.1.10-1/plugins/jfr.streaming/src/org/graalvm/visualvm/jfr/streaming/JFRStream.java 2.2-1/plugins/jfr.streaming/src/org/graalvm/visualvm/jfr/streaming/JFRStream.java
--- 2.1.10-1/plugins/jfr.streaming/src/org/graalvm/visualvm/jfr/streaming/JFRStream.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/jfr.streaming/src/org/graalvm/visualvm/jfr/streaming/JFRStream.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,7 @@ public class JFRStream {
         if (isJavaVersion(ver, "17") || isJavaVersion(ver, "18") 
          || isJavaVersion(ver, "19") || isJavaVersion(ver, "20")
          || isJavaVersion(ver, "21") || isJavaVersion(ver, "22")
-         || isJavaVersion(ver, "23")) {
+         || isJavaVersion(ver, "23") || isJavaVersion(ver, "24")) {
             JmxModel jmxModel = JmxModelFactory.getJmxModelFor(app);
             if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
                 return new JFRStream(jmxModel);
diff -pruN 2.1.10-1/plugins/jolokia/build.xml 2.2-1/plugins/jolokia/build.xml
--- 2.1.10-1/plugins/jolokia/build.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/build.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="org.graalvm.visualvm.modules.jolokia" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project org.graalvm.visualvm.modules.jolokia.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <target name="download-all-extbins" unless="ext.binaries.downloaded" depends="init">
+      <echo>Downloading external binaries (external/ directory)...</echo>
+      <property name="binaries.cache" location="${user.home}/.hgexternalcache"/>
+      <property name="binaries.server" value="https://netbeans.osuosl.org/binaries/"/>
+      <downloadbinaries cache="${binaries.cache}" server="${binaries.server}" >
+          <manifest dir=".">
+              <include name="external/binaries-list"/>
+          </manifest>
+      </downloadbinaries>
+      <property name="ext.binaries.downloaded" value="true"/>
+    </target>
+
+    <target name="-pre-compile" depends="download-all-extbins">      
+    </target>
+
+    <target name="-pre-release" depends="compile">
+        <taskdef name="releasefilescopy" classname="org.netbeans.nbbuild.extlibs.ReleaseFilesCopy" classpath="${harness.dir}/tasks.jar"/>
+        <releasefilescopy cluster="${cluster}"/>
+    </target>
+
+    <target name="-release.files" depends="projectized-common.-release.files">
+        <taskdef name="releasefilesextra" classname="org.netbeans.nbbuild.extlibs.ReleaseFilesExtra" classpath="${harness.dir}/tasks.jar"/>
+        <releasefilesextra property="release.files.extra"/>
+    </target>
+
+    <target name="-pre-nbm" depends="compile">
+      <property name="license.file.override" location="${build.dir}/license"/>
+      <property name="extra.license.files" value=""/>
+      <taskdef name="releasefileslicense" classname="org.netbeans.nbbuild.extlibs.ReleaseFilesLicense" classpath="${harness.dir}/tasks.jar"/>
+      <releasefileslicense license="${license.file.override}" standardlicense="${license.file}" extralicensefiles="${extra.license.files}"/>
+    </target>
+</project>
diff -pruN 2.1.10-1/plugins/jolokia/external/binaries-list 2.2-1/plugins/jolokia/external/binaries-list
--- 2.1.10-1/plugins/jolokia/external/binaries-list	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/binaries-list	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,48 @@
+A8F24794CF3ABCBB54A2173EA11A45C80544EC75 org.jolokia:jolokia-client-jmx-adapter:2.2.2
+27A76E0BDDEB96DDD14BE07189B3BF3BD0E2764F org.jolokia:jolokia-client-java:2.2.2
+86CC1DAFC21A7214EEC1A3BB6910C865C378EC0A org.jolokia:jolokia-json:2.2.2
+1BC42013E50B0065503821FD1FAD3D9B5C6FB9EB org.jolokia:jolokia-server-core:2.2.2
+28D7DB48D69AAC91CD55CB914371044AC5A83910 org.jolokia:jolokia-service-serializer:2.2.2
+1194890E6F56EC29177673F2F12D0B8E627DEC98 org.apache.httpcomponents:httpclient:4.5.14
+51CF043C87253C9F58B539C9F7E44C8894223850 org.apache.httpcomponents:httpcore:4.4.16
+B9FC14968D63A8B8A8A2C1885FE3E90564239708 commons-logging:commons-logging:1.3.4
+973638B7149D333563584137EBF13A691BB60579 commons-codec:commons-codec:1.17.1
+6C525AFAE116416E5EA3D02FAA70BBA833CF7178 org.jolokia:jolokia-client-kubernetes:2.2.2
+2AA2FC58356CDCEA1C9C23B0F4A58EAF147B973C io.fabric8:kubernetes-client:6.13.4
+5BCBB03DEB72DC59AE8F504207CB85B212B6E3F8 io.fabric8:kubernetes-client-api:6.13.4
+9BB4038F7206BEAC6243FC603D7D8913F47064CE io.fabric8:kubernetes-model-core:6.13.4
+7926CDB2A27C4517F67A57E84B0FDC52321BB881 io.fabric8:kubernetes-model-common:6.13.4
+CA25C2F0E58571D4ED3F44B85EAEEFC006F39BC9 io.fabric8:kubernetes-model-gatewayapi:6.13.4
+06D5724E29416153D3AA4F5EFA2DFBDB308C9416 io.fabric8:kubernetes-model-resource:6.13.4
+BC68CC9AD92E3E6B48ACF518885B07AA94B5ADCF io.fabric8:kubernetes-model-rbac:6.13.4
+81526FAD72FF4E9B633AD9763021E4180EEC7BD5 io.fabric8:kubernetes-model-admissionregistration:6.13.4
+B8535726E5DE504086E7DAC2C775C24A1CD1A272 io.fabric8:kubernetes-model-apps:6.13.4
+14672963E19477F584FB632A2DAF4CBB676AEDE4 io.fabric8:kubernetes-model-autoscaling:6.13.4
+B7A04C7B3E5594B74877CF659C9F271197674833 io.fabric8:kubernetes-model-apiextensions:6.13.4
+7EB4C0785834E1C9DB194C9DAFAB9AE1187FBAA0 io.fabric8:kubernetes-model-batch:6.13.4
+30109AEE3D13E6D633ED974F3CD83761166394BE io.fabric8:kubernetes-model-certificates:6.13.4
+B17C645531BF9F6BFE02E68982BC0E0D62DF15EB io.fabric8:kubernetes-model-coordination:6.13.4
+2718498178FC1D79FF1E7169985CF3D2149AED6E io.fabric8:kubernetes-model-discovery:6.13.4
+D716A15F8A23982FA72EA99A0017E16A3799BA67 io.fabric8:kubernetes-model-events:6.13.4
+14359CF0EEACC9E63274C9D84C679A5923E5D60E io.fabric8:kubernetes-model-extensions:6.13.4
+8D0CF291DDBA20C710F934544920830054617333 io.fabric8:kubernetes-model-flowcontrol:6.13.4
+E9FCBE07E8E44CCD6A3B8A12B052DBF5979A7C9D io.fabric8:kubernetes-model-networking:6.13.4
+D33C2F2C919194171E266D97F790B5CC5347E032 io.fabric8:kubernetes-model-metrics:6.13.4
+9A73E7F0AEEF1BB6E1271092C53D4E0DB92E11BE io.fabric8:kubernetes-model-policy:6.13.4
+0F9AA492F4CD8CB243126E2CD13F84C0FD8EF477 io.fabric8:kubernetes-model-scheduling:6.13.4
+75D3331FBF04D9491649B6606C7997476BA83DFC io.fabric8:kubernetes-model-storageclass:6.13.4
+A4FAD808C14CF3BB6B22B5C9BB3359CA9F0A140F io.fabric8:kubernetes-model-node:6.13.4
+80229737F704B121A318BBA5D5DEACBCF395BC77 org.slf4j:slf4j-api:2.0.13
+5213E62E87E62AC009D80AEB64C8240075BF078A org.snakeyaml:snakeyaml-engine:2.7
+B4C7B8A9EA3F398116A75C146B982B22AFEBC4EE com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.17.1
+3AF797A25458550A16BF89ACC8E4AB2B7F2BFCE0 org.yaml:snakeyaml:2.2
+0969B0C3CB8C75D759E9A6C585C44C9B9F3A4F75 com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1
+D3EBF0F291297649B4C8DC3ECC81D2EDDEDC100D io.fabric8:zjsonpatch:0.3.0
+508DDD4587B39BF484C0AA71EADC8C6517397720 io.fabric8:kubernetes-httpclient-okhttp:6.13.4
+D3E1CE1D2B3119ADF270B2D00D947BEB03FE3321 com.squareup.okhttp3:okhttp:3.12.12
+BC28B5A964C8F5721EB58EE3F3C47A9BCBF4F4D8 com.squareup.okio:okio:1.15.0
+D952189F6ABB148FF72AAB246AA8C28CF99B469F com.squareup.okhttp3:logging-interceptor:3.12.12
+985D77751EBC7FCE5DB115A986BC9AA82F973F4A com.fasterxml.jackson.core:jackson-annotations:2.18.2
+FB64CCAC5C27DCA8819418EB4E443A9F496D9EE7 com.fasterxml.jackson.core:jackson-core:2.18.2
+DEEF8697B92141FB6CAF7AA86966CFF4EEC9B04F com.fasterxml.jackson.core:jackson-databind:2.18.2
+
diff -pruN 2.1.10-1/plugins/jolokia/external/commons-codec-1.17.1-license.txt 2.2-1/plugins/jolokia/external/commons-codec-1.17.1-license.txt
--- 2.1.10-1/plugins/jolokia/external/commons-codec-1.17.1-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/commons-codec-1.17.1-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,207 @@
+Name: Apache Commons Codec
+Description: General encoding/decoding algorithms (for example phonetic, base64, URL).
+Origin: https://commons.apache.org/proper/commons-codec/
+Version: 1.17.1
+License: Apache-2.0
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff -pruN 2.1.10-1/plugins/jolokia/external/commons-logging-1.3.4-license.txt 2.2-1/plugins/jolokia/external/commons-logging-1.3.4-license.txt
--- 2.1.10-1/plugins/jolokia/external/commons-logging-1.3.4-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/commons-logging-1.3.4-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,208 @@
+Name: Apache Jakarta Commons Logging
+Origin: Apache Software Foundation
+Version: 1.3.4
+License: Apache-2.0
+Description: Logging component
+URL: https://commons.apache.org/proper/commons-logging/
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff -pruN 2.1.10-1/plugins/jolokia/external/httpclient-4.5.14-license.txt 2.2-1/plugins/jolokia/external/httpclient-4.5.14-license.txt
--- 2.1.10-1/plugins/jolokia/external/httpclient-4.5.14-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/httpclient-4.5.14-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,209 @@
+Name: Apache Commons HttpClient
+Origin: Apache Software Foundation
+Version: 4.5.14 
+License: Apache-2.0
+Description: HTTP client
+Origin: http://hc.apache.org/
+Files: httpclient-4.5.14.jar, httpcore-4.4.16.jar
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff -pruN 2.1.10-1/plugins/jolokia/external/jackson-2.18.2-license.txt 2.2-1/plugins/jolokia/external/jackson-2.18.2-license.txt
--- 2.1.10-1/plugins/jolokia/external/jackson-2.18.2-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/jackson-2.18.2-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,210 @@
+Name: Jackson
+Description: Jackson is a high-performance JSON processor for Java.
+License: Apache-2.0
+Origin: https://github.com/FasterXML/jackson
+Version: 2.18.2
+Files: jackson-annotations-2.18.2.jar, jackson-core-2.18.2.jar, jackson-databind-2.18.2.jar, jackson-dataformat-yaml-2.17.1.jar, jackson-datatype-jsr310-2.17.1.jar
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff -pruN 2.1.10-1/plugins/jolokia/external/jolokia-client-kubernetes-2.2.2-license.txt 2.2-1/plugins/jolokia/external/jolokia-client-kubernetes-2.2.2-license.txt
--- 2.1.10-1/plugins/jolokia/external/jolokia-client-kubernetes-2.2.2-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/jolokia-client-kubernetes-2.2.2-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,211 @@
+Name: Jolokia
+Description: Jolokia is remote JMX with JSON over HTTP.
+License: Apache-2.0
+Origin: https://jolokia.org
+Version: 2.2.2
+Files: jolokia-client-java-2.2.2.jar, jolokia-client-jmx-adapter-2.2.2.jar, jolokia-client-kubernetes-2.2.2.jar, jolokia-json-2.2.2.jar, jolokia-server-core-2.2.2.jar, jolokia-service-serializer-2.2.2.jar
+
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff -pruN 2.1.10-1/plugins/jolokia/external/kubernetes-client-6.13.4-license.txt 2.2-1/plugins/jolokia/external/kubernetes-client-6.13.4-license.txt
--- 2.1.10-1/plugins/jolokia/external/kubernetes-client-6.13.4-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/kubernetes-client-6.13.4-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,211 @@
+Name: Kubernetes Client
+Description: Java client for Kubernetes and OpenShift.
+License: Apache-2.0
+Origin: https://github.com/fabric8io/kubernetes-client/
+Version: 6.13.4
+Files: kubernetes-client-6.13.4.jar, kubernetes-client-api-6.13.4.jar, kubernetes-httpclient-okhttp-6.13.4.jar, kubernetes-model-admissionregistration-6.13.4.jar, kubernetes-model-apiextensions-6.13.4.jar, kubernetes-model-apps-6.13.4.jar, kubernetes-model-autoscaling-6.13.4.jar, kubernetes-model-batch-6.13.4.jar, kubernetes-model-certificates-6.13.4.jar, kubernetes-model-common-6.13.4.jar, kubernetes-model-coordination-6.13.4.jar, kubernetes-model-core-6.13.4.jar, kubernetes-model-discovery-6.13.4.jar, kubernetes-model-events-6.13.4.jar, kubernetes-model-extensions-6.13.4.jar, kubernetes-model-flowcontrol-6.13.4.jar, kubernetes-model-gatewayapi-6.13.4.jar, kubernetes-model-metrics-6.13.4.jar, kubernetes-model-networking-6.13.4.jar, kubernetes-model-node-6.13.4.jar, kubernetes-model-policy-6.13.4.jar, kubernetes-model-rbac-6.13.4.jar, kubernetes-model-resource-6.13.4.jar, kubernetes-model-scheduling-6.13.4.jar, kubernetes-model-storageclass-6.13.4.jar, zjsonpatch-0.3.0.jar
+
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff -pruN 2.1.10-1/plugins/jolokia/external/okhttp-3.12.12-license.txt 2.2-1/plugins/jolokia/external/okhttp-3.12.12-license.txt
--- 2.1.10-1/plugins/jolokia/external/okhttp-3.12.12-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/okhttp-3.12.12-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,212 @@
+Name: OkHttp
+Description: An HTTP+HTTP/2 client for Android and Java applications.
+License: Apache-2.0
+Origin: https://github.com/square/okhttp/
+Version: 3.12.12
+Files: logging-interceptor-3.12.12.jar, okhttp-3.12.12.jar, okio-1.15.0.jar
+
+
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff -pruN 2.1.10-1/plugins/jolokia/external/slf4j-api-2.0.13-license.txt 2.2-1/plugins/jolokia/external/slf4j-api-2.0.13-license.txt
--- 2.1.10-1/plugins/jolokia/external/slf4j-api-2.0.13-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/slf4j-api-2.0.13-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,27 @@
+Name: SLF4J
+Version: 2.0.13
+License: MIT-slf4j-22
+Origin: https://www.slf4j.org/
+Description: Simple Logging Facade for Java (SLF4J).
+
+Copyright (c) 2004-2024 QOS.ch Sarl (Switzerland)
+All rights reserved.
+
+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.
diff -pruN 2.1.10-1/plugins/jolokia/external/snakeyaml-2.2-license.txt 2.2-1/plugins/jolokia/external/snakeyaml-2.2-license.txt
--- 2.1.10-1/plugins/jolokia/external/snakeyaml-2.2-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/snakeyaml-2.2-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,207 @@
+Name: snakeyaml
+Description: YAML 1.2 parser, reader, writer library
+Origin: GitHub
+Version: 2.2
+License: Apache-2.0
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff -pruN 2.1.10-1/plugins/jolokia/external/snakeyaml-engine-2.7-license.txt 2.2-1/plugins/jolokia/external/snakeyaml-engine-2.7-license.txt
--- 2.1.10-1/plugins/jolokia/external/snakeyaml-engine-2.7-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/external/snakeyaml-engine-2.7-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,207 @@
+Name: snakeyaml-engine
+Description: YAML 1.2 parser, reader, writer library
+Origin: GitHub
+Version: 2.7
+License: Apache-2.0
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff -pruN 2.1.10-1/plugins/jolokia/manifest.mf 2.2-1/plugins/jolokia/manifest.mf
--- 2.1.10-1/plugins/jolokia/manifest.mf	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+AutoUpdate-Show-In-Client: true
+OpenIDE-Module-Java-Dependencies: Java > 11
+OpenIDE-Module: org.graalvm.visualvm.modules.jolokia
+OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/modules/jolokia/Bundle.properties
+OpenIDE-Module-Specification-Version: 2.2.2
+
diff -pruN 2.1.10-1/plugins/jolokia/nbproject/build-impl.xml 2.2-1/plugins/jolokia/nbproject/build-impl.xml
--- 2.1.10-1/plugins/jolokia/nbproject/build-impl.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/nbproject/build-impl.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="org.graalvm.visualvm.modules.jolokia-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff -pruN 2.1.10-1/plugins/jolokia/nbproject/genfiles.properties 2.2-1/plugins/jolokia/nbproject/genfiles.properties
--- 2.1.10-1/plugins/jolokia/nbproject/genfiles.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/nbproject/genfiles.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=520d0fe2
+build.xml.script.CRC32=f245468f
+build.xml.stylesheet.CRC32=a56c6a5b@2.73
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=78de761a
+nbproject/build-impl.xml.script.CRC32=e26352d3
+nbproject/build-impl.xml.stylesheet.CRC32=68e521fc@2.73
diff -pruN 2.1.10-1/plugins/jolokia/nbproject/project.properties 2.2-1/plugins/jolokia/nbproject/project.properties
--- 2.1.10-1/plugins/jolokia/nbproject/project.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,102 @@
+file.reference.jolokia-client-jmx-adapter-2.2.2.jar=external/jolokia-client-jmx-adapter-2.2.2.jar
+file.reference.jolokia-client-java-2.2.2.jar=external/jjolokia-client-java-2.2.2.jar
+file.reference.jolokia-json-2.2.2.jar=external/jolokia-json-2.2.2.jar
+file.reference.jolokia-server-core-2.2.2.jar=external/jolokia-server-core-2.2.2.jar
+file.reference.jolokia-service-serializer-2.2.2.jar=external/jolokia-service-serializer-2.2.2.jar
+file.reference.httpclient-4.5.14.jar=external/httpclient-4.5.14.jar
+file.reference.httpcore-4.4.16.jar=external/httpcore-4.4.16.jar
+file.reference.commons-logging-1.3.4.jar=external/commons-logging-1.3.4.jar
+file.reference.commons-codec-1.17.1.jar=external/commons-codec-1.17.1.jar
+file.reference.jolokia-client-kubernetes-2.2.2.jar=external/jolokia-client-kubernetes-2.2.2.jar
+file.reference.kubernetes-client-6.13.4.jar=external/kubernetes-client-6.13.4.jar
+file.reference.kubernetes-client-api-6.13.4.jar=external/kubernetes-client-api-6.13.4.jar
+file.reference.kubernetes-model-core-6.13.4.jar=external/kubernetes-model-core-6.13.4.jar
+file.reference.kubernetes-model-common-6.13.4.jar=external/kubernetes-model-common-6.13.4.jar
+file.reference.kubernetes-model-gatewayapi-6.13.4.jar=external/kubernetes-model-gatewayapi-6.13.4.jar
+file.reference.kubernetes-model-resource-6.13.4.jar=external/kubernetes-model-resource-6.13.4.jar
+file.reference.kubernetes-model-rbac-6.13.4.jar=external/kubernetes-model-rbac-6.13.4.jar
+file.reference.kubernetes-model-admissionregistration-6.13.4.jar=external/kubernetes-model-admissionregistration-6.13.4.jar
+file.reference.kubernetes-model-apps-6.13.4.jar=external/kubernetes-model-apps-6.13.4.jar
+file.reference.kubernetes-model-autoscaling-6.13.4.jar=external/kubernetes-model-autoscaling-6.13.4.jar
+file.reference.kubernetes-model-apiextensions-6.13.4.jar=external/kubernetes-model-apiextensions-6.13.4.jar
+file.reference.kubernetes-model-batch-6.13.4.jar=external/kubernetes-model-batch-6.13.4.jar
+file.reference.kubernetes-model-certificates-6.13.4.jar=external/kubernetes-model-certificates-6.13.4.jar
+file.reference.kubernetes-model-coordination-6.13.4.jar=external/kubernetes-model-coordination-6.13.4.jar
+file.reference.kubernetes-model-discovery-6.13.4.jar=external/kubernetes-model-discovery-6.13.4.jar
+file.reference.kubernetes-model-events-6.13.4.jar=external/kubernetes-model-events-6.13.4.jar
+file.reference.kubernetes-model-extensions-6.13.4.jar=external/kubernetes-model-extensions-6.13.4.jar
+file.reference.kubernetes-model-flowcontrol-6.13.4.jar=external/kubernetes-model-flowcontrol-6.13.4.jar
+file.reference.kubernetes-model-networking-6.13.4.jar=external/kubernetes-model-networking-6.13.4.jar
+file.reference.kubernetes-model-metrics-6.13.4.jar=external/kubernetes-model-metrics-6.13.4.jar
+file.reference.kubernetes-model-policy-6.13.4.jar=external/kubernetes-model-policy-6.13.4.jar
+file.reference.kubernetes-model-scheduling-6.13.4.jar=external/kubernetes-model-scheduling-6.13.4.jar
+file.reference.kubernetes-model-storageclass-6.13.4.jar=external/kubernetes-model-storageclass-6.13.4.jar
+file.reference.kubernetes-model-node-6.13.4.jar=external/kubernetes-model-node-6.13.4.jar
+file.reference.slf4j-api-2.0.13.jar=external/slf4j-api-2.0.13.jar
+file.reference.snakeyaml-engine-2.7.jar=external/snakeyaml-engine-2.7.jar
+file.reference.jackson-dataformat-yaml-2.17.1.jar=external/jackson-dataformat-yaml-2.17.1.jar
+file.reference.snakeyaml-2.2.jar=external/snakeyaml-2.2.jar
+file.reference.jackson-datatype-jsr310-2.17.1.jar=external/jackson-datatype-jsr310-2.17.1.jar
+file.reference.zjsonpatch-0.3.0.jar=external/zjsonpatch-0.3.0.jar
+file.reference.kubernetes-httpclient-okhttp-6.13.4.jar=external/kubernetes-httpclient-okhttp-6.13.4.jar
+file.reference.okhttp-3.12.12.jar=external/okhttp-3.12.12.jar
+file.reference.okio-1.15.0.jar=external/okio-1.15.0.jar
+file.reference.logging-interceptor-3.12.12.jar=external/logging-interceptor-3.12.12.jar
+file.reference.jackson-annotations-2.18.2.jar=external/jackson-annotations-2.18.2.jar
+file.reference.jackson-core-2.18.2.jar=external/jackson-core-2.18.2.jar
+file.reference.jackson-databind-2.18.2.jar=external/jackson-databind-2.18.2.jar
+is.eager=true
+license.file=../../visualvm/startup/src/org/graalvm/visualvm/modules/startup/LICENSE.txt
+nbm.homepage=https://visualvm.github.io
+nbm.module.author=Tomas Hurka
+nbm.needs.restart=true
+release.external/jolokia-client-jmx-adapter-2.2.2.jar=modules/ext/jolokia-client-jmx-adapter-2.2.2.jar
+release.external/jolokia-client-java-2.2.2.jar=modules/ext/jolokia-client-java-2.2.2.jar
+release.external/jolokia-json-2.2.2.jar=modules/ext/jolokia-json-2.2.2.jar
+release.external/jolokia-server-core-2.2.2.jar=modules/ext/jolokia-server-core-2.2.2.jar
+release.external/jolokia-service-serializer-2.2.2.jar=modules/ext/jolokia-service-serializer-2.2.2.jar
+release.external/httpclient-4.5.14.jar=modules/ext/httpclient-4.5.14.jar
+release.external/httpcore-4.4.16.jar=modules/ext/httpcore-4.4.16.jar
+release.external/commons-logging-1.3.4.jar=modules/ext/commons-logging-1.3.4.jar
+release.external/commons-codec-1.17.1.jar=modules/ext/commons-codec-1.17.1.jar
+release.external/jolokia-client-kubernetes-2.2.2.jar=modules/ext/jolokia-client-kubernetes-2.2.2.jar
+release.external/kubernetes-client-6.13.4.jar=modules/ext/kubernetes-client-6.13.4.jar
+release.external/kubernetes-client-api-6.13.4.jar=modules/ext/kubernetes-client-api-6.13.4.jar
+release.external/kubernetes-model-core-6.13.4.jar=modules/ext/kubernetes-model-core-6.13.4.jar
+release.external/kubernetes-model-common-6.13.4.jar=modules/ext/kubernetes-model-common-6.13.4.jar
+release.external/kubernetes-model-gatewayapi-6.13.4.jar=modules/ext/kubernetes-model-gatewayapi-6.13.4.jar
+release.external/kubernetes-model-resource-6.13.4.jar=modules/ext/kubernetes-model-resource-6.13.4.jar
+release.external/kubernetes-model-rbac-6.13.4.jar=modules/ext/kubernetes-model-rbac-6.13.4.jar
+release.external/kubernetes-model-admissionregistration-6.13.4.jar=modules/ext/kubernetes-model-admissionregistration-6.13.4.jar
+release.external/kubernetes-model-apps-6.13.4.jar=modules/ext/kubernetes-model-apps-6.13.4.jar
+release.external/kubernetes-model-autoscaling-6.13.4.jar=modules/ext/kubernetes-model-autoscaling-6.13.4.jar
+release.external/kubernetes-model-apiextensions-6.13.4.jar=modules/ext/kubernetes-model-apiextensions-6.13.4.jar
+release.external/kubernetes-model-batch-6.13.4.jar=modules/ext/kubernetes-model-batch-6.13.4.jar
+release.external/kubernetes-model-certificates-6.13.4.jar=modules/ext/kubernetes-model-certificates-6.13.4.jar
+release.external/kubernetes-model-coordination-6.13.4.jar=modules/ext/kubernetes-model-coordination-6.13.4.jar
+release.external/kubernetes-model-discovery-6.13.4.jar=modules/ext/kubernetes-model-discovery-6.13.4.jar
+release.external/kubernetes-model-events-6.13.4.jar=modules/ext/kubernetes-model-events-6.13.4.jar
+release.external/kubernetes-model-extensions-6.13.4.jar=modules/ext/kubernetes-model-extensions-6.13.4.jar
+release.external/kubernetes-model-flowcontrol-6.13.4.jar=modules/ext/kubernetes-model-flowcontrol-6.13.4.jar
+release.external/kubernetes-model-networking-6.13.4.jar=modules/ext/kubernetes-model-networking-6.13.4.jar
+release.external/kubernetes-model-metrics-6.13.4.jar=modules/ext/kubernetes-model-metrics-6.13.4.jar
+release.external/kubernetes-model-policy-6.13.4.jar=modules/ext/kubernetes-model-policy-6.13.4.jar
+release.external/kubernetes-model-scheduling-6.13.4.jar=modules/ext/kubernetes-model-scheduling-6.13.4.jar
+release.external/kubernetes-model-storageclass-6.13.4.jar=modules/ext/kubernetes-model-storageclass-6.13.4.jar
+release.external/kubernetes-model-node-6.13.4.jar=modules/ext/kubernetes-model-node-6.13.4.jar
+release.external/slf4j-api-2.0.13.jar=modules/ext/slf4j-api-2.0.13.jar
+release.external/snakeyaml-engine-2.7.jar=modules/ext/snakeyaml-engine-2.7.jar
+release.external/jackson-dataformat-yaml-2.17.1.jar=modules/ext/jackson-dataformat-yaml-2.17.1.jar
+release.external/snakeyaml-2.2.jar=modules/ext/snakeyaml-2.2.jar
+release.external/jackson-datatype-jsr310-2.17.1.jar=modules/ext/jackson-datatype-jsr310-2.17.1.jar
+release.external/zjsonpatch-0.3.0.jar=modules/ext/zjsonpatch-0.3.0.jar
+release.external/kubernetes-httpclient-okhttp-6.13.4.jar=modules/ext/kubernetes-httpclient-okhttp-6.13.4.jar
+release.external/okhttp-3.12.12.jar=modules/ext/okhttp-3.12.12.jar
+release.external/okio-1.15.0.jar=modules/ext/okio-1.15.0.jar
+release.external/logging-interceptor-3.12.12.jar=modules/ext/logging-interceptor-3.12.12.jar
+release.external/jackson-annotations-2.18.2.jar=modules/ext/jackson-annotations-2.18.2.jar
+release.external/jackson-core-2.18.2.jar=modules/ext/jackson-core-2.18.2.jar
+release.external/jackson-databind-2.18.2.jar=modules/ext/jackson-databind-2.18.2.jar
+
+javac.source=1.8
+javac.compilerargs=-Xlint -Xlint:-serial
diff -pruN 2.1.10-1/plugins/jolokia/nbproject/project.xml 2.2-1/plugins/jolokia/nbproject/project.xml
--- 2.1.10-1/plugins/jolokia/nbproject/project.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>org.graalvm.visualvm.modules.jolokia</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages/>
+            <class-path-extension>
+                <runtime-relative-path>ext/jolokia-client-jmx-adapter-2.2.2.jar</runtime-relative-path>
+                <binary-origin>external/jolokia-client-jmx-adapter-2.2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jolokia-client-java-2.2.2.jar</runtime-relative-path>
+                <binary-origin>external/jolokia-client-java-2.2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jolokia-json-2.2.2.jar</runtime-relative-path>
+                <binary-origin>external/jolokia-json-2.2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jolokia-server-core-2.2.2.jar</runtime-relative-path>
+                <binary-origin>external/jolokia-server-core-2.2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jolokia-service-serializer-2.2.2.jar</runtime-relative-path>
+                <binary-origin>external/jolokia-service-serializer-2.2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/httpclient-4.5.14.jar</runtime-relative-path>
+                <binary-origin>external/httpclient-4.5.14.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/httpcore-4.4.16.jar</runtime-relative-path>
+                <binary-origin>external/httpcore-4.4.16.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-logging-1.3.4.jar</runtime-relative-path>
+                <binary-origin>external/commons-logging-1.3.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-codec-1.17.1.jar</runtime-relative-path>
+                <binary-origin>external/commons-codec-1.17.1.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jolokia-client-kubernetes-2.2.2.jar</runtime-relative-path>
+                <binary-origin>external/jolokia-client-kubernetes-2.2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-client-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-client-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-client-api-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-client-api-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-core-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-core-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-common-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-common-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-gatewayapi-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-gatewayapi-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-resource-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-resource-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-rbac-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-rbac-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-admissionregistration-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-admissionregistration-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-apps-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-apps-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-autoscaling-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-autoscaling-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-apiextensions-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-apiextensions-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-batch-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-batch-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-certificates-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-certificates-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-coordination-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-coordination-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-discovery-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-discovery-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-events-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-events-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-extensions-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-extensions-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-flowcontrol-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-flowcontrol-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-networking-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-networking-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-metrics-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-metrics-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-policy-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-policy-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-scheduling-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-scheduling-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-storageclass-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-storageclass-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-model-node-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-model-node-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/slf4j-api-2.0.13.jar</runtime-relative-path>
+                <binary-origin>external/slf4j-api-2.0.13.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/snakeyaml-engine-2.7.jar</runtime-relative-path>
+                <binary-origin>external/snakeyaml-engine-2.7.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-dataformat-yaml-2.17.1.jar</runtime-relative-path>
+                <binary-origin>external/jackson-dataformat-yaml-2.17.1.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/snakeyaml-2.2.jar</runtime-relative-path>
+                <binary-origin>external/snakeyaml-2.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-datatype-jsr310-2.17.1.jar</runtime-relative-path>
+                <binary-origin>external/jackson-datatype-jsr310-2.17.1.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/zjsonpatch-0.3.0.jar</runtime-relative-path>
+                <binary-origin>external/zjsonpatch-0.3.0.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/kubernetes-httpclient-okhttp-6.13.4.jar</runtime-relative-path>
+                <binary-origin>external/kubernetes-httpclient-okhttp-6.13.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/okhttp-3.12.12.jar</runtime-relative-path>
+                <binary-origin>external/okhttp-3.12.12.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/okio-1.15.0.jar</runtime-relative-path>
+                <binary-origin>external/okio-1.15.0.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/logging-interceptor-3.12.12.jar</runtime-relative-path>
+                <binary-origin>external/logging-interceptor-3.12.12.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-annotations-2.18.2.jar</runtime-relative-path>
+                <binary-origin>external/jackson-annotations-2.18.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-core-2.18.2.jar</runtime-relative-path>
+                <binary-origin>external/jackson-core-2.18.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-databind-2.18.2.jar</runtime-relative-path>
+                <binary-origin>external/jackson-databind-2.18.2.jar</binary-origin>
+            </class-path-extension>
+        </data>
+    </configuration>
+</project>
diff -pruN 2.1.10-1/plugins/jolokia/nbproject/suite.properties 2.2-1/plugins/jolokia/nbproject/suite.properties
--- 2.1.10-1/plugins/jolokia/nbproject/suite.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/nbproject/suite.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff -pruN 2.1.10-1/plugins/jolokia/src/org/graalvm/visualvm/modules/jolokia/Bundle.properties 2.2-1/plugins/jolokia/src/org/graalvm/visualvm/modules/jolokia/Bundle.properties
--- 2.1.10-1/plugins/jolokia/src/org/graalvm/visualvm/modules/jolokia/Bundle.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/plugins/jolokia/src/org/graalvm/visualvm/modules/jolokia/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,8 @@
+OpenIDE-Module-Display-Category=Libraries
+OpenIDE-Module-Long-Description=\
+       Jolokia is a JMX-HTTP bridge giving an alternative to JSR-160 connectors. \
+       It is an agent based approach with support for many platforms. In addition \
+       to basic JMX operations it enhances JMX remoting with unique features like \
+       bulk requests and fine grained security policies.
+OpenIDE-Module-Name=Jolokia
+OpenIDE-Module-Short-Description=Jolokia is remote JMX with JSON over HTTP
diff -pruN 2.1.10-1/plugins/mbeans/nbproject/project.properties 2.2-1/plugins/mbeans/nbproject/project.properties
--- 2.1.10-1/plugins/mbeans/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/mbeans/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/plugins/nbproject/project.properties 2.2-1/plugins/nbproject/project.properties
--- 2.1.10-1/plugins/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -22,12 +22,14 @@ modules=\
     ${project.org.graalvm.visualvm.modules.tracer.swing}:\
     ${project.org.graalvm.visualvm.modules.tracer.collections}:\
     ${project.org.graalvm.visualvm.profiler.startup}:\
+    ${project.org.graalvm.visualvm.modules.jolokia}:\
     ${project.org.graalvm.visualvm.modules.graaljs}
 #    ${project.org.graalvm.visualvm.jfr.streaming}:\
 project.com.sun.appserv.management=glassfish/amx-api
 project.org.graalvm.visualvm.application.type.custom=extapptypes
 project.org.graalvm.visualvm.modules.customtype.lib=extapptypes.lib
 project.org.graalvm.visualvm.modules.graaljs=graaljs
+project.org.graalvm.visualvm.modules.jolokia=jolokia
 project.org.graalvm.visualvm.modules.jconsole=jconsole
 project.org.graalvm.visualvm.modules.mbeans=mbeans
 project.org.graalvm.visualvm.modules.oqlsyntax=oqlsyntax
diff -pruN 2.1.10-1/plugins/saplugin/nbproject/project.properties 2.2-1/plugins/saplugin/nbproject/project.properties
--- 2.1.10-1/plugins/saplugin/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/saplugin/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/plugins/tracer/src/org/graalvm/visualvm/modules/tracer/ProbeItemDescriptor.java 2.2-1/plugins/tracer/src/org/graalvm/visualvm/modules/tracer/ProbeItemDescriptor.java
--- 2.1.10-1/plugins/tracer/src/org/graalvm/visualvm/modules/tracer/ProbeItemDescriptor.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/tracer/src/org/graalvm/visualvm/modules/tracer/ProbeItemDescriptor.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+ *  Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  *  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  *  This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/plugins/tracerjvmstat/nbproject/project.properties 2.2-1/plugins/tracerjvmstat/nbproject/project.properties
--- 2.1.10-1/plugins/tracerjvmstat/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/plugins/tracerjvmstat/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/samples/killapp/build.xml 2.2-1/samples/killapp/build.xml
--- 2.1.10-1/samples/killapp/build.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/build.xml	1970-01-01 00:00:00.000000000 +0000
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
-<!-- for some information on what you could do (e.g. targets to override). -->
-<!-- If you delete this file and reopen the project it will be recreated. -->
-<project name="org.graalvm.visualvm.modules.killapp" default="netbeans" basedir=".">
-    <description>Builds, tests, and runs the project org.graalvm.visualvm.modules.killapp.</description>
-    <import file="nbproject/build-impl.xml"/>
-</project>
diff -pruN 2.1.10-1/samples/killapp/manifest.mf 2.2-1/samples/killapp/manifest.mf
--- 2.1.10-1/samples/killapp/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/manifest.mf	1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-Manifest-Version: 1.0
-OpenIDE-Module: org.graalvm.visualvm.modules.killapp/1
-OpenIDE-Module-Layer: org/graalvm/visualvm/modules/killapp/layer.xml
-OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/modules/killapp/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.2
-
diff -pruN 2.1.10-1/samples/killapp/nbproject/build-impl.xml 2.2-1/samples/killapp/nbproject/build-impl.xml
--- 2.1.10-1/samples/killapp/nbproject/build-impl.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/nbproject/build-impl.xml	1970-01-01 00:00:00.000000000 +0000
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-*** GENERATED FROM project.xml - DO NOT EDIT  ***
-***         EDIT ../build.xml INSTEAD         ***
--->
-<project name="org.graalvm.visualvm.modules.killapp-impl" basedir="..">
-    <property file="nbproject/private/platform-private.properties"/>
-    <property file="nbproject/platform.properties"/>
-    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
-        <attribute name="name"/>
-        <attribute name="value"/>
-        <sequential>
-            <property name="@{name}" value="${@{value}}"/>
-        </sequential>
-    </macrodef>
-    <property file="${user.properties.file}"/>
-    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
-    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
-    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
-        <condition>
-            <not>
-                <available file="${harness.dir}" type="dir"/>
-            </not>
-        </condition>
-    </fail>
-    <import file="${harness.dir}/build.xml"/>
-</project>
diff -pruN 2.1.10-1/samples/killapp/nbproject/platform.properties 2.2-1/samples/killapp/nbproject/platform.properties
--- 2.1.10-1/samples/killapp/nbproject/platform.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/nbproject/platform.properties	1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-nbjdk.active=default
-nbplatform.active=VisualVM_2.0
diff -pruN 2.1.10-1/samples/killapp/nbproject/project.properties 2.2-1/samples/killapp/nbproject/project.properties
--- 2.1.10-1/samples/killapp/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/nbproject/project.properties	1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-javac.source=1.5
-license.file=../../visualvm/startup/src/org/graalvm/visualvm/modules/startup/LICENSE.txt
-nbm.homepage=https://visualvm.github.io
-nbm.module.author=Tomas Hurka
-run.args.extra=--branding visualvm
-
diff -pruN 2.1.10-1/samples/killapp/nbproject/project.xml 2.2-1/samples/killapp/nbproject/project.xml
--- 2.1.10-1/samples/killapp/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/nbproject/project.xml	1970-01-01 00:00:00.000000000 +0000
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.apisupport.project</type>
-    <configuration>
-        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
-            <code-name-base>org.graalvm.visualvm.modules.killapp</code-name-base>
-            <standalone/>
-            <module-dependencies>
-                <dependency>
-                    <code-name-base>org.graalvm.visualvm.application</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
-                    <code-name-base>org.graalvm.visualvm.core</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
-                    <code-name-base>org.graalvm.visualvm.host</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
-                    <code-name-base>org.netbeans.api.progress</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.52</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
-                    <code-name-base>org.netbeans.api.progress.nb</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <specification-version>1.52</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
-                    <code-name-base>org.openide.util</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <specification-version>9.12</specification-version>
-                    </run-dependency>
-                </dependency>
-                <dependency>
-                    <code-name-base>org.openide.util.ui</code-name-base>
-                    <build-prerequisite/>
-                    <compile-dependency/>
-                    <run-dependency>
-                        <specification-version>9.13</specification-version>
-                    </run-dependency>
-                </dependency>
-            </module-dependencies>
-            <public-packages/>
-        </data>
-    </configuration>
-</project>
diff -pruN 2.1.10-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties 2.2-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties
--- 2.1.10-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties	1970-01-01 00:00:00.000000000 +0000
@@ -1,5 +0,0 @@
-OpenIDE-Module-Display-Category=Tools
-OpenIDE-Module-Long-Description=\
-    This simple module adds ability to quicky kill locally running Java application.
-OpenIDE-Module-Name=KillApplication
-OpenIDE-Module-Short-Description=Kill Application
diff -pruN 2.1.10-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java 2.2-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java
--- 2.1.10-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package org.graalvm.visualvm.modules.killapp;
-
-import org.graalvm.visualvm.application.Application;
-import org.graalvm.visualvm.core.datasource.DataSource;
-import org.graalvm.visualvm.core.datasupport.DataRemovedListener;
-import org.graalvm.visualvm.core.datasupport.Stateful;
-import org.graalvm.visualvm.core.ui.actions.ActionUtils;
-import org.graalvm.visualvm.core.ui.actions.MultiDataSourceAction;
-import org.graalvm.visualvm.host.Host;
-import java.awt.event.ActionEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import javax.swing.SwingUtilities;
-import org.netbeans.api.progress.ProgressHandle;
-import org.netbeans.api.progress.ProgressHandleFactory;
-import org.openide.util.Exceptions;
-import org.openide.util.NbBundle;
-import org.openide.util.RequestProcessor;
-import org.openide.util.Utilities;
-
-/**
- *
- * @author Tomas Hurka
- */
-public final class KillAction extends MultiDataSourceAction<Application> {
-    
-    private final Set<Application> lastSelectedApplications;
-    private final RequestProcessor killRP;
-    private final PropertyChangeListener stateListener;
-
-    @NbBundle.Messages({"CTL_KillAction=Kill Application"})
-    public KillAction() {
-        super(Application.class);
-        putValue(NAME, Bundle.CTL_KillAction());
-        putValue("noIconInMenu", Boolean.TRUE); // NOI18N
-        lastSelectedApplications = new HashSet();
-        killRP = new RequestProcessor("KillAction processor", 5);   // NOI18N
-        stateListener = new PropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent evt) {
-                updateState(ActionUtils.getSelectedDataSources(Application.class));
-            }
-        };
-    }
-
-    @Override
-    protected void actionPerformed(Set<Application> dataSources, ActionEvent ae) {
-        for (Application dataSource : dataSources) {
-            killApplication((Application)dataSource);
-        }
-    }
-
-    @Override
-    protected boolean isEnabled(Set<Application> dataSources) {
-        for (DataSource dataSource : dataSources) {
-            Application application = (Application)dataSource;
-                lastSelectedApplications.add(application);
-            application.addPropertyChangeListener(Stateful.PROPERTY_STATE, stateListener);
-            if (application.getState() != Stateful.STATE_AVAILABLE) return false;
-            if (!isEnabled(application)) return false;
-        }
-        return true;
-    }
-
-    @Override
-    protected void updateState(Set<Application> dataSources) {
-        if (!lastSelectedApplications.isEmpty())
-            for (Application application : lastSelectedApplications)
-                application.removePropertyChangeListener(Stateful.PROPERTY_STATE, stateListener);
-        lastSelectedApplications.clear();
-        super.updateState(dataSources);
-    }
-
-    private void killApplication(final Application app) {
-        final String pidString = String.valueOf(app.getPid());
-        final String[] command = getCommand(pidString, false);
-
-        if (command == null) {
-            return;
-        }
-
-        final Progress handle = new Progress(pidString);
-        app.notifyWhenRemoved(handle);
-        killRP.post(new Runnable() {
-            public void run() {
-                try {
-                    Runtime.getRuntime().exec(command);
-                    Thread.sleep(5000);
-                    if (app.getState() == Stateful.STATE_AVAILABLE) {
-                        // application is still alive, try to kill it hard way
-                        Runtime.getRuntime().exec(getCommand(pidString, true));
-                        refreshJvms();
-                    }
-                } catch (IOException ex) {
-                    Exceptions.printStackTrace(ex);
-                } catch (InterruptedException ex) {
-                    Exceptions.printStackTrace(ex);
-                } finally {
-                    handle.finish();
-                }
-            }
-        });
-    }
-
-    private void refreshJvms() throws IOException {
-        String javaSub = Utilities.isWindows() ? "bin\\java.exe" : "bin/java"; // NOI18N
-        File java = new File(System.getProperty("java.home"), javaSub); // NOI18N
-
-        if (java.isFile()) {
-            String command[] = {java.getAbsolutePath(), "-version"};
-            Runtime.getRuntime().exec(command);
-        }
-    }
-
-    private boolean isEnabled(Application application) {
-        if (Application.CURRENT_APPLICATION.equals(application)) {
-            // don't commit suicide
-            return false;
-        }
-        if (!Host.LOCALHOST.equals(application.getHost())) {
-            // we cannot kill remote applications
-            return false;
-        }
-        return true;
-    }
-
-    private String[] getCommand(String pidString, boolean force) {
-        if (Utilities.isWindows()) {
-            if (force) {
-                return new String[]{"taskkill", "/F", "/PID", pidString};    // NOI18N                
-            } else {
-                return new String[]{"taskkill", "/PID", pidString};    // NOI18N
-            }
-        } else if (Utilities.isUnix()) {
-            if (force) {
-                return new String[]{"kill", "-9", pidString};   // NOI18N                
-            } else {
-                return new String[]{"kill", pidString};   // NOI18N
-            }
-        } else {
-            assert false : "strange os";  // NOI18N
-            return null;
-        }
-    }
-
-    @NbBundle.Messages({"MSG_Kill=Killing application with PID {0}"})
-    private static class Progress implements DataRemovedListener<Application>{
-
-        ProgressHandle handle;
-        boolean running;
-        
-        private Progress(String pid) {
-            handle = ProgressHandleFactory.createHandle(Bundle.MSG_Kill(pid));
-            handle.setInitialDelay(500);
-            handle.start();
-            running = true;
-        }
-
-        private synchronized void finish() {
-            if (running) {
-                running = false;
-                SwingUtilities.invokeLater(new Runnable() {
-                    public void run() {
-                        handle.finish();
-                        handle = null;
-                    }
-                });
-            }
-        }
-
-        public void dataRemoved(Application x) {
-            finish();
-        }
-    }
-}
diff -pruN 2.1.10-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml 2.2-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml
--- 2.1.10-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/samples/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
-<filesystem>
-    <folder name="Actions">
-        <folder name="Other">
-            <file name="org-graalvm-visualvm-modules-killapp-KillAction.instance"/>
-        </folder>
-    </folder>
-    <folder name="Menu">
-        <folder name="Applications">
-            <file name="Kill-Separator-2950.instance">
-                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
-                <attr name="position" intvalue="2910"/>
-            </file>
-            <file name="org-graalvm-visualvm-modules-killapp-KillAction.shadow">
-                <attr name="originalFile" stringvalue="Actions/Other/org-graalvm-visualvm-modules-killapp-KillAction.instance"/>
-                <attr name="position" intvalue="2911"/>
-            </file>
-        </folder>
-    </folder>
-    <folder name="VisualVM">
-        <folder name="ExplorerPopupSelection">
-            <file name="Kill-Separator-1950.instance">
-                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
-                <attr name="position" intvalue="1910"/>
-            </file>
-            <file name="org-graalvm-visualvm-modules-killapp-KillAction.shadow">
-                <attr name="originalFile" stringvalue="Actions/Other/org-graalvm-visualvm-modules-killapp-KillAction.instance"/>
-                <attr name="position" intvalue="1911"/>
-            </file>
-        </folder>
-    </folder>
-</filesystem>
diff -pruN 2.1.10-1/visualvm/application/src/org/graalvm/visualvm/application/type/Bundle.properties 2.2-1/visualvm/application/src/org/graalvm/visualvm/application/type/Bundle.properties
--- 2.1.10-1/visualvm/application/src/org/graalvm/visualvm/application/type/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/application/src/org/graalvm/visualvm/application/type/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -100,3 +100,7 @@ LBL_Gradle=Gradle Daemon
 DESCR_Gradle=Gradle Daemon: a long-lived background process that executes your builds much more quickly than would otherwise be the case.
 LBL_GradleLauncher=Gradle Launcher
 DESCR_GradleLauncher=Gradle Launcher.
+LBL_GradleWrapper=Gradle Wrapper
+DESCR_GradleWrapper=Gradle Wrapper is a script that invokes a declared version of Gradle, downloading it beforehand if necessary.
+LBL_GradleWorker=Gradle Worker
+DESCR_GradleWorker=Gradle Worker is long-lived worker daemon process that can be reused for future work items.
diff -pruN 2.1.10-1/visualvm/application/src/org/graalvm/visualvm/application/type/MainClassApplicationTypeFactory.java 2.2-1/visualvm/application/src/org/graalvm/visualvm/application/type/MainClassApplicationTypeFactory.java
--- 2.1.10-1/visualvm/application/src/org/graalvm/visualvm/application/type/MainClassApplicationTypeFactory.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/application/src/org/graalvm/visualvm/application/type/MainClassApplicationTypeFactory.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -136,6 +136,8 @@ public class MainClassApplicationTypeFac
         // Gradle runtime
         {"org.gradle.launcher.daemon.bootstrap.GradleDaemon",descr("LBL_Gradle"),descr("DESCR_Gradle"),"org/graalvm/visualvm/application/type/resources/Gradle.png"},  // NOI18N
         {"org.gradle.launcher.GradleMain",descr("LBL_GradleLauncher"),descr("DESCR_GradleLauncher"),"org/graalvm/visualvm/application/type/resources/Gradle.png"},  // NOI18N
+        {"org.gradle.wrapper.GradleWrapperMain",descr("LBL_GradleWrapper"),descr("DESCR_GradleWrapper"),"org/graalvm/visualvm/application/type/resources/Gradle.png"},  // NOI18N
+        {"worker.org.gradle.process.internal.worker.GradleWorkerMain",descr("LBL_GradleWorker"),descr("DESCR_GradleWorker"),"org/graalvm/visualvm/application/type/resources/Gradle.png"},  // NOI18N
     };
     
     Map<String,String[]> map;
diff -pruN 2.1.10-1/visualvm/applicationviews/nbproject/project.xml 2.2-1/visualvm/applicationviews/nbproject/project.xml
--- 2.1.10-1/visualvm/applicationviews/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/applicationviews/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -102,7 +102,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
+                        <specification-version>2.4</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorModel.java 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorModel.java
--- 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorModel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorModel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,12 +28,19 @@ package org.graalvm.visualvm.application
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.management.MemoryMXBean;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.Attribute;
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
 import javax.swing.SwingUtilities;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -53,7 +60,6 @@ import org.graalvm.visualvm.tools.jmx.Jm
 import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.openide.util.NbBundle;
 
 
@@ -63,6 +69,7 @@ import org.openide.util.NbBundle;
  */
 final class ApplicationMonitorModel {
     
+    private static final Logger LOGGER = Logger.getLogger(ApplicationMonitorModel.class.getName());
     private static final String PROP_PREFIX = "ApplicationMonitorModel_";  // NOI18N
     
     static final String SNAPSHOT_VERSION = PROP_PREFIX + "version"; // NOI18N
@@ -83,6 +90,7 @@ final class ApplicationMonitorModel {
     public static final String PROP_MEMORY_MONITORING_SUPPORTED = PROP_PREFIX + "memory_monitoring_supported";  // NOI18N
     public static final String PROP_CLASS_MONITORING_SUPPORTED = PROP_PREFIX + "class_monitoring_supported";    // NOI18N
     public static final String PROP_THREADS_MONITORING_SUPPORTED = PROP_PREFIX + "threads_monitoring_supported";  // NOI18N
+    public static final String PROP_VIRTUAL_THREADS_MONITORING_SUPPORTED = PROP_PREFIX + "virtual_threads_monitoring_supported";  // NOI18N
     public static final String PROP_NUMBER_OF_PROCESSORS = PROP_PREFIX + "number_of_processors";  // NOI18N
 
     public static final String PROP_PROCESS_CPU_TIME = PROP_PREFIX + "process_cpu_time"; // NOI18N
@@ -105,12 +113,17 @@ final class ApplicationMonitorModel {
     public static final String PROP_DAEMON_THREADS = PROP_PREFIX + "daemon_threads"; // NOI18N
     public static final String PROP_PEAK_THREADS = PROP_PREFIX + "peak_threads"; // NOI18N
     public static final String PROP_STARTED_THREADS = PROP_PREFIX + "started_threads"; // NOI18N
+    public static final String PROP_PARALLELISM = PROP_PREFIX + "parallelism"; // NOI18N
+    public static final String PROP_POOL_SIZE = PROP_PREFIX + "pool_size"; // NOI18N
+    public static final String PROP_MOUNTED_VIRTUAL_THREADS_COUNT = PROP_PREFIX + "mounted_virtual_thread_count"; // NOI18N
+    public static final String PROP_QUEUED_VIRTUAL_THREAD_COUNT = PROP_PREFIX + "queued_virtual_thread_count"; // NOI18N
 
     private static final String CPU_CHART_STORAGE = "monitor_cpu.dat"; // NOI18N
     private static final String HEAP_CHART_STORAGE = "monitor_heap.dat"; // NOI18N
     private static final String PERMGEN_CHART_STORAGE = "monitor_permgen.dat"; // NOI18N
     private static final String CLASSES_CHART_STORAGE = "monitor_classes.dat"; // NOI18N
     private static final String THREADS_CHART_STORAGE = "monitor_threads.dat"; // NOI18N
+    private static final String VIRTUAL_THREADS_CHART_STORAGE = "monitor_vthreads.dat"; // NOI18N
     
     private boolean initialized;
     private final DataSource source;
@@ -121,6 +134,8 @@ final class ApplicationMonitorModel {
     private Jvm jvm;
     private MemoryMXBean memoryMXBean;
     private MonitoredDataListener monitoredDataListener;
+    private ObjectName virtualThreadsName;
+    private MBeanServerConnection connection;
 
     private int chartCache = -1;
 
@@ -134,6 +149,7 @@ final class ApplicationMonitorModel {
     private boolean memoryMonitoringSupported = false;
     private boolean classMonitoringSupported = false;
     private boolean threadsMonitoringSupported = false;
+    private boolean virtualThreadsMonitoringSupported = false;
     private int processorsCount = -1;
 
     private long processCpuTime = -1;
@@ -156,12 +172,17 @@ final class ApplicationMonitorModel {
     private long daemonThreads = -1;
     private long peakThreads = -1;
     private long startedThreads = -1;
+    private int parallelism = -1;
+    private int poolSize = -1;
+    private int mountedVirtualThreadCount = -1;
+    private long queuedVirtualThreadCount = -1;
 
     private SimpleXYChartSupport cpuChartSupport;
     private SimpleXYChartSupport heapChartSupport;
     private SimpleXYChartSupport permGenChartSupport;
     private SimpleXYChartSupport classesChartSupport;
     private SimpleXYChartSupport threadsChartSupport;
+    private SimpleXYChartSupport virtualThreadsChartSupport;
 
     
     public static ApplicationMonitorModel create(Application application, boolean live) {
@@ -187,6 +208,7 @@ final class ApplicationMonitorModel {
     public boolean isMemoryMonitoringSupported() { return memoryMonitoringSupported; }
     public boolean isClassMonitoringSupported() { return classMonitoringSupported; }
     public boolean isThreadsMonitoringSupported() { return threadsMonitoringSupported; }
+    public boolean isVirtualThreadsMonitoringSupported() { return virtualThreadsMonitoringSupported; }
     public int     getProcessorsCount() { return processorsCount; }
     
     public long    getTimestamp() { return timestamp; }
@@ -213,6 +235,10 @@ final class ApplicationMonitorModel {
     public long getDeamonThreads() { return daemonThreads; }
     public long getPeakThreads() { return peakThreads; }
     public long getStartedThreads() { return startedThreads; }
+    public int getParallelism() { return parallelism; }
+    public int getPoolSize() { return poolSize; }
+    public int getMountedVirtualThreadCount() { return mountedVirtualThreadCount; }
+    public long getQueuedVirtualThreadCount() { return queuedVirtualThreadCount; }
     
     
     public synchronized void initialize() {
@@ -277,6 +303,17 @@ final class ApplicationMonitorModel {
             });
     }
 
+    public void registerVirtualThreadsChartSupport(final SimpleXYChartSupport virtualThreadsChartSupport) {
+        this.virtualThreadsChartSupport = virtualThreadsChartSupport;
+        if (virtualThreadsChartSupport != null && source instanceof Snapshot)
+            VisualVM.getInstance().runTask(new Runnable() {
+                public void run() {
+                    File file = new File(source.getStorage().getDirectory(), VIRTUAL_THREADS_CHART_STORAGE);
+                    if (file.isFile()) loadChartSupport(virtualThreadsChartSupport, file);
+                }
+            });
+    }
+
     public synchronized void cleanup() {
         listeners.clear();
         if (!initialized) return;
@@ -309,6 +346,7 @@ final class ApplicationMonitorModel {
         setProperty(storage, PROP_MEMORY_MONITORING_SUPPORTED, Boolean.toString(memoryMonitoringSupported));
         setProperty(storage, PROP_CLASS_MONITORING_SUPPORTED, Boolean.toString(classMonitoringSupported));
         setProperty(storage, PROP_THREADS_MONITORING_SUPPORTED, Boolean.toString(threadsMonitoringSupported));
+        setProperty(storage, PROP_VIRTUAL_THREADS_MONITORING_SUPPORTED, Boolean.toString(virtualThreadsMonitoringSupported));
         setProperty(storage, PROP_NUMBER_OF_PROCESSORS, Integer.toString(processorsCount));
 
         setProperty(storage, PROP_PROCESS_CPU_TIME, Long.toString(processCpuTime));
@@ -331,6 +369,10 @@ final class ApplicationMonitorModel {
         setProperty(storage, PROP_DAEMON_THREADS, Long.toString(daemonThreads));
         setProperty(storage, PROP_PEAK_THREADS, Long.toString(peakThreads));
         setProperty(storage, PROP_STARTED_THREADS, Long.toString(startedThreads));
+        setProperty(storage, PROP_PARALLELISM, Integer.toString(parallelism));
+        setProperty(storage, PROP_POOL_SIZE, Integer.toString(poolSize));
+        setProperty(storage, PROP_MOUNTED_VIRTUAL_THREADS_COUNT, Integer.toString(mountedVirtualThreadCount));
+        setProperty(storage, PROP_QUEUED_VIRTUAL_THREAD_COUNT, Long.toString(queuedVirtualThreadCount));
 
         File dir = storage.getDirectory();
 
@@ -344,42 +386,26 @@ final class ApplicationMonitorModel {
             saveChartSupport(classesChartSupport, new File(dir, CLASSES_CHART_STORAGE));
         if (threadsMonitoringSupported)
             saveChartSupport(threadsChartSupport, new File(dir, THREADS_CHART_STORAGE));
+        if (virtualThreadsMonitoringSupported)
+            saveChartSupport(virtualThreadsChartSupport, new File(dir, VIRTUAL_THREADS_CHART_STORAGE));
         
     }
 
     private static void saveChartSupport(SimpleXYChartSupport chartSupport, File file) {
         if (chartSupport == null) return;
-
-        OutputStream os = null;
         
-        try {
-            os = new FileOutputStream(file);
+        try (OutputStream os = new FileOutputStream(file)){
             chartSupport.saveValues(os);
         } catch (Exception e) {
             // TODO: log it
-        } finally {
-            try {
-                if (os != null) os.close();
-            } catch (Exception e) {
-                // TODO: log it
-            }
         }
     }
 
     private static void loadChartSupport(SimpleXYChartSupport chartSupport, File file) {
-        InputStream is = null;
-
-        try {
-            is = new FileInputStream(file);
+        try (InputStream is = new FileInputStream(file)) {
             chartSupport.loadValues(is);
         } catch (Exception e) {
             // TODO: log it
-        } finally {
-            try {
-                if (is != null) is.close();
-            } catch (Exception e) {
-                // TODO: log it
-            }
         }
     }
 
@@ -397,6 +423,7 @@ final class ApplicationMonitorModel {
         memoryMonitoringSupported = Boolean.parseBoolean(getProperty(storage, PROP_MEMORY_MONITORING_SUPPORTED));
         classMonitoringSupported = Boolean.parseBoolean(getProperty(storage, PROP_CLASS_MONITORING_SUPPORTED));
         threadsMonitoringSupported = Boolean.parseBoolean(getProperty(storage, PROP_THREADS_MONITORING_SUPPORTED));
+        virtualThreadsMonitoringSupported = Boolean.parseBoolean(getProperty(storage, PROP_VIRTUAL_THREADS_MONITORING_SUPPORTED));
         processorsCount = Integer.parseInt(getProperty(storage, PROP_NUMBER_OF_PROCESSORS));
 
         processCpuTime = Long.parseLong(getProperty(storage, PROP_PROCESS_CPU_TIME));
@@ -417,6 +444,10 @@ final class ApplicationMonitorModel {
         daemonThreads = Long.parseLong(getProperty(storage, PROP_DAEMON_THREADS));
         peakThreads = Long.parseLong(getProperty(storage, PROP_PEAK_THREADS));
         startedThreads = Long.parseLong(getProperty(storage, PROP_STARTED_THREADS));
+        parallelism = Integer.parseInt(getProperty(storage, PROP_PARALLELISM));
+        poolSize = Integer.parseInt(getProperty(storage, PROP_POOL_SIZE));
+        mountedVirtualThreadCount = Integer.parseInt(getProperty(storage, PROP_MOUNTED_VIRTUAL_THREADS_COUNT));
+        queuedVirtualThreadCount = Long.parseLong(getProperty(storage, PROP_QUEUED_VIRTUAL_THREAD_COUNT));
         
         if (version.compareTo("1.1") >= 0) {                      // NOI18N
             heapName = getProperty(storage, PROP_HEAP_NAME);
@@ -465,10 +496,17 @@ final class ApplicationMonitorModel {
         memoryMXBean = null;
         JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
         if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
-            JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+            JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
             if (mxbeans != null) {
                 memoryMXBean = mxbeans.getMemoryMXBean();
             }
+            virtualThreadsName = getVirtualThreadsName();
+            try {
+                virtualThreadsMonitoringSupported = jmxModel.getMBeanServerConnection().isRegistered(virtualThreadsName);
+                if (virtualThreadsMonitoringSupported) connection = jmxModel.getMBeanServerConnection();
+            } catch (IOException ex) {
+                
+            }
         }
 
         if (jvm != null) {
@@ -533,6 +571,17 @@ final class ApplicationMonitorModel {
                 peakThreads    = data.getThreadsLivePeak();
                 startedThreads = data.getThreadsStarted();
             }
+            if (virtualThreadsMonitoringSupported) {
+                Object[] attributes = getVirtualThreadAttributes("Parallelism", "PoolSize", "MountedVirtualThreadCount", "QueuedVirtualThreadCount");
+                if (attributes != null) {
+                    parallelism = (Integer)attributes[0];
+                    poolSize = (Integer)attributes[1];
+                    mountedVirtualThreadCount = (Integer)attributes[2];
+                    queuedVirtualThreadCount = (Long)attributes[3];
+                } else {
+                    virtualThreadsMonitoringSupported = false;
+                }
+            }
         }
     }
 
@@ -552,4 +601,26 @@ final class ApplicationMonitorModel {
         listeners = Collections.synchronizedList(new ArrayList<>());
     }
 
+    private Object[] getVirtualThreadAttributes(String... names) {
+        try {
+            List<Attribute> attrs = connection.getAttributes(virtualThreadsName, names).asList();
+            Object[] values = new Object[attrs.size()];
+
+            for (int i = 0; i < values.length; i++) {
+                values[i] = attrs.get(i).getValue();
+            }
+            return values;
+        } catch (Exception ex) {
+            LOGGER.log(Level.INFO, "getAttributes", ex);   // NOI18N
+        }
+        return null;
+    }
+
+    private static ObjectName getVirtualThreadsName() {
+        try {
+            return new ObjectName("jdk.management:type=VirtualThreadScheduler");    // NOI18N
+        } catch (MalformedObjectNameException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
 }
diff -pruN 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorView.java 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorView.java
--- 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorView.java	2025-04-17 09:07:34.000000000 +0000
@@ -116,9 +116,11 @@ class ApplicationMonitorView extends Dat
         dvc.addDetailsView(classesViewSupport.getDetailsView(), DataViewComponent.BOTTOM_LEFT);
 
         final ThreadsViewSupport threadsViewSupport = new ThreadsViewSupport(model);
+        final VirtualThreadsViewSupport vThreadsViewSupport = model.isVirtualThreadsMonitoringSupported() ? new VirtualThreadsViewSupport(model) : null;
         dvc.configureDetailsArea(new DataViewComponent.DetailsAreaConfiguration(NbBundle.
                 getMessage(ApplicationMonitorView.class, "LBL_Threads"), true), DataViewComponent.BOTTOM_RIGHT);   // NOI18N
         dvc.addDetailsView(threadsViewSupport.getDetailsView(), DataViewComponent.BOTTOM_RIGHT);
+        if (vThreadsViewSupport != null) dvc.addDetailsView(vThreadsViewSupport.getDetailsView(), DataViewComponent.BOTTOM_RIGHT);
 
         final Runnable refresher = new Runnable() {
             public void run() {
@@ -128,6 +130,7 @@ class ApplicationMonitorView extends Dat
                 if (permGenViewSupport != null) permGenViewSupport.refresh(model);
                 classesViewSupport.refresh(model);
                 threadsViewSupport.refresh(model);
+                if (vThreadsViewSupport != null) vThreadsViewSupport.refresh(model);
             }
         };
 
@@ -688,4 +691,72 @@ class ApplicationMonitorView extends Dat
 
     }
 
+    // --- Virtual Threads -------------------------------------------------------------
+
+    private static class VirtualThreadsViewSupport extends JPanel  {
+
+        private static final String PARALLELISM = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Parallelism");   // NOI18N
+        private static final String POOL_SIZE = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Pool_size");  // NOI18N
+        private static final String MOUNTED_VT_COUNT = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Mounted_virtual_thread_count");   // NOI18N
+        private static final String MOUNTED_VT_COUNT_LEG = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Mounted_virtual_thread_count_leg");   // NOI18N
+        private static final String QUEUED_VT_COUNT = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Queued_virtual_thread_count");// NOI18N
+        private static final String QUEUED_VT_COUNT_LEG = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Queued_virtual_thread_count_leg");// NOI18N
+        private static final String VIRTUAL_THREADS = NbBundle.getMessage(ApplicationMonitorView.class, "LBL_Virtual_Threads");   // NOI18N
+
+        private boolean liveModel;
+        private boolean virtualThreadsMonitoringSupported;
+
+        private SimpleXYChartSupport chartSupport;
+
+
+        VirtualThreadsViewSupport(ApplicationMonitorModel model) {
+            initModels(model);
+            initComponents();
+        }
+
+        public DataViewComponent.DetailsView getDetailsView() {
+            return new DataViewComponent.DetailsView(VIRTUAL_THREADS, null, 10, this, null);
+        }
+
+        public void refresh(ApplicationMonitorModel model) {
+                int parallelism = model.getParallelism();
+                int poolSize = model.getPoolSize();
+                int mountedVirtualThreadCount = model.getMountedVirtualThreadCount();
+                long queuedVirtualThreadCount = model.getQueuedVirtualThreadCount();
+
+                if (liveModel)
+                        chartSupport.addValues(model.getTimestamp(), new long[] { mountedVirtualThreadCount, queuedVirtualThreadCount });
+                chartSupport.updateDetails(new String[] { chartSupport.formatDecimal(parallelism),
+                                                          chartSupport.formatDecimal(poolSize),
+                                                          chartSupport.formatDecimal(mountedVirtualThreadCount),
+                                                          chartSupport.formatDecimal(queuedVirtualThreadCount) });
+        }
+
+        private void initModels(ApplicationMonitorModel model) {
+            liveModel = model.isLive();
+            virtualThreadsMonitoringSupported = model.isVirtualThreadsMonitoringSupported();
+
+            if (virtualThreadsMonitoringSupported) {
+                SimpleXYChartDescriptor chartDescriptor =
+                        SimpleXYChartDescriptor.decimal(3, false, model.getChartCache());
+
+                chartDescriptor.addLineItems(MOUNTED_VT_COUNT_LEG, QUEUED_VT_COUNT_LEG);
+                chartDescriptor.setDetailsItems(new String[] { PARALLELISM, POOL_SIZE,
+                                                               MOUNTED_VT_COUNT, QUEUED_VT_COUNT });
+
+                chartSupport = ChartFactory.createSimpleXYChart(chartDescriptor);
+                model.registerThreadsChartSupport(chartSupport);
+
+                chartSupport.setZoomingEnabled(!liveModel);
+            }
+        }
+
+        private void initComponents() {
+            setLayout(new BorderLayout());
+            setOpaque(false);
+
+            add(chartSupport.getChart(), BorderLayout.CENTER);
+            chartSupport.updateDetails(new String[] { UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN });
+        }
+    }
 }
diff -pruN 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/Bundle.properties 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/Bundle.properties
--- 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -96,5 +96,19 @@ LBL_Live_threads_leg=Live threads
 
 LBL_Daemon_threads_leg=Daemon threads
 
+LBL_Virtual_Threads=Virtual Threads
+
+LBL_Parallelism=Parallelism
+
+LBL_Pool_size=Pool size
+
+LBL_Mounted_virtual_thread_count=Mounted VT count
+
+LBL_Mounted_virtual_thread_count_leg=Mounted VT count
+
+LBL_Queued_virtual_thread_count=Queued VT count
+
+LBL_Queued_virtual_thread_count_leg=Queued VT count
+
 FORMAT_hms={0} hrs {1} min {2} sec
 FORMAT_ms={0} min {1} sec
diff -pruN 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/ApplicationThreadsViewProvider.java 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/ApplicationThreadsViewProvider.java
--- 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/ApplicationThreadsViewProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/ApplicationThreadsViewProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,6 @@ import org.graalvm.visualvm.core.ui.Plug
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 
 /**
  *
@@ -84,7 +83,7 @@ public class ApplicationThreadsViewProvi
         JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
         if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
             if (jmxModel.isTakeThreadDumpSupported()) {
-                JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
                 return mxbeans == null ? null : mxbeans.getThreadMXBean();
             }
         }
diff -pruN 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/PersistenceSupport.java 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/PersistenceSupport.java
--- 2.1.10-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/PersistenceSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/PersistenceSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -63,50 +63,31 @@ final class PersistenceSupport {
         if (dm == null) return;
 
         File dir = storage.getDirectory();
-        OutputStream os = null;
 
-        try {
-            os = new FileOutputStream(new File(dir, THREADS_DATA_FILE));
+        try (OutputStream os = new FileOutputStream(new File(dir, THREADS_DATA_FILE))) {
             saveDataManager(dm, os);
             storage.setCustomProperty(SNAPSHOT_VERSION, CURRENT_SNAPSHOT_VERSION);
         } catch (Exception e) {
             // TODO: log it
-        } finally {
-            try {
-                if (os != null) os.close();
-            } catch (Exception e) {
-                // TODO: log it
-            }
         }
     }
 
     static VisualVMThreadsDataManager loadDataManager(Storage storage) {
         File dir = storage.getDirectory();
-        InputStream is = null;
 
-        try {
-            is = new FileInputStream(new File(dir, THREADS_DATA_FILE));
+        try (InputStream is = new FileInputStream(new File(dir, THREADS_DATA_FILE))) {
             return loadDataManager(is);
         } catch (Exception e) {
             // TODO: log it
             return null;
-        } finally {
-            try {
-                if (is != null) is.close();
-            } catch (Exception e) {
-                // TODO: log it
-            }
         }
     }
 
 
     private synchronized static void saveDataManager(VisualVMThreadsDataManager dm, OutputStream os) throws IOException {
-        DataOutputStream dos = null;
-        try {
-            synchronized(dm) {
-                int tcount = dm.getThreadsCount();
-
-                dos = new DataOutputStream(os);
+        synchronized(dm) {
+            int tcount = dm.getThreadsCount();
+            try (DataOutputStream dos = new DataOutputStream(os)) {
 
                 dos.writeUTF(THREADS_SNAPSHOT_HEADER); // Snapshot format
                 dos.writeInt(THREADS_SNAPSHOT_VERSION); // Snapshot version
@@ -127,8 +108,6 @@ final class PersistenceSupport {
                     }
                 }
             }
-        } finally {
-            if (dos != null) dos.close();
         }
     }
 
diff -pruN 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/AboutAction.java 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/AboutAction.java
--- 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/AboutAction.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/AboutAction.java	2025-04-17 09:07:34.000000000 +0000
@@ -51,7 +51,7 @@ import org.openide.windows.WindowManager
 public final class AboutAction extends AbstractAction {
     private final static Logger LOGGER = Logger.getLogger(AboutAction.class.getName());
     
-    private String versionString = "2.1.10"; // Use "Dev" for development builds   // NOI18N
+    private String versionString = "2.2"; // Use "Dev" for development builds   // NOI18N
 
 
     public AboutAction() {
Binary files 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/about/image.png and 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/about/image.png differ
diff -pruN 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/CacertsKeyStoreProvider.java 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/CacertsKeyStoreProvider.java
--- 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/CacertsKeyStoreProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/CacertsKeyStoreProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -27,7 +27,6 @@ package org.graalvm.visualvm.modules.app
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.security.KeyStore;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -55,25 +54,17 @@ public class CacertsKeyStoreProvider imp
     @Override
     public KeyStore getKeyStore() {
         KeyStore keyStore = null;
-        FileInputStream is = null;
 
-        try {
-            File file = new File(getCacerts());
-            if (!file.exists()) {
-                return null;
-            }
+        File file = new File(getCacerts());
+        if (!file.exists()) {
+            return null;
+        }
 
+        try (FileInputStream is = new FileInputStream(file)){
             keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-            is = new FileInputStream(file);
             keyStore.load(is, null);
         } catch (Exception ex) {
             Logger.getLogger("global").log(Level.INFO, ex.getMessage(), ex);
-        } finally {
-            try {
-                if (is != null) is.close();
-            } catch (IOException ex) {
-                assert false : ex;
-            }
         }
         return keyStore;
     }
diff -pruN 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/VisualVMKeyStoreProvider.java 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/VisualVMKeyStoreProvider.java
--- 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/VisualVMKeyStoreProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/keystore/VisualVMKeyStoreProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -25,7 +25,6 @@
 
 package org.graalvm.visualvm.modules.appui.keystore;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.security.KeyStore;
 import java.util.logging.Level;
@@ -46,20 +45,12 @@ public final class VisualVMKeyStoreProvi
     
     public KeyStore getKeyStore() {
         KeyStore keyStore = null;
-        InputStream is = null;
         
-        try {
-            is = getClass().getResourceAsStream(KS_FILE_PATH);
+        try (InputStream is = getClass().getResourceAsStream(KS_FILE_PATH)) {
             keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
             keyStore.load (is, KS_DEFAULT_PASSWORD.toCharArray());           
         } catch (Exception ex) {
             Logger.getLogger ("global").log(Level.INFO, ex.getMessage(), ex);
-        } finally {
-            try {
-                if (is != null) is.close();
-            } catch (IOException ex) {
-                assert false : ex;
-            }
         }
         return keyStore;
     }
Binary files 2.1.10-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/welcome/resources/welcome-topright.png and 2.2-1/visualvm/appui/src/org/graalvm/visualvm/modules/appui/welcome/resources/welcome-topright.png differ
diff -pruN 2.1.10-1/visualvm/attach/src/org/graalvm/visualvm/attach/AttachModelImpl.java 2.2-1/visualvm/attach/src/org/graalvm/visualvm/attach/AttachModelImpl.java
--- 2.1.10-1/visualvm/attach/src/org/graalvm/visualvm/attach/AttachModelImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/attach/src/org/graalvm/visualvm/attach/AttachModelImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -37,8 +37,17 @@ import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+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;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.swing.SwingUtilities;
+import org.openide.util.Utilities;
 import sun.tools.attach.HotSpotVirtualMachine;
 
 /**
@@ -51,6 +60,7 @@ class AttachModelImpl extends AttachMode
     private static final String HEAP_DUMP_NO_SPACE_ID = "No space left on device";  // NOI18N
     private static final String JCMD_VM_COMMAND_LINE = "VM.command_line";    // NOI18N
     static final Logger LOGGER = Logger.getLogger(AttachModelImpl.class.getName());
+    private static final ExecutorService winExec = Executors.newCachedThreadPool();
 
     String pid;
     HotSpotVirtualMachine vm;
@@ -60,13 +70,33 @@ class AttachModelImpl extends AttachMode
         pid = Integer.toString(app.getPid());
     }
     
-    public synchronized Properties getSystemProperties() {
+    // see JmxModelImpl$LocalVirtualMachine.executeAndWait
+    private static <V> V executeAndWait(Callable<V> call) {
+        if (Utilities.isWindows()) {
+            Future<V> result = winExec.submit(call);
+            try {
+                return result.get(SwingUtilities.isEventDispatchThread() ? 5 : 25, TimeUnit.SECONDS);
+            } catch (InterruptedException | ExecutionException | TimeoutException ex) {
+                LOGGER.log(Level.INFO, "executeAndWait get", ex);    // NOI18N
+            }
+            return null;
+        }
         try {
-            return getVirtualMachine().getSystemProperties();
-        } catch (IOException ex) {
-            LOGGER.log(Level.INFO,"getSystemProperties",ex);    // NOI18N
+            return call.call();
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
         }
-        return null;
+    }
+
+    public synchronized Properties getSystemProperties() {
+        return executeAndWait(() -> {
+            try {
+                return getVirtualMachine().getSystemProperties();
+            } catch (IOException ex) {
+                LOGGER.log(Level.INFO,"getSystemProperties",ex);    // NOI18N
+            }
+            return null;
+        });
     }
     
     public synchronized boolean takeHeapDump(String fileName) {
@@ -209,13 +239,15 @@ class AttachModelImpl extends AttachMode
     }
 
     private synchronized String executeJCmd(String command) {
-        try {
-            InputStream in = getVirtualMachine().executeJCmd(command);
-            return readToEOF(in);
-        } catch (IOException ex) {
-            LOGGER.log(Level.INFO,"executeJCmd",ex);    // NOI18N
-        }
-        return null;
+        return executeAndWait(() -> {
+            try {
+                InputStream in = getVirtualMachine().executeJCmd(command);
+                return readToEOF(in);
+            } catch (IOException ex) {
+                LOGGER.log(Level.INFO, "executeJCmd", ex);    // NOI18N
+            }
+            return null;
+        });
     }
 
     private String readToEOF(InputStream in) throws IOException {
diff -pruN 2.1.10-1/visualvm/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties 2.2-1/visualvm/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
--- 2.1.10-1/visualvm/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -22,7 +22,7 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 
-currentVersion=VisualVM 2.1.10
+currentVersion=VisualVM 2.2
 LBL_splash_window_title=Starting VisualVM
 SPLASH_HEIGHT=310
 SPLASH_WIDTH=530
Binary files 2.1.10-1/visualvm/branding/core/core.jar/org/netbeans/core/startup/splash.gif and 2.2-1/visualvm/branding/core/core.jar/org/netbeans/core/startup/splash.gif differ
diff -pruN 2.1.10-1/visualvm/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties 2.2-1/visualvm/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
--- 2.1.10-1/visualvm/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -22,5 +22,5 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 
-CTL_MainWindow_Title=VisualVM 2.1.10
-CTL_MainWindow_Title_No_Project=VisualVM 2.1.10
+CTL_MainWindow_Title=VisualVM 2.2
+CTL_MainWindow_Title_No_Project=VisualVM 2.2
diff -pruN 2.1.10-1/visualvm/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties 2.2-1/visualvm/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties
--- 2.1.10-1/visualvm/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -22,4 +22,4 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 
-LBL_ProductInformation=VisualVM 2.1.10
+LBL_ProductInformation=VisualVM 2.2
diff -pruN 2.1.10-1/visualvm/build-nb.sh 2.2-1/visualvm/build-nb.sh
--- 2.1.10-1/visualvm/build-nb.sh	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/build-nb.sh	2025-04-17 09:07:34.000000000 +0000
@@ -29,6 +29,7 @@ git reset --hard $REV
 git revert --no-edit -n 0a64c810435ade77907e5ddbf2491385a5efab2f
 git revert --no-edit -n -Xignore-all-space --strategy-option=theirs 7e625c44a472d45a513ada1e6ef7526c6d3a7720
 git revert --no-edit -n -Xignore-all-space --strategy-option=theirs d55be1aff900a81b22081f7699fd16ab04e42553
+git cherry-pick -n e390f3305204e6910690e15d0930809e73344506
 git restore --staged .github/ apisupport/ harness/ platform/
 patch -p1 <<'EOF'
 diff --git a/platform/keyring.impl/src/org/netbeans/modules/keyring/impl/KeyringSupport.java b/platform/keyring.impl/src/org/netbeans/modules/keyring/impl/KeyringSupport.java
diff -pruN 2.1.10-1/visualvm/charts/manifest.mf 2.2-1/visualvm/charts/manifest.mf
--- 2.1.10-1/visualvm/charts/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/charts/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,6 @@
 Manifest-Version: 1.0
 AutoUpdate-Show-In-Client: false
+AutoUpdate-Essential-Module: true
 OpenIDE-Module: org.graalvm.visualvm.charts/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/charts/Bundle.properties
 OpenIDE-Module-Specification-Version: 2.1
diff -pruN 2.1.10-1/visualvm/charts/src/org/graalvm/visualvm/charts/xy/XYStorage.java 2.2-1/visualvm/charts/src/org/graalvm/visualvm/charts/xy/XYStorage.java
--- 2.1.10-1/visualvm/charts/src/org/graalvm/visualvm/charts/xy/XYStorage.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/charts/src/org/graalvm/visualvm/charts/xy/XYStorage.java	2025-04-17 09:07:34.000000000 +0000
@@ -83,13 +83,10 @@ public class XYStorage implements Timeli
     }
 
     public synchronized void saveValues(OutputStream os) throws IOException {
-        DataOutputStream dos = null;
-        try {
+        try (DataOutputStream dos = new DataOutputStream(os)) {
             int icount = values.length;
             int vcount = getTimestampsCount();
 
-            dos = new DataOutputStream(os);
-
             dos.writeUTF(SNAPSHOT_HEADER); // Snapshot format
             dos.writeInt(SNAPSHOT_VERSION); // Snapshot version
             dos.writeInt(icount); // Items count
@@ -100,8 +97,6 @@ public class XYStorage implements Timeli
                 for (int iidx = 0; iidx < icount; iidx++)
                     dos.writeLong(getValue(iidx, vidx));
             }
-        } finally {
-            if (dos != null) dos.close();
         }
     }
 
diff -pruN 2.1.10-1/visualvm/core/src/org/graalvm/visualvm/core/Bundle.properties 2.2-1/visualvm/core/src/org/graalvm/visualvm/core/Bundle.properties
--- 2.1.10-1/visualvm/core/src/org/graalvm/visualvm/core/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/core/src/org/graalvm/visualvm/core/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -26,8 +26,8 @@
 OpenIDE-Module-Display-Category=Infrastructure
 OpenIDE-Module-Name=VisualVM-Core
 OpenIDE-Module-Short-Description=VisualVM main module
-org_graalvm_visualvm_core_update_center=https://visualvm.github.io/uc/release2110/updates.xml.gz?{$netbeans.hash.code}
-Services/AutoupdateType/org_graalvm_visualvm_core_update_center.instance=VisualVM 2.1.10 Plugins Center
+org_graalvm_visualvm_core_update_center=https://visualvm.github.io/uc/release22/updates.xml.gz?{$netbeans.hash.code}
+Services/AutoupdateType/org_graalvm_visualvm_core_update_center.instance=VisualVM 2.2 Plugins Center
 Menu/Applications=&Applications
 Toolbars/Snapshot=&Snapshot
 Toolbars/DataSource=&Data Source
diff -pruN 2.1.10-1/visualvm/core/src/org/graalvm/visualvm/core/datasource/DataSource.java 2.2-1/visualvm/core/src/org/graalvm/visualvm/core/datasource/DataSource.java
--- 2.1.10-1/visualvm/core/src/org/graalvm/visualvm/core/datasource/DataSource.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/core/src/org/graalvm/visualvm/core/datasource/DataSource.java	2025-04-17 09:07:34.000000000 +0000
@@ -30,7 +30,6 @@ import org.graalvm.visualvm.core.datasup
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.lang.ref.WeakReference;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import org.openide.util.RequestProcessor;
@@ -68,6 +67,7 @@ public abstract class DataSource {
     private boolean visible = true;
     private Storage storage;
     private DataSourceContainer repository;
+    private final Object propertiesLock = new Object();
     private PropertyChangeSupport changeSupport;
     private Set<ComparableWeakReference<DataRemovedListener>> removedListeners;
 
@@ -234,7 +234,9 @@ public abstract class DataSource {
     public final void notifyWhenRemoved(DataRemovedListener listener) {
         if (listener == null) throw new IllegalArgumentException("Listener cannot be null");    // NOI18N
         if (isRemoved()) listener.dataRemoved(this);
-        else getRemovedListeners().add(new ComparableWeakReference<>(listener));
+        else synchronized (propertiesLock) {
+            getRemovedListeners().add(new ComparableWeakReference<>(listener));
+        }
     }
     
     /**
@@ -274,14 +276,18 @@ public abstract class DataSource {
         
         this.owner = null;
         isRemoved = true;
+        Set<ComparableWeakReference<DataRemovedListener>> listenersCopy;
         
-        if (!hasRemovedListeners()) return;
-        Set<ComparableWeakReference<DataRemovedListener>> listeners = getRemovedListeners();
-        for (WeakReference<DataRemovedListener> listenerReference : listeners) {
+        synchronized (propertiesLock) {
+            if (!hasRemovedListeners()) return;
+            Set<ComparableWeakReference<DataRemovedListener>> listeners = getRemovedListeners();
+            listenersCopy = new HashSet<>(listeners);
+            listeners.clear();
+        }
+        for (WeakReference<DataRemovedListener> listenerReference : listenersCopy) {
             DataRemovedListener listener = listenerReference.get();
             if (listener != null) listener.dataRemoved(this);
         }
-        listeners.clear();
     }
     
     
@@ -300,19 +306,23 @@ public abstract class DataSource {
      * 
      * @return instance of PropertyChangeSupport used for processing property changes.
      */
-    protected final synchronized PropertyChangeSupport getChangeSupport() {
-        if (changeSupport == null) changeSupport = new PropertyChangeSupport(this);
-        return changeSupport;
+    protected final PropertyChangeSupport getChangeSupport() {
+        synchronized (propertiesLock) {
+            if (changeSupport == null) changeSupport = new PropertyChangeSupport(this);
+            return changeSupport;
+        }
     }
     
     
-    final boolean hasRemovedListeners() {
+    private boolean hasRemovedListeners() {
         return removedListeners != null;
     }
     
-    final synchronized Set<ComparableWeakReference<DataRemovedListener>> getRemovedListeners() {
-        if (!hasRemovedListeners()) removedListeners = Collections.synchronizedSet(new HashSet<>());
-        return removedListeners;
+    final Set<ComparableWeakReference<DataRemovedListener>> getRemovedListeners() {
+        synchronized (propertiesLock) {
+            if (!hasRemovedListeners()) removedListeners = new HashSet<>();
+            return removedListeners;
+        }
     }
 
 }
diff -pruN 2.1.10-1/visualvm/gotosource/src/org/graalvm/visualvm/gotosource/SourcesRoot.java 2.2-1/visualvm/gotosource/src/org/graalvm/visualvm/gotosource/SourcesRoot.java
--- 2.1.10-1/visualvm/gotosource/src/org/graalvm/visualvm/gotosource/SourcesRoot.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/gotosource/src/org/graalvm/visualvm/gotosource/SourcesRoot.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/graalvm/manifest.mf 2.2-1/visualvm/graalvm/manifest.mf
--- 2.1.10-1/visualvm/graalvm/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/graalvm/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,6 @@
 Manifest-Version: 1.0
 AutoUpdate-Show-In-Client: false
+AutoUpdate-Essential-Module: true
 OpenIDE-Module: org.graalvm.visualvm.graalvm/2
 OpenIDE-Module-Install: org/graalvm/visualvm/graalvm/Installer.class
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/graalvm/Bundle.properties
diff -pruN 2.1.10-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/libgraal/MemoryModel.java 2.2-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/libgraal/MemoryModel.java
--- 2.1.10-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/libgraal/MemoryModel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/libgraal/MemoryModel.java	2025-04-17 09:07:34.000000000 +0000
@@ -218,40 +218,18 @@ final class MemoryModel {
             return;
         }
 
-        OutputStream os = null;
-
-        try {
-            os = new FileOutputStream(file);
+        try (OutputStream os = new FileOutputStream(file)) {
             chartSupport.saveValues(os);
         } catch (Exception e) {
             LOGGER.log(Level.INFO, "saveChartSupport", e);   // NOI18N
-        } finally {
-            try {
-                if (os != null) {
-                    os.close();
-                }
-            } catch (Exception e) {
-                LOGGER.log(Level.INFO, "saveChartSupport", e);   // NOI18N
-            }
         }
     }
 
     private static void loadChartSupport(SimpleXYChartSupport chartSupport, File file) {
-        InputStream is = null;
-
-        try {
-            is = new FileInputStream(file);
+        try (InputStream is = new FileInputStream(file)) {
             chartSupport.loadValues(is);
         } catch (Exception e) {
             LOGGER.log(Level.INFO, "loadChartSupport", e);   // NOI18N
-        } finally {
-            try {
-                if (is != null) {
-                    is.close();
-                }
-            } catch (Exception e) {
-                LOGGER.log(Level.INFO, "loadChartSupport", e);   // NOI18N
-            }
         }
     }
 
diff -pruN 2.1.10-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/svm/SVMMonitoredDataImpl.java 2.2-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/svm/SVMMonitoredDataImpl.java
--- 2.1.10-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/svm/SVMMonitoredDataImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/graalvm/src/org/graalvm/visualvm/graalvm/svm/SVMMonitoredDataImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapContext.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapContext.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapContext.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapContext.java	2025-04-17 09:07:34.000000000 +0000
@@ -75,13 +75,13 @@ public final class HeapContext {
         Lookup.Provider project = heapViewer.getProject();
         
         List<HeapFragment> fragments = heapViewer.getFragments();
-        List<HeapContext> contexts = new ArrayList(fragments.size());
+        List<HeapContext> contexts = new ArrayList<>(fragments.size());
         
         for (HeapFragment fragment : fragments)
             contexts.add(new HeapContext(file, project, fragment));
         
         for (HeapContext context : contexts) {
-            List<HeapContext> otherContexts = new ArrayList(contexts);
+            List<HeapContext> otherContexts = new ArrayList<>(contexts);
             otherContexts.remove(context);
             context.otherContexts = Collections.unmodifiableCollection(otherContexts);
         }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapViewer.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapViewer.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapViewer.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/HeapViewer.java	2025-04-17 09:07:34.000000000 +0000
@@ -139,7 +139,7 @@ public final class HeapViewer {
         
         Collection<? extends HeapFragment.Provider> providers = Lookup.getDefault().lookupAll(HeapFragment.Provider.class);
         
-        List<HeapFragment> fragments = new ArrayList(providers.size());
+        List<HeapFragment> fragments = new ArrayList<>(providers.size());
         for (HeapFragment.Provider provider : providers) {
             List<HeapFragment> fragmentsL = provider.getFragments(heapDumpFile, heapDumpProject, heap);
             if (fragmentsL != null) fragments.addAll(fragmentsL);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/InstanceNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/InstanceNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/InstanceNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/InstanceNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -135,7 +135,7 @@ public class InstanceNode extends HeapVi
     
     static String computeName(Instance instance) {
         Heap heap = instance.getJavaClass().getHeap();
-        Collection<GCRoot> gcroots = heap == null ? Collections.EMPTY_LIST : heap.getGCRoots(instance);
+        Collection<GCRoot> gcroots = heap == null ? Collections.emptyList() : heap.getGCRoots(instance);
         return computeName(heap, instance, gcroots);
     }
     
@@ -152,7 +152,7 @@ public class InstanceNode extends HeapVi
             name = className + "#" + instance.getInstanceNumber(); // NOI18N
         }
         if (!gcroots.isEmpty()) {
-            Set<String> gcKinds = new HashSet();
+            Set<String> gcKinds = new HashSet<>();
 
             for (GCRoot gcroot : gcroots) {
                 gcKinds.add(gcroot.getKind());
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNodeRenderer.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNodeRenderer.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNodeRenderer.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ThreadStateNodeRenderer.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -61,7 +61,7 @@ public class ThreadStateNodeRenderer ext
     }
 
     private static final int THREAD_ICON_SIZE = 9;
-    private static final Map<Thread.State, Icon> STATE_ICONS_CACHE = new HashMap();
+    private static final Map<Thread.State, Icon> STATE_ICONS_CACHE = new HashMap<>();
 
     private static Icon getIcon(Thread.State state) {
         Icon icon = STATE_ICONS_CACHE.get(state);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/ClassHierarchyPlugin.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/ClassHierarchyPlugin.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/ClassHierarchyPlugin.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/ClassHierarchyPlugin.java	2025-04-17 09:07:34.000000000 +0000
@@ -44,6 +44,8 @@ import org.graalvm.visualvm.heapviewer.u
 import org.graalvm.visualvm.heapviewer.ui.HeapViewerActions;
 import org.graalvm.visualvm.heapviewer.ui.TreeTableView;
 import org.graalvm.visualvm.heapviewer.ui.TreeTableViewColumn;
+import org.graalvm.visualvm.lib.jfluid.heap.Field;
+import org.graalvm.visualvm.lib.jfluid.heap.FieldValue;
 import org.graalvm.visualvm.lib.jfluid.heap.Heap;
 import org.graalvm.visualvm.lib.jfluid.heap.Instance;
 import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
@@ -121,7 +123,7 @@ public class ClassHierarchyPlugin extend
                 HeapViewerNode root = (HeapViewerNode)getRoot();
                 while (root != null) {
                     expandNode(root);
-                    root = root.getNChildren() > 0 ? (HeapViewerNode)root.getChild(0) : null;
+                    root = root.getNChildren() > 0 ? root.getChild(0) : null;
                 }
             }
         };
@@ -179,16 +181,16 @@ public class ClassHierarchyPlugin extend
         @Override public Instance getClassLoader()                  { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public ObjectArrayInstance getSigners()           { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public Instance getProtectionDomain()             { throw new UnsupportedOperationException("Not supported."); } // NOI18N
-        @Override public List getFields()                           { throw new UnsupportedOperationException("Not supported."); } // NOI18N
+        @Override public List<Field> getFields()                           { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public int getInstanceSize()                      { throw new UnsupportedOperationException("Not supported."); } // NOI18N
-        @Override public List getInstances()                        { throw new UnsupportedOperationException("Not supported."); } // NOI18N
-        @Override public Iterator getInstancesIterator()            { throw new UnsupportedOperationException("Not supported."); } // NOI18N
+        @Override public List<Instance> getInstances()                        { throw new UnsupportedOperationException("Not supported."); } // NOI18N
+        @Override public Iterator<Instance> getInstancesIterator()            { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public int getInstancesCount()                    { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public long getRetainedSizeByClass()              { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public long getJavaClassId()                      { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public String getName()                           { throw new UnsupportedOperationException("Not supported."); } // NOI18N
-        @Override public List getStaticFieldValues()                { throw new UnsupportedOperationException("Not supported."); } // NOI18N
-        @Override public Collection getSubClasses()                 { throw new UnsupportedOperationException("Not supported."); } // NOI18N
+        @Override public List<FieldValue> getStaticFieldValues()                { throw new UnsupportedOperationException("Not supported."); } // NOI18N
+        @Override public Collection<JavaClass> getSubClasses()                 { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public JavaClass getSuperClass()                  { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         @Override public Heap getHeap()                             { throw new UnsupportedOperationException("Not supported."); } // NOI18N
         
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaArrayItemsProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaArrayItemsProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaArrayItemsProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaArrayItemsProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -94,7 +94,7 @@ public class JavaArrayItemsProvider exte
                 }
                 protected ProgressIterator<Integer> objectsIterator(int index, Progress progress) {
                     Iterator<Integer> iterator = integerIterator(index, items.size());
-                    return new ProgressIterator(iterator, index, false, progress);
+                    return new ProgressIterator<>(iterator, index, false, progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.JavaArrayItemsProvider_MoreNodes(moreNodesCount);
@@ -120,7 +120,7 @@ public class JavaArrayItemsProvider exte
                 }
                 protected ProgressIterator<Integer> objectsIterator(int index, Progress progress) {
                     Iterator<Integer> iterator = integerIterator(index, items.size());
-                    return new ProgressIterator(iterator, index, false, progress);
+                    return new ProgressIterator<>(iterator, index, false, progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.JavaArrayItemsProvider_MoreNodes(moreNodesCount);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaDiffClassesProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaDiffClassesProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaDiffClassesProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaDiffClassesProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -51,6 +51,8 @@ import org.graalvm.visualvm.heapviewer.u
 import org.graalvm.visualvm.heapviewer.ui.UIThresholds;
 import org.graalvm.visualvm.heapviewer.utils.NodesComputer;
 import org.graalvm.visualvm.heapviewer.utils.ProgressIterator;
+import org.graalvm.visualvm.lib.jfluid.heap.Field;
+import org.graalvm.visualvm.lib.jfluid.heap.FieldValue;
 import org.graalvm.visualvm.lib.jfluid.heap.Heap;
 import org.graalvm.visualvm.lib.jfluid.heap.Instance;
 import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
@@ -75,7 +77,7 @@ class JavaDiffClassesProvider {
             }
             protected ProgressIterator<ClassNode> objectsIterator(int index, Progress progress) {
                 Iterator<ClassNode> iterator = diffClasses.listIterator(index);
-                return new ProgressIterator(iterator, index, false, progress);
+                return new ProgressIterator<>(iterator, index, false, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return JavaClassesProvider.Classes_Messages.getMoreNodesString(moreNodesCount);
@@ -93,8 +95,8 @@ class JavaDiffClassesProvider {
     }
     
     static HeapViewerNode[] getDiffHeapPackages(HeapViewerNode parent, Heap heap1, List<ClassNode> diffClasses, boolean retained, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
-        List<HeapViewerNode> nodes = new ArrayList();
-        Map<String, DiffPackageNode> packages = new HashMap();
+        List<HeapViewerNode> nodes = new ArrayList<>();
+        Map<String, DiffPackageNode> packages = new HashMap<>();
         
         Thread worker = Thread.currentThread();
         
@@ -132,7 +134,7 @@ class JavaDiffClassesProvider {
                 DataType.RETAINED_SIZE.computeValuesImmediately(h2);
         }
         
-        Map<JavaClassID, DiffClassNode> classes = new HashMap();
+        Map<JavaClassID, DiffClassNode> classes = new HashMap<>();
         
         List<JavaClass> classes1 = h1.getAllClasses();
         for (JavaClass jc1 : classes1) {
@@ -158,7 +160,7 @@ class JavaDiffClassesProvider {
             }
         }
         
-        return new ArrayList(classes.values());
+        return new ArrayList<>(classes.values());
     }
     
     private static class JavaClassID {
@@ -462,7 +464,7 @@ class JavaDiffClassesProvider {
         }
 
         @Override
-        public List getFields() {
+        public List<Field> getFields() {
             return null;
         }
 
@@ -472,12 +474,12 @@ class JavaDiffClassesProvider {
         }
 
         @Override
-        public List getInstances() {
+        public List<Instance> getInstances() {
             return null;
         }
 
         @Override
-        public Iterator getInstancesIterator() {
+        public Iterator<Instance> getInstancesIterator() {
             return null;
         }
 
@@ -502,12 +504,12 @@ class JavaDiffClassesProvider {
         }
 
         @Override
-        public List getStaticFieldValues() {
+        public List<FieldValue> getStaticFieldValues() {
             return null;
         }
 
         @Override
-        public Collection getSubClasses() {
+        public Collection<JavaClass> getSubClasses() {
             return null;
         }
 
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsPlugin.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsPlugin.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsPlugin.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsPlugin.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -74,6 +74,7 @@ import org.graalvm.visualvm.lib.jfluid.h
 import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
 import org.graalvm.visualvm.lib.profiler.api.icons.LanguageIcons;
 import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
+import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
 import org.graalvm.visualvm.lib.ui.swing.renderer.NormalBoldGrayRenderer;
 import org.openide.util.NbBundle;
 import org.openide.util.NbPreferences;
@@ -133,10 +134,11 @@ class JavaFieldsPlugin extends HeapViewP
         
         heap = context.getFragment().getHeap();
         
+        TreeTableViewColumn count;
         TreeTableViewColumn[] columns = new TreeTableViewColumn[] {
             new TreeTableViewColumn.Name(),
             new TreeTableViewColumn.LogicalValue(),
-            new TreeTableViewColumn.Count(heap, true, true),
+            count = new TreeTableViewColumn.Count(heap, true, true),
             new TreeTableViewColumn.OwnSize(heap, false, false),
             new TreeTableViewColumn.RetainedSize(heap, false, false),
             new TreeTableViewColumn.ObjectID()
@@ -153,9 +155,10 @@ class JavaFieldsPlugin extends HeapViewP
                     
                     InstancesWrapper wrapper = HeapViewerNode.getValue(_selected, DataType.INSTANCES_WRAPPER, heap);
                     if (wrapper != null) {
-                        List<HeapViewerNode> fieldNodes = new ArrayList();
+                        List<HeapViewerNode> fieldNodes = new ArrayList<>();
                         
                         if (cFieldsHisto) {
+                            ((HideableBarRenderer)count.getRenderer()).setMaxValue(wrapper.getInstancesCount());
                             HeapViewerNode[] histo = getClassFieldsHistogram(wrapper, root, heap, viewID, viewFilter, dataTypes, sortOrders, progress);
                             fieldNodes.addAll(Arrays.asList(histo));
                         } else {
@@ -185,7 +188,7 @@ class JavaFieldsPlugin extends HeapViewP
                     } else {
                         Instance instance = HeapViewerNode.getValue(_selected, DataType.INSTANCE, heap);
                         if (instance != null) {
-                            List<FieldValue> fields = new ArrayList();
+                            List<FieldValue> fields = new ArrayList<>();
 
                             if (iFields) fields.addAll(instance.getFieldValues());
                             else filtered = true;
@@ -303,7 +306,7 @@ class JavaFieldsPlugin extends HeapViewP
                 return new FieldHistogramNode(field) {
                     @Override
                     InterruptibleIterator<Instance> instancesIterator() {
-                        return new InterruptibleIterator(instances.getInstancesIterator());
+                        return new InterruptibleIterator<>(instances.getInstancesIterator());
                     }
                     @Override
                     int instancesCount() {
@@ -313,7 +316,7 @@ class JavaFieldsPlugin extends HeapViewP
             }
             protected ProgressIterator<Field> objectsIterator(int index, Progress progress) {
                 Iterator<Field> iterator = fields.listIterator(index);
-                return new ProgressIterator(iterator, index, false, progress);
+                return new ProgressIterator<>(iterator, index, false, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return Bundle.JavaFieldsPlugin_FieldsContainerMoreNodes(moreNodesCount);
@@ -403,7 +406,7 @@ class JavaFieldsPlugin extends HeapViewP
                         }
                         protected ProgressIterator<InstanceCounter.Record> objectsIterator(int index, Progress progress) {
                             Iterator<InstanceCounter.Record> iterator = values.iterator();
-                            return new ProgressIterator(iterator, index, true, progress);
+                            return new ProgressIterator<>(iterator, index, true, progress);
                         }
                         protected String getMoreNodesString(String moreNodesCount)  {
                             return Bundle.JavaFieldsPlugin_FieldHistogramMoreNodes(moreNodesCount);
@@ -562,7 +565,7 @@ class JavaFieldsPlugin extends HeapViewP
                             return value == null || !fieldValue.equals(value.getValue());
                         }
                     };
-                    return new ProgressIterator(fieldInstanceIterator, index, true, _progress);
+                    return new ProgressIterator<>(fieldInstanceIterator, index, true, _progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.JavaFieldsPlugin_FieldHistogramMoreNodes(moreNodesCount);
@@ -651,7 +654,7 @@ class JavaFieldsPlugin extends HeapViewP
                             return !Objects.equals(_instance, ((ObjectFieldValue)value).getInstance());
                         }
                     };
-                    return new ProgressIterator(fieldInstanceIterator, index, true, _progress);
+                    return new ProgressIterator<>(fieldInstanceIterator, index, true, _progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.JavaFieldsPlugin_FieldHistogramMoreNodes(moreNodesCount);
@@ -673,7 +676,7 @@ class JavaFieldsPlugin extends HeapViewP
     
     // TODO: make JavaClass.getAllInstanceFields() public?
     private static List<Field> getAllInstanceFields(JavaClass jclass) {
-        List<Field> fields = new ArrayList(50);
+        List<Field> fields = new ArrayList<>(50);
 
         for (JavaClass jcls = jclass; jcls != null; jcls = jcls.getSuperClass()) {
             fields.addAll(jcls.getFields());
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -78,7 +78,7 @@ public abstract class JavaFieldsProvider
             }
             protected ProgressIterator<Integer> objectsIterator(int index, Progress progress) {
                 Iterator<Integer> iterator = integerIterator(index, fields.size());
-                return new ProgressIterator(iterator, index, false, progress);
+                return new ProgressIterator<>(iterator, index, false, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return Bundle.JavaFieldsProvider_MoreNodes(moreNodesCount);
@@ -142,7 +142,7 @@ public abstract class JavaFieldsProvider
             if (instance == null) return null;
             
             if (staticFields == instanceFields) {
-                List<FieldValue> fields = new ArrayList(instance.getFieldValues());
+                List<FieldValue> fields = new ArrayList<>(instance.getFieldValues());
                 fields.addAll(instance.getStaticFieldValues());
                 return fields;
             } else if (instanceFields) {
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaHeapFragmentProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaHeapFragmentProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaHeapFragmentProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaHeapFragmentProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -46,7 +46,7 @@ public class JavaHeapFragmentProvider ex
     public List<HeapFragment> getFragments(File heapDumpFile, Lookup.Provider heapDumpProject, Heap heap) throws IOException {
         if (heap.getJavaClassByName("java.lang.Object") == null) return null; // NOI18N
         
-        List<HeapFragment> fragments = new ArrayList();
+        List<HeapFragment> fragments = new ArrayList<>();
         int segments = HeapFactory.getTotalNumberOfSegments(heap);
         
         if (segments == 1) {
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaInstancesProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaInstancesProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaInstancesProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaInstancesProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -85,7 +85,7 @@ public class JavaInstancesProvider exten
             }
             protected ProgressIterator<Instance> objectsIterator(int index, Progress progress) {
                 Iterator<Instance> iterator = jclass.getInstancesIterator();
-                return new ProgressIterator(iterator, index, true, progress);
+                return new ProgressIterator<>(iterator, index, true, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return Bundle.JavaInstancesProvider_MoreNodes(moreNodesCount);
@@ -120,7 +120,7 @@ public class JavaInstancesProvider exten
             }
             protected ProgressIterator<Instance> objectsIterator(int index, Progress progress) {
                 Iterator<Instance> iterator = heap.getAllInstancesIterator();
-                return new ProgressIterator(iterator, index, true, progress);
+                return new ProgressIterator<>(iterator, index, true, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return Bundle.JavaInstancesProvider_MoreNodes(moreNodesCount);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaNodesRendererProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaNodesRendererProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaNodesRendererProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaNodesRendererProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaObjectsSummary.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaObjectsSummary.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaObjectsSummary.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaObjectsSummary.java	2025-04-17 09:07:34.000000000 +0000
@@ -329,7 +329,7 @@ class JavaObjectsSummary extends HeapVie
         
         new RequestProcessor("Objects Summary Worker").post(new Runnable() { // NOI18N
             public void run() {
-                List<JavaClass> allClasses = new ArrayList(heap.getAllClasses());
+                List<JavaClass> allClasses = new ArrayList<>(heap.getAllClasses());
                 
                 // --- Classes by Instances Count ------------------------------
                 Collections.sort(allClasses, new Comparator<JavaClass>() {
@@ -400,7 +400,7 @@ class JavaObjectsSummary extends HeapVie
     
     
     private void computeDominators(Heap heap, ResultsSnippet dominatorsByRetainedSize) {
-        List<Instance> dominators = new ArrayList(JavaClassesProvider.getDominatorRoots(heap));
+        List<Instance> dominators = new ArrayList<>(JavaClassesProvider.getDominatorRoots(heap));
         Collections.sort(dominators, new Comparator<Instance>() {
             @Override
             public int compare(Instance i1, Instance i2) {
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOpenNodeAction.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOpenNodeAction.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOpenNodeAction.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOpenNodeAction.java	2025-04-17 09:07:34.000000000 +0000
@@ -56,7 +56,7 @@ public class JavaOpenNodeAction extends
     public HeapViewerNodeAction[] getActions(HeapViewerNode node, HeapContext context, HeapViewerActions actions) {
         HeapContext javaContext = JavaHeapFragment.getJavaContext(context);
         
-        List<HeapViewerNodeAction> actionsList = new ArrayList(2);
+        List<HeapViewerNodeAction> actionsList = new ArrayList<>(2);
         
         HeapViewerNode nodeCopy = node.createCopy();
         actionsList.add(new OpenNodeAction(nodeCopy, javaContext, actions));
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOverviewSummary.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOverviewSummary.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOverviewSummary.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOverviewSummary.java	2025-04-17 09:07:34.000000000 +0000
@@ -280,7 +280,7 @@ class JavaOverviewSummary extends HeapVi
         if (sysprops == null) return null;
 //        if (sysprops == null) return new Object[][] { { "System properties not available", "" }};
         
-        Set<Map.Entry<Object, Object>> entries = new TreeSet(new Comparator<Map.Entry<Object, Object>>() {
+        Set<Map.Entry<Object, Object>> entries = new TreeSet<>(new Comparator<Map.Entry<Object, Object>>() {
             @Override
             public int compare(Map.Entry<Object, Object> e1, Map.Entry<Object, Object> e2) {
                 return e1.getKey().toString().compareTo(e2.getKey().toString());
@@ -362,7 +362,7 @@ class JavaOverviewSummary extends HeapVi
     private String computeModules(Heap heap) {
         JavaClass resolvedModulesClass = heap.getJavaClassByName("java.lang.module.ResolvedModule"); // NOI18N
         if (resolvedModulesClass != null) {
-            SortedSet<String> resolvedModules = new TreeSet(String.CASE_INSENSITIVE_ORDER);
+            SortedSet<String> resolvedModules = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
             List<Instance> modules = resolvedModulesClass.getInstances();
 
             for (Instance module : modules) {
@@ -375,7 +375,7 @@ class JavaOverviewSummary extends HeapVi
     }
 
     private String computeVMArgs(Heap heap) {
-        List<String> vmArgsList = new ArrayList();
+        List<String> vmArgsList = new ArrayList<>();
         JavaClass vmManagementClass = heap.getJavaClassByName("sun.management.VMManagementImpl"); // NOI18N
 
         if (vmManagementClass != null) {
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesPlugin.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesPlugin.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesPlugin.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesPlugin.java	2025-04-17 09:07:34.000000000 +0000
@@ -79,6 +79,7 @@ import org.graalvm.visualvm.lib.jfluid.h
 import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
 import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
 import org.graalvm.visualvm.lib.ui.UIUtils;
+import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
 import org.graalvm.visualvm.lib.ui.swing.renderer.LabelRenderer;
 import org.openide.util.Lookup;
 import org.openide.util.NbBundle;
@@ -125,10 +126,11 @@ class JavaReferencesPlugin extends HeapV
         
         heap = context.getFragment().getHeap();
         
+        TreeTableViewColumn count;
         TreeTableViewColumn[] columns = new TreeTableViewColumn[] {
             new TreeTableViewColumn.Name(),
             new TreeTableViewColumn.LogicalValue(),
-            new TreeTableViewColumn.Count(heap, true, true),
+            count = new TreeTableViewColumn.Count(heap, true, true),
             new TreeTableViewColumn.OwnSize(heap, false, false),
             new TreeTableViewColumn.RetainedSize(heap, false, false),
             new TreeTableViewColumn.ObjectID()
@@ -166,6 +168,7 @@ class JavaReferencesPlugin extends HeapV
 
 //                    if (!mergedReferences) return new HeapViewerNode[] { new TextNode(Bundle.JavaReferencesPlugin_NoReferencesFiltered()) };
                     
+                    ((HideableBarRenderer)count.getRenderer()).setMaxValue(wrapper.getInstancesCount());
                     return computeInstancesReferences(wrapper, root, heap, viewID, null, dataTypes, sortOrders, progress);
                 } else {
                     SwingUtilities.invokeLater(new Runnable() {
@@ -313,13 +316,13 @@ class JavaReferencesPlugin extends HeapV
     
     
     private static InterruptibleIterator<Instance> instancesIterator(InstancesWrapper instances) {
-        return new InterruptibleIterator(instances.getInstancesIterator());
+        return new InterruptibleIterator<>(instances.getInstancesIterator());
     }
     
     private HeapViewerNode[] computeInstancesReferences(final InstancesWrapper instances, RootNode root, Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
         HeapOperations.initializeReferences(heap);
         
-        final Map<Long, Integer> values = new HashMap();
+        final Map<Long, Integer> values = new HashMap<>();
         
         try {        
             progress.setupKnownSteps(instances.getInstancesCount());
@@ -329,7 +332,7 @@ class JavaReferencesPlugin extends HeapV
                 Instance instance = instancesI.next();
                 progress.step();
                 List<Value> references = instance.getReferences();
-                Set<Instance> referers = new HashSet();
+                Set<Instance> referers = new HashSet<>();
                 if (references.isEmpty()) {
                     referers.add(null);
                 } else for (Value reference : references) {
@@ -368,7 +371,7 @@ class JavaReferencesPlugin extends HeapV
             }
             protected ProgressIterator<Map.Entry<Long, Integer>> objectsIterator(int index, Progress progress) {
                 Iterator<Map.Entry<Long, Integer>> iterator = values.entrySet().iterator();
-                return new ProgressIterator(iterator, index, true, progress);
+                return new ProgressIterator<>(iterator, index, true, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return Bundle.JavaReferencesPlugin_MoreNodes(moreNodesCount);
@@ -463,7 +466,7 @@ class JavaReferencesPlugin extends HeapV
                             return true;
                         }
                     };
-                    return new ProgressIterator(fieldInstanceIterator, index, true, _progress);
+                    return new ProgressIterator<>(fieldInstanceIterator, index, true, _progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.JavaReferencesPlugin_IMoreNodes(moreNodesCount);
@@ -554,7 +557,7 @@ class JavaReferencesPlugin extends HeapV
                 }
                 protected ProgressIterator<Value> objectsIterator(int index, Progress progress) {
                     Iterator<Value> iterator = references.listIterator(index);
-                    return new ProgressIterator(iterator, index, false, progress);
+                    return new ProgressIterator<>(iterator, index, false, progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.JavaReferencesPlugin_MoreNodes(moreNodesCount);
@@ -577,7 +580,7 @@ class JavaReferencesPlugin extends HeapV
     }
     
     
-    private static final Set<String> COLLAPSED_ITEMS = new HashSet(Arrays.asList(new String[] {
+    private static final Set<String> COLLAPSED_ITEMS = new HashSet<>(Arrays.asList(new String[] {
         "java.util.HashMap$Node", // NOI18N
         "java.util.WeakHashMap$Entry" // NOI18N
     }));
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -93,7 +93,7 @@ public class JavaReferencesProvider exte
             }
             protected ProgressIterator<Value> objectsIterator(int index, Progress progress) {
                 Iterator<Value> iterator = references.listIterator(index);
-                return new ProgressIterator(iterator, index, false, progress);
+                return new ProgressIterator<>(iterator, index, false, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return Bundle.JavaReferencesProvider_MoreNodes(moreNodesCount);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsProvider.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsProvider.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -183,7 +183,7 @@ class JavaThreadsProvider {
     }
         
     static HeapViewerNode[] getThreadsNodes(RootNode rootNode, Heap heap) throws InterruptedException {
-        List<HeapViewerNode> threadNodes = new ArrayList();
+        List<HeapViewerNode> threadNodes = new ArrayList<>();
         
         Collection<GCRoot> roots = heap.getGCRoots();
         JavaClass vtClass = heap.getJavaClassByName("java.lang.VirtualThread");    // NOI18N
@@ -201,7 +201,7 @@ class JavaThreadsProvider {
                     Map<Integer,List<GCRoot>> localsMap = javaFrameMap.get(threadRoot);
 
                     ThreadInfo ti = new ThreadInfo(vtClass, threadInstance);
-                    final List<HeapViewerNode> stackFrameNodes = new ArrayList();
+                    final List<HeapViewerNode> stackFrameNodes = new ArrayList<>();
                     ThreadNode threadNode = new ThreadNode(ti.toString(), ti.getThreadState(), threadRoot.equals(oome), threadInstance) {
                         protected HeapViewerNode[] computeChildren(RootNode root) {
                             return stackFrameNodes.toArray(HeapViewerNode.NO_NODES);
@@ -211,7 +211,7 @@ class JavaThreadsProvider {
                     // -------------------------------------------------------------------
                     if(stack != null) {
                         for(int i = 0; i < stack.length; i++) {
-                            final List<HeapViewerNode> localVariableNodes = new ArrayList();
+                            final List<HeapViewerNode> localVariableNodes = new ArrayList<>();
                             if (localsMap != null) {
                                 List<GCRoot> locals = localsMap.get(i);
                                 if (locals != null) {
@@ -364,7 +364,7 @@ class JavaThreadsProvider {
     }
 
     private static Map<ThreadObjectGCRoot,Map<Integer,List<GCRoot>>> computeJavaFrameMap(Collection<GCRoot> roots) {
-        Map<ThreadObjectGCRoot,Map<Integer,List<GCRoot>>> javaFrameMap = new HashMap();
+        Map<ThreadObjectGCRoot,Map<Integer,List<GCRoot>>> javaFrameMap = new HashMap<>();
         
         for (GCRoot root : roots) {
             ThreadObjectGCRoot threadObj;
@@ -386,12 +386,12 @@ class JavaThreadsProvider {
             List<GCRoot> locals;
 
             if (stackMap == null) {
-                stackMap = new HashMap();
+                stackMap = new HashMap<>();
                 javaFrameMap.put(threadObj,stackMap);
             }
             locals = stackMap.get(frameNo);
             if (locals == null) {
-                locals = new ArrayList(2);
+                locals = new ArrayList<>(2);
                 stackMap.put(frameNo,locals);
             }
             locals.add(root);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsSummary.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsSummary.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsSummary.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsSummary.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaThreadsView.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaWindowsView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaWindowsView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaWindowsView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaWindowsView.java	2025-04-17 09:07:34.000000000 +0000
@@ -127,7 +127,7 @@ class JavaWindowsView extends HeapViewer
         
         this.estWindowCount = estWindowCount;
         
-        actionProviders = new ArrayList();
+        actionProviders = new ArrayList<>();
         for (HeapViewerNodeAction.Provider provider : Lookup.getDefault().lookupAll(HeapViewerNodeAction.Provider.class))
             if (provider.supportsView(context, FEATURE_ID)) actionProviders.add(provider);
     }
@@ -269,7 +269,7 @@ class JavaWindowsView extends HeapViewer
             public void run() {
                 final Heap heap = context.getFragment().getHeap();
 
-                final Collection<Instance> windows = new ArrayList();
+                final Collection<Instance> windows = new ArrayList<>();
                 windows.addAll(getVisibleFrames(heap));
                 windows.addAll(getVisibleDialogs(heap));
 
@@ -552,7 +552,7 @@ class JavaWindowsView extends HeapViewer
     private static Collection<Instance> getVisibleFrames(Heap heap) {
         Collection<JavaClass> framesC = HeapUtils.getSubclasses(heap, "java.awt.Frame"); // NOI18N
         
-        Collection<Instance> framesI = new ArrayList();
+        Collection<Instance> framesI = new ArrayList<>();
         for (JavaClass frameC : framesC) framesI.addAll(frameC.getInstances());
         
         return onlyVisible(framesI);
@@ -561,7 +561,7 @@ class JavaWindowsView extends HeapViewer
     private static Collection<Instance> getVisibleDialogs(Heap heap) {
         Collection<JavaClass> dialogsC = HeapUtils.getSubclasses(heap, "java.awt.Dialog"); // NOI18N
         
-        Collection<Instance> dialogsI = new ArrayList();
+        Collection<Instance> dialogsI = new ArrayList<>();
         for (JavaClass dialogC : dialogsC) dialogsI.addAll(dialogC.getInstances());
         
         return onlyVisible(dialogsI);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/PathToGCRootPlugin.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/PathToGCRootPlugin.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/PathToGCRootPlugin.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/PathToGCRootPlugin.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -82,6 +82,7 @@ import org.graalvm.visualvm.lib.jfluid.h
 import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
 import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
 import org.graalvm.visualvm.lib.ui.UIUtils;
+import org.graalvm.visualvm.lib.ui.swing.renderer.HideableBarRenderer;
 import org.graalvm.visualvm.lib.ui.swing.renderer.LabelRenderer;
 import org.graalvm.visualvm.lib.ui.swing.renderer.MultiRenderer;
 import org.graalvm.visualvm.lib.ui.swing.renderer.NormalBoldGrayRenderer;
@@ -128,10 +129,11 @@ public class PathToGCRootPlugin extends
         
         heap = context.getFragment().getHeap();
         
+        TreeTableViewColumn count;
         TreeTableViewColumn[] columns = new TreeTableViewColumn[] {
             new TreeTableViewColumn.Name(),
             new TreeTableViewColumn.LogicalValue(),
-            new TreeTableViewColumn.Count(heap, true, true),
+            count = new TreeTableViewColumn.Count(heap, true, true),
             new TreeTableViewColumn.OwnSize(heap, false, false),
             new TreeTableViewColumn.RetainedSize(heap, false, false),
             new TreeTableViewColumn.ObjectID()
@@ -191,6 +193,7 @@ public class PathToGCRootPlugin extends
                     data = computeInstanceRoots(instance, progress);
                     if (data != null) showingClass = false;
                 } else {
+                    ((HideableBarRenderer)count.getRenderer()).setMaxValue(wrapper.getInstancesCount());
                     data = computeInstancesRoots(wrapper.getInstancesIterator(), wrapper.getInstancesCount(), progress);
                     if (data != null) showingClass = true;
                 }
@@ -207,8 +210,8 @@ public class PathToGCRootPlugin extends
                         return node;
                     }
                     protected ProgressIterator<HeapViewerNode> objectsIterator(int index, Progress progress) {
-                        Iterator iterator = _data.iterator();
-                        return new ProgressIterator(iterator, index, true, progress);
+                        Iterator<HeapViewerNode> iterator = _data.iterator();
+                        return new ProgressIterator<>(iterator, index, true, progress);
                     }
                     protected String getMoreNodesString(String moreNodesCount)  {
                         return Bundle.PathToGCRootPlugin_MoreNodes(moreNodesCount);
@@ -420,7 +423,7 @@ public class PathToGCRootPlugin extends
     }
     
     private static Collection<HeapViewerNode> computeInstancesRoots(Iterator<Instance> instances, int count, Progress progress) throws InterruptedException {
-        Map<Instance, HeapViewerNode> gcRoots = new HashMap();
+        Map<Instance, HeapViewerNode> gcRoots = new HashMap<>();
         Map<Instance,Instance> gcRootCache = new HashMap<>();
         
         try {
@@ -493,7 +496,7 @@ public class PathToGCRootPlugin extends
         
 //        private final int maxNodes = UIThresholds.MAX_MERGED_OBJECTS;
         
-        private final List<Instance> instances = new ArrayList();
+        private final List<Instance> instances = new ArrayList<>();
         
         
         GCRootNode(Instance gcRoot) {
@@ -537,7 +540,7 @@ public class PathToGCRootPlugin extends
                 }
                 protected ProgressIterator<Instance> objectsIterator(int index, Progress progress) {
                     Iterator<Instance> iterator = instances.listIterator(index);
-                    return new ProgressIterator(iterator, index, false, progress);
+                    return new ProgressIterator<>(iterator, index, false, progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Bundle.GCRootNode_MoreNodes(moreNodesCount);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/ContainerNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/ContainerNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/ContainerNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/ContainerNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -64,7 +64,7 @@ public abstract class ContainerNode<T> e
         this.name = name;
         this.maxNodes = maxNodes;
         
-        items = new ArrayList();
+        items = new ArrayList<>();
     }
 
     public String getName() {
@@ -179,7 +179,7 @@ public abstract class ContainerNode<T> e
             }
             protected ProgressIterator<T> objectsIterator(int index, Progress progress) {
                 Iterator<T> iterator = items.listIterator(index);
-                return new ProgressIterator(iterator, index, false, progress);
+                return new ProgressIterator<>(iterator, index, false, progress);
             }
             protected String getMoreNodesString(String moreNodesCount)  {
                 return ContainerNode.this.getMoreNodesString(moreNodesCount);
@@ -261,7 +261,7 @@ public abstract class ContainerNode<T> e
                 }
                 protected ProgressIterator<T> objectsIterator(int index, Progress progress) {
                     Iterator<T> iterator = items.listIterator(index);
-                    return new ProgressIterator(iterator, index, false, progress);
+                    return new ProgressIterator<>(iterator, index, false, progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return ContainerNode.Nodes.this.getMoreNodesString(moreNodesCount);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/DataType.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/DataType.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/DataType.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/DataType.java	2025-04-17 09:07:34.000000000 +0000
@@ -78,7 +78,7 @@ public class DataType<T> {
     public static final DataType<HeapViewerNode> LOOP_ORIGIN = new DataType<>(HeapViewerNode.class, null, null);
     
     
-    static final Set<DataType> DEFAULT_TYPES = new HashSet(Arrays.asList(
+    static final Set<DataType> DEFAULT_TYPES = new HashSet<>(Arrays.asList(
         NAME, COUNT, OWN_SIZE, RETAINED_SIZE, LOGICAL_VALUE, OBJECT_ID,
         CLASS, INSTANCE, INSTANCES_WRAPPER, LOOP, LOOP_ORIGIN
     ));
@@ -146,13 +146,13 @@ public class DataType<T> {
         }
         
         public void notifyWhenAvailable(Heap heap, Runnable target) {
-            if (notifyTargets == null) notifyTargets = new WeakHashMap();
+            if (notifyTargets == null) notifyTargets = new WeakHashMap<>();
             Set<WeakReference<Runnable>> targetRefs = notifyTargets.get(heap);
             if (targetRefs == null) {
-                targetRefs = new HashSet();
+                targetRefs = new HashSet<>();
                 notifyTargets.put(heap, targetRefs);
             }
-            targetRefs.add(new WeakReference(target));
+            targetRefs.add(new WeakReference<>(target));
         }
 
         public T getNotAvailableValue() { return notAvailableValue; }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/HeapViewerNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/HeapViewerNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/HeapViewerNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/HeapViewerNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -227,12 +227,12 @@ public abstract class HeapViewerNode ext
 
     protected HeapViewerNode[] lazilyComputeChildren(Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
 
-        List<HeapViewerNode> nodes = new ArrayList();
+        List<HeapViewerNode> nodes = new ArrayList<>();
         Collection<? extends Provider> providers;
         
         RootNode root = RootNode.get(this);
-        if (root != null) providers = new ArrayList(root.getNodeProviders());
-        else providers = new ArrayList(Lookup.getDefault().lookupAll(Provider.class));
+        if (root != null) providers = new ArrayList<>(root.getNodeProviders());
+        else providers = new ArrayList<>(Lookup.getDefault().lookupAll(Provider.class));
 
         Iterator<? extends Provider> iproviders = providers.iterator();
         while (iproviders.hasNext())
@@ -251,10 +251,10 @@ public abstract class HeapViewerNode ext
     
     
     private static HeapViewerNode[] checkForLoops(HeapViewerNode parent, HeapViewerNode[] nodes) {
-        Map<HeapViewerNode, HeapViewerNode> pathToRoot = new HashMap();
+        Map<HeapViewerNode, HeapViewerNode> pathToRoot = new HashMap<>();
         while (parent != null) {
             pathToRoot.put(parent, parent);
-            parent = (HeapViewerNode)parent.getParent();
+            parent = parent.getParent();
         }
         
         for (int i = 0; i < nodes.length; i++) {
@@ -288,15 +288,15 @@ public abstract class HeapViewerNode ext
     
     // To be used for "temporary" nodes out of the tree structure (like providers returning first N nodes)
     public static <T> T getValue(HeapViewerNode node, DataType<T> type, Heap heap, HeapViewerNode parent) {
-        Object value = node.getValue(type, heap);
-        if (Objects.equals(value, type.getUnsupportedValue())) return (T)value;
-        if (value != null || type.getNoValue() == null) return (T)value;
+        T value = node.getValue(type, heap);
+        if (Objects.equals(value, type.getUnsupportedValue())) return value;
+        if (value != null || type.getNoValue() == null) return value;
         
         if (!type.valuesAvailable(heap)) return type.getNotAvailableValue();
         
         if (node.foreignValues != null) {
-            value = node.foreignValues.get(type);
-            if (value != null) return value == NO_VALUE ? null : (T)value;
+            value = (T) node.foreignValues.get(type);
+            if (value != null) return value == NO_VALUE ? null : value;
         }
         
         RootNode root = RootNode.get(parent != null ? parent : node);
@@ -309,10 +309,10 @@ public abstract class HeapViewerNode ext
                 value = providers.next().getValue(node, type, heap);
         }
         
-        if (node.foreignValues == null) node.foreignValues = new IdentityHashMap(1);
+        if (node.foreignValues == null) node.foreignValues = new IdentityHashMap<>(1);
         node.foreignValues.put(type, value == null ? NO_VALUE : value);
         
-        return (T)value;
+        return value;
     }
     
     
@@ -347,7 +347,7 @@ public abstract class HeapViewerNode ext
     }
     
     public static TreePath fromNode(TreeNode node, TreeNode root) {
-        List l = new ArrayList();
+        List<TreeNode> l = new ArrayList<>();
         while (node != root) {
             l.add(0, node);
             node = node.getParent();
@@ -370,7 +370,7 @@ public abstract class HeapViewerNode ext
         
         @Override
         protected HeapViewerNode[] lazilyComputeChildren(Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
-            HeapViewerNode parent = (HeapViewerNode)getParent();
+            HeapViewerNode parent = getParent();
             HeapViewerNode[] n = provider.getNodes(parent, heap, viewID, viewFilter, dataTypes, sortOrders, progress);
             return n != null ? checkForLoops(parent, n) : NO_NODES;
         }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/NodesCache.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/NodesCache.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/NodesCache.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/NodesCache.java	2025-04-17 09:07:34.000000000 +0000
@@ -57,8 +57,8 @@ public final class NodesCache {
     private Map<NodeKey, HeapViewerNode[]> getCache() {
         Map<NodeKey, HeapViewerNode[]> c = cache == null ? null : cache.get();
         if (c == null) {
-            c = new HashMap();
-            cache = new WeakReference(c);
+            c = new HashMap<>();
+            cache = new WeakReference<>(c);
         }
         return c;
     }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/Progress.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/Progress.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/Progress.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/Progress.java	2025-04-17 09:07:34.000000000 +0000
@@ -128,7 +128,7 @@ public final class Progress {
     public void addChangeListener(final Listener listener) {
         UIUtils.runInEventDispatchThread(new Runnable() {
             public void run() {
-                if (listeners == null) listeners = new HashSet();
+                if (listeners == null) listeners = new HashSet<>();
                 listeners.add(listener);
             }
         });
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/RootNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/RootNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/RootNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/RootNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -120,7 +120,7 @@ public abstract class RootNode extends H
         if (nodeProviders == null) {
             nodeProviders = Lookup.getDefault().lookupAll(HeapViewerNode.Provider.class);
             if (!nodeProviders.isEmpty()) {
-                nodeProviders = new ArrayList(nodeProviders);
+                nodeProviders = new ArrayList<>(nodeProviders);
                 Iterator<? extends HeapViewerNode.Provider> providers = nodeProviders.iterator();
                 Heap heap = getContext().getFragment().getHeap();
                 String viewID = getViewID();
@@ -138,7 +138,7 @@ public abstract class RootNode extends H
         if (valueProviders == null) {
             valueProviders = Lookup.getDefault().lookupAll(DataType.ValueProvider.class);
             if (!valueProviders.isEmpty()) {
-                valueProviders = new ArrayList(valueProviders);
+                valueProviders = new ArrayList<>(valueProviders);
                 Iterator<? extends DataType.ValueProvider> providers = valueProviders.iterator();
                 Heap heap = getContext().getFragment().getHeap();
                 String viewID = getViewID();
@@ -154,7 +154,7 @@ public abstract class RootNode extends H
     public static RootNode get(HeapViewerNode node) {
         while (node != null) {
             if (node instanceof RootNode) return (RootNode)node;
-            node = (HeapViewerNode)node.getParent();
+            node = node.getParent();
         }
         return null;
     }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/CustomOQLQueries.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/CustomOQLQueries.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/CustomOQLQueries.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/CustomOQLQueries.java	2025-04-17 09:07:34.000000000 +0000
@@ -89,7 +89,7 @@ public final class CustomOQLQueries {
     }
     
     public synchronized List<OQLQuery> list() {
-        List<OQLQuery> list = new ArrayList();
+        List<OQLQuery> list = new ArrayList<>();
         for (OQLQuery query : customQueries)
             list.add(new OQLQuery(query.getScript(), query.getName(), query.getDescription()));
         return list;
@@ -147,7 +147,7 @@ public final class CustomOQLQueries {
     private CustomOQLQueries() {
         assert !SwingUtilities.isEventDispatchThread();
         
-        customQueries = new ArrayList();
+        customQueries = new ArrayList<>();
         
         try {
             Properties p = new Properties();
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLConsoleView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLConsoleView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLConsoleView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLConsoleView.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -589,7 +589,7 @@ public class OQLConsoleView extends Heap
                             htmlToolbar.add(new GrayLabel(Bundle.OQLConsoleView_ResultsLimit()));
                             htmlToolbar.addSpace(3);
                             
-                            Set<Integer> limits = new TreeSet();
+                            Set<Integer> limits = new TreeSet<>();
                             limits.add(10);
                             limits.add(100);
                             limits.add(1000);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLEditorComponent.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLEditorComponent.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLEditorComponent.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLEditorComponent.java	2025-04-17 09:07:34.000000000 +0000
@@ -360,7 +360,7 @@ public class OQLEditorComponent extends
     
     private static class FollowingCaret implements Caret {
                 
-        private final List<ChangeListener> listeners = new ArrayList();
+        private final List<ChangeListener> listeners = new ArrayList<>();
         private int dot;
 
         FollowingCaret(final JTextComponent tc) {
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueries.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueries.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueries.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueries.java	2025-04-17 09:07:34.000000000 +0000
@@ -338,7 +338,7 @@ final class OQLQueries {
                             public void run() {
                                 handler.querySelected(query);
                         
-                                if (externalQueries == null) externalQueries = new ArrayList(EXTERNAL_QUERIES_CACHE);
+                                if (externalQueries == null) externalQueries = new ArrayList<>(EXTERNAL_QUERIES_CACHE);
                                 if (containsQuery(externalQueries, query)) return;
 
                                 if (externalQueries.size() == EXTERNAL_QUERIES_CACHE)
@@ -425,7 +425,7 @@ final class OQLQueries {
                         public void run() {
                             if (handler != null) handler.querySelected(query);
 
-                            if (externalQueries == null) externalQueries = new ArrayList(EXTERNAL_QUERIES_CACHE);
+                            if (externalQueries == null) externalQueries = new ArrayList<>(EXTERNAL_QUERIES_CACHE);
                             if (containsQuery(externalQueries, query)) return;
 
                             if (externalQueries.size() == EXTERNAL_QUERIES_CACHE)
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueryExecutor.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueryExecutor.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueryExecutor.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/oql/OQLQueryExecutor.java	2025-04-17 09:07:34.000000000 +0000
@@ -186,7 +186,7 @@ class OQLQueryExecutor {
                 }
                 protected ProgressIterator<Object> objectsIterator(int index, Progress progress) {
                     Iterator<Object> iterator = queryObjects.iterator();
-                    return new ProgressIterator(iterator, index, true, progress);
+                    return new ProgressIterator<>(iterator, index, true, progress);
                 }
                 protected String getMoreNodesString(String moreNodesCount)  {
                     return Messages.getMoreNodesString(moreNodesCount);
@@ -204,8 +204,8 @@ class OQLQueryExecutor {
             try {
                 progress.setupUnknownSteps();
                 
-                List<InstancesContainer.Objects> cnodes = new ArrayList();
-                Map<String, InstancesContainer.Objects> classes = new HashMap();
+                List<InstancesContainer.Objects> cnodes = new ArrayList<>();
+                Map<String, InstancesContainer.Objects> classes = new HashMap<>();
                 for (Object object : queryObjects) {
                     progress.step();
 
@@ -237,8 +237,8 @@ class OQLQueryExecutor {
                     return cnodes.isEmpty() ? new HeapViewerNode[] { new TextNode(Messages.getNoObjectsString(viewFilter)) } :
                                                   cnodes.toArray(HeapViewerNode.NO_NODES);
                 } else {
-                    List<HeapViewerNode> pnodes = new ArrayList();
-                    Map<String, ClassesContainer.ContainerNodes> packages = new HashMap();
+                    List<HeapViewerNode> pnodes = new ArrayList<>();
+                    Map<String, ClassesContainer.ContainerNodes> packages = new HashMap<>();
                     for (InstancesContainer.Objects cnode : cnodes) {
                         // progress.step(); // NOTE: aggregating classes by package should be fast
                         String className = cnode.getName();
@@ -270,7 +270,7 @@ class OQLQueryExecutor {
     private void runQuery(String queryString) {
         new RequestProcessor("OQL Query Processor").post(new Runnable() { // NOI18N
             public void run() {
-                if (queryObjects == null) queryObjects = new HashSet();
+                if (queryObjects == null) queryObjects = new HashSet<>();
                 queryObjects.clear();
                 hasObjectsResults = false;
                 
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/swing/MultiSplitContainer.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/swing/MultiSplitContainer.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/swing/MultiSplitContainer.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/swing/MultiSplitContainer.java	2025-04-17 09:07:34.000000000 +0000
@@ -49,9 +49,9 @@ public class MultiSplitContainer extends
     private static final int DIVIDER_SIZE = 6;
     private static final Color SEPARATOR_COLOR = UIManager.getColor("Separator.foreground"); // NOI18N
     
-    private final Map<Component, Double> componentsWeights = new HashMap();
-    private final List<Integer> dividerOffsets = new ArrayList();
-    private final List<Component> visibleComponents = new ArrayList();
+    private final Map<Component, Double> componentsWeights = new HashMap<>();
+    private final List<Integer> dividerOffsets = new ArrayList<>();
+    private final List<Component> visibleComponents = new ArrayList<>();
     
     private final MouseHandler mHandler;
     
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HTMLView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HTMLView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HTMLView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HTMLView.java	2025-04-17 09:07:34.000000000 +0000
@@ -90,7 +90,7 @@ public class HTMLView {
         this.actions = actions;
         this.currentText = initialText;
         
-        actionProviders = new ArrayList();
+        actionProviders = new ArrayList<>();
         for (HeapViewerNodeAction.Provider provider : Lookup.getDefault().lookupAll(HeapViewerNodeAction.Provider.class))
             if (provider.supportsView(context, viewID)) actionProviders.add(provider);
     }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HeapViewerNodeAction.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HeapViewerNodeAction.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HeapViewerNodeAction.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/HeapViewerNodeAction.java	2025-04-17 09:07:34.000000000 +0000
@@ -87,7 +87,7 @@ public abstract class HeapViewerNodeActi
             HeapViewerNode loop = HeapViewerNode.getValue(node, DataType.LOOP, context.getFragment().getHeap());
             if (loop != null) node = loop;
             
-            List<HeapViewerNodeAction> actionsList = new ArrayList();
+            List<HeapViewerNodeAction> actionsList = new ArrayList<>();
             for (HeapViewerNodeAction.Provider provider : actionProviders) {
                 HeapViewerNodeAction[] providerActions = provider.getActions(node, context, actions);
                 if (providerActions != null) Collections.addAll(actionsList, providerActions);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/PluggableTreeTableView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/PluggableTreeTableView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/PluggableTreeTableView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/PluggableTreeTableView.java	2025-04-17 09:07:34.000000000 +0000
@@ -76,7 +76,7 @@ public class PluggableTreeTableView exte
     public PluggableTreeTableView(String viewID, HeapContext context, HeapViewerActions actions, boolean useBreadCrumbs, boolean pluggableColumns, TreeTableViewColumn... columns) {
         super(viewID, context, actions, useBreadCrumbs, pluggableColumns, columns);
         
-        plugins = new ArrayList();
+        plugins = new ArrayList<>();
         Collection<? extends HeapViewPlugin.Provider> pluginProviders = Lookup.getDefault().lookupAll(HeapViewPlugin.Provider.class);
         for (HeapViewPlugin.Provider provider : pluginProviders) {
             HeapViewPlugin plugin = provider.createPlugin(context, actions, viewID);
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/SummaryView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/SummaryView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/SummaryView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/SummaryView.java	2025-04-17 09:07:34.000000000 +0000
@@ -66,11 +66,11 @@ public class SummaryView {
         this.context = context;
         this.actions = actions;
         
-        actionProviders = new ArrayList();
+        actionProviders = new ArrayList<>();
         for (HeapViewerNodeAction.Provider provider : Lookup.getDefault().lookupAll(HeapViewerNodeAction.Provider.class))
             if (provider.supportsView(context, viewID)) actionProviders.add(provider);
         
-        content = new ArrayList();
+        content = new ArrayList<>();
         Collection<? extends ContentProvider> providers = Lookup.getDefault().lookupAll(ContentProvider.class);
         for (ContentProvider provider : providers) {
             HeapView summary = provider.createSummary(this.viewID, this.context, this.actions, this.actionProviders);
@@ -112,7 +112,7 @@ public class SummaryView {
             if (viewToolbar != null) toolbar.add(viewToolbar);
         }
         
-        uiCreated(new ArrayList(content));
+        uiCreated(new ArrayList<>(content));
         
         component = new ScrollableContainer(p);
         
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableView.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableView.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableView.java	2025-04-17 09:07:34.000000000 +0000
@@ -151,7 +151,7 @@ public class TreeTableView {
         };
         currentRoot = root;
         
-        this.columns = new ArrayList();
+        this.columns = new ArrayList<>();
         
         // Add own columns defined in constructor
         if (columns != null) Collections.addAll(this.columns, columns);
@@ -169,11 +169,11 @@ public class TreeTableView {
             }
         });
         
-        rendererProviders = new ArrayList();
+        rendererProviders = new ArrayList<>();
         for (HeapViewerRenderer.Provider provider : Lookup.getDefault().lookupAll(HeapViewerRenderer.Provider.class))
             if (provider.supportsView(context, viewID)) rendererProviders.add(provider);
         
-        actionProviders = new ArrayList();
+        actionProviders = new ArrayList<>();
         for (HeapViewerNodeAction.Provider provider : Lookup.getDefault().lookupAll(HeapViewerNodeAction.Provider.class))
             if (provider.supportsView(context, viewID)) actionProviders.add(provider);
         
@@ -403,7 +403,7 @@ public class TreeTableView {
     
     private TreeTableViewRenderer getNodesRenderer() {
         if (nodesRenderer == null) {
-            Map<Class<? extends HeapViewerNode>, HeapViewerRenderer> map = new HashMap();
+            Map<Class<? extends HeapViewerNode>, HeapViewerRenderer> map = new HashMap<>();
             nodesRenderer = new TreeTableViewRenderer();
             for (HeapViewerRenderer.Provider provider : rendererProviders) {
                 map.clear();
@@ -520,7 +520,7 @@ public class TreeTableView {
 //        List<? extends RowSorter.SortKey> sortKeys = Collections.singletonList(sortKey);
             sortKeys = Collections.singletonList(sortKey);
         } else {
-            sortKeys = Collections.EMPTY_LIST;
+            sortKeys = Collections.emptyList();
         }
         updateSortInfo(sortKeys);
         
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableViewRenderer.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableViewRenderer.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableViewRenderer.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableViewRenderer.java	2025-04-17 09:07:34.000000000 +0000
@@ -55,7 +55,7 @@ class TreeTableViewRenderer implements P
     // Don't make this static, leaks the last rendered value -> model -> UI -> Universe
     private /*static*/ final HeapViewerRenderer FALLBACK = new FallbackRenderer();
     
-    private final Map<Class<? extends HeapViewerNode>, HeapViewerRenderer> lookup = new HashMap();
+    private final Map<Class<? extends HeapViewerNode>, HeapViewerRenderer> lookup = new HashMap<>();
     
     private ProfilerRenderer current = FALLBACK;
     
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapOperations.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapOperations.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapOperations.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapOperations.java	2025-04-17 09:07:34.000000000 +0000
@@ -57,7 +57,7 @@ public final class HeapOperations {
     
     
     private static synchronized HeapOperations get(Heap heap) {
-        if (INSTANCES == null) INSTANCES = new WeakHashMap();
+        if (INSTANCES == null) INSTANCES = new WeakHashMap<>();
         
         HeapOperations instance = INSTANCES.get(heap);
         if (instance == null) {
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapUtils.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapUtils.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapUtils.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/HeapUtils.java	2025-04-17 09:07:34.000000000 +0000
@@ -59,7 +59,7 @@ public final class HeapUtils {
    // --- Heap utils ----------------------------------------------------------
     
     public static Collection<JavaClass> getSubclasses(Heap heap, String baseClass) {
-        Set<JavaClass> subclasses = new HashSet();
+        Set<JavaClass> subclasses = new HashSet<>();
 
         String escapedClassName = "\\Q" + baseClass + "\\E"; // NOI18N
         Collection<JavaClass> jClasses = heap.getJavaClassesByRegExp(escapedClassName);
@@ -77,7 +77,7 @@ public final class HeapUtils {
     }
     
 //    public static Map<String, Object> getValuesOfFields(Instance instance, String... fields) {
-//        Map<String, Object> values = new HashMap();
+//        Map<String, Object> values = new HashMap<>();
 //        for (String field : fields) values.put(field, null);
 //        
 //        List<FieldValue> fieldValues = instance.getFieldValues();
@@ -98,7 +98,7 @@ public final class HeapUtils {
     public static Object[] getValuesOfFields(Instance instance, String... fields) {
         Object[] values = new Object[fields.length];
         
-        Map<String, Integer> fieldsM = new HashMap();
+        Map<String, Integer> fieldsM = new HashMap<>();
         for (int i = 0; i < fields.length; i++) fieldsM.put(fields[i], i);
         
         List<FieldValue> fieldValues = instance.getFieldValues();
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/MoreObjectsNode.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/MoreObjectsNode.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/MoreObjectsNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/MoreObjectsNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -323,7 +323,7 @@ abstract class MoreObjectsNode<T> extend
                 }
             } else {
                 Random r = new Random(type*7);
-                SortedSet<Integer> idSet = new TreeSet();
+                SortedSet<Integer> idSet = new TreeSet<>();
                 while (idSet.size() < count) {
                      idSet.add(r.nextInt(objectsCount));
                 }
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/NodesComputer.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/NodesComputer.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/NodesComputer.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/NodesComputer.java	2025-04-17 09:07:34.000000000 +0000
@@ -246,7 +246,7 @@ public abstract class NodesComputer<T> {
         private final Iterator<T> iterator;
         
         PlainObjectsIterator(int index, Progress progress) {
-            this.iterator = new InterruptibleIterator(objectsIterator(index, progress));
+            this.iterator = new InterruptibleIterator<>(objectsIterator(index, progress));
             totalItems = index;
             firstOwnItem = index;
         }
@@ -274,7 +274,7 @@ public abstract class NodesComputer<T> {
         private T nextObject;
         
         FilteredObjectsIterator(int index, int knownFirstOwnItem, int knownTotalOwnItems, HeapViewerNodeFilter viewFilter, Heap heap, Progress progress) {
-            this.iterator = new InterruptibleIterator(objectsIterator(knownFirstOwnItem, progress));
+            this.iterator = new InterruptibleIterator<>(objectsIterator(knownFirstOwnItem, progress));
             this.knownTotalOwnItems = knownTotalOwnItems;
             
             this.viewFilter = viewFilter;
@@ -325,7 +325,7 @@ public abstract class NodesComputer<T> {
         private final Iterator<T> iterator;
         
         PlainNodesIterator(int index, Progress progress) {
-            this.iterator = new InterruptibleIterator(objectsIterator(index, progress));
+            this.iterator = new InterruptibleIterator<>(objectsIterator(index, progress));
         }
         
         public boolean hasNext() {
@@ -349,7 +349,7 @@ public abstract class NodesComputer<T> {
         private HeapViewerNode nextNode;
         
         FilteredNodesIterator(int index, HeapViewerNodeFilter viewFilter, Heap heap, Progress progress) {
-            this.iterator = new InterruptibleIterator(objectsIterator(0, progress));
+            this.iterator = new InterruptibleIterator<>(objectsIterator(0, progress));
             
             this.viewFilter = viewFilter;
             this.heap = heap;
diff -pruN 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/SortedObjectsBuffer.java 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/SortedObjectsBuffer.java
--- 2.1.10-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/SortedObjectsBuffer.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/SortedObjectsBuffer.java	2025-04-17 09:07:34.000000000 +0000
@@ -156,7 +156,7 @@ abstract class SortedObjectsBuffer<T> {
     }
     
     private Wrapper<T> createWrapper(T obj, Object val) {
-        return new Wrapper(wrapperSerialId++, obj,val);
+        return new Wrapper<>(wrapperSerialId++, obj,val);
     }
     
     private int compare(Object value1, Object value2) {
diff -pruN 2.1.10-1/visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/dynamicobject/DynamicObject.java 2.2-1/visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/dynamicobject/DynamicObject.java
--- 2.1.10-1/visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/dynamicobject/DynamicObject.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/heapviewer.truffle/src/org/graalvm/visualvm/heapviewer/truffle/dynamicobject/DynamicObject.java	2025-04-17 09:07:34.000000000 +0000
@@ -58,6 +58,7 @@ public class DynamicObject extends Truff
     private static final String ENTERPRISE_PACKAGE = "com.oracle.truffle.object.enterprise"; // NOI18N
     private static final String ENTERPRISE_LOCATION_TOP_CLASS = ENTERPRISE_PACKAGE+".EnterpriseLocations"; // NOI18N
     private static final String ENTERPRISE_FIELD_LOCATION_FQN = ENTERPRISE_LOCATION_TOP_CLASS+"$FieldLocation"; // NOI18N
+    private static final String ENTERPRISE_FIELD_INFO_FQN = ENTERPRISE_PACKAGE + ".EnterpriseLayout$FieldInfo"; // NOI18N
     private static final String PROPERTY_MAP_FQN = "com.oracle.truffle.object.ConsListPropertyMap"; // NOI18N
     private static final String TRIE_PROPERTY_MAP_FQN = "com.oracle.truffle.object.TriePropertyMap"; // NOI18N
     private static final String PROPERTY_FQN = "com.oracle.truffle.object.PropertyImpl"; // NOI18N
@@ -434,6 +435,24 @@ public class DynamicObject extends Truff
         return isSubClassOf(dynObj, ENTERPRISE_FIELD_LOCATION_FQN);
     }
 
+    private static boolean isEterpriseFieldInfoObjSubClass(Instance dynObj) {
+        if (dynObj != null)
+            return ENTERPRISE_FIELD_INFO_FQN.equals(dynObj.getJavaClass().getName());
+        return false;
+    }
+
+    private static boolean hasFieldInfo(Instance loc) {
+        for (FieldValue fv : loc.getFieldValues()) {
+            if (fv instanceof ObjectFieldValue) {
+                Instance fi = ((ObjectFieldValue)fv).getInstance();
+                if (isEterpriseFieldInfoObjSubClass(fi)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     private static class Property implements Field {
 
         Instance property;
@@ -758,7 +777,7 @@ public class DynamicObject extends Truff
                 arr =  (PrimitiveArrayInstance) dynamicObject.getValueOfField("extVal");    // NOI18N
             } else {
                 ObjectFieldValue arrayVal = (ObjectFieldValue) getValueImpl(actualLoc, dynamicObject);
-                arr = (PrimitiveArrayInstance) ((ObjectFieldValue)arrayVal).getInstance();
+                arr = (PrimitiveArrayInstance)arrayVal.getInstance();
             }
             return arr;
         }
@@ -841,7 +860,7 @@ public class DynamicObject extends Truff
                 Instance actualLoc = (Instance) loc.getValueOfField("arrayLocation");   // NOI18N
                 Boolean allowInt = (Boolean) loc.getValueOfField("allowInt");   // NOI18N
 
-                return getObfuscatedEnterpriseArrayLocation(dynamicObject, loc, index, actualLoc, allowInt);
+                return getObfuscatedEnterpriseArrayLocation(dynamicObject, index, actualLoc, allowInt);
             }
             if (loc.getValueOfField("index") != null && loc.getValueOfField("offset") != null) {    // NOI18N
                 Integer index = (Integer)loc.getValueOfField("index");   // NOI18N
@@ -874,6 +893,31 @@ public class DynamicObject extends Truff
                     return getObfuscatedEnterpriseFieldLocation(dynamicObject, loc, locIndex, locType, locAllowInt);
                 }
             }
+            if (hasFieldInfo(loc)) {
+                Integer locIndex = null;
+                Instance finfo = null;
+                Boolean locAllowInt = null;
+
+                for (Object obj : fields) {
+                    FieldValue fv = (FieldValue) obj;
+                    Field f = fv.getField();
+                    String typeName = f.getType().getName();
+
+                    if ("object".equals(typeName)) {   // NOI18N
+                        Instance val = ((ObjectFieldValue)fv).getInstance();
+                        if (isEterpriseFieldInfoObjSubClass(val)) {
+                            finfo = val;
+                        }
+                    } else if ("boolean".equals(typeName) && fields.size()==3 && f.getDeclaringClass().getSubClasses().size()==1) {
+                        locAllowInt = (Boolean) loc.getValueOfField(f.getName());
+                    } else if ("int".equals(typeName)) {   // NOI18N
+                        locIndex = (Integer) loc.getValueOfField(f.getName());
+                    }
+                }
+                if (locIndex != null && finfo != null) {
+                    return getObfuscatedEnterpriseFieldLocation(dynamicObject, loc, locIndex, finfo, locAllowInt);
+                }
+            }
             if (fields.size() >= 2) {
                 // ArrayLocation
                 Integer locIndex = null;
@@ -890,30 +934,33 @@ public class DynamicObject extends Truff
                         if (isLocationObjSubClass(val)) {
                             locArrayLocation = val;
                         }
-                    }
-                    if ("boolean".equals(typeName) && fields.size()==3 && f.getDeclaringClass().getSubClasses().size()==2) {
+                    } else if ("boolean".equals(typeName) && fields.size()==3 && f.getDeclaringClass().getSubClasses().size()==2) {
                         locAllowInt = (Boolean) loc.getValueOfField(f.getName());
-                    }
-                    if ("int".equals(typeName)) {   // NOI18N
+                    } else if ("int".equals(typeName)) {   // NOI18N
                         locIndex = (Integer) loc.getValueOfField(f.getName());
                     }
                 }
-                if (locIndex != null && locArrayLocation != null) {
-                    return getObfuscatedEnterpriseArrayLocation(dynamicObject, loc, locIndex, locArrayLocation, locAllowInt);
+                if (locIndex != null) {
+                    return getObfuscatedEnterpriseArrayLocation(dynamicObject, locIndex, locArrayLocation, locAllowInt);
                 }
             }
             if (fields.size() == 1) {
                 // obfuscated static property location
                 isStatic = true;
-                FieldValue staticFieldVal = (FieldValue) fields.get(0);
+                FieldValue staticFieldVal = fields.get(0);
                 return createFieldValue(dynamicObject, staticFieldVal);
             }
             return null;
         }
 
-        private FieldValue getObfuscatedEnterpriseArrayLocation(Instance dynamicObject, Instance loc, Integer index, Instance actualLoc, Boolean allowInt) {
-            ObjectFieldValue arrayVal = (ObjectFieldValue) getValueImpl(actualLoc, dynamicObject);
-            Instance array = arrayVal.getInstance();
+        private FieldValue getObfuscatedEnterpriseArrayLocation(Instance dynamicObject, Integer index, Instance actualLoc, Boolean allowInt) {
+            Instance array;
+            if (actualLoc != null) {
+                ObjectFieldValue arrayVal = (ObjectFieldValue) getValueImpl(actualLoc, dynamicObject);
+                array = arrayVal.getInstance();
+            } else {
+                array = getEnterpriseObjectStore(dynamicObject);
+            }
             if (array instanceof PrimitiveArrayInstance) {
                 PrimitiveArrayInstance arr = (PrimitiveArrayInstance) array;
                 if (allowInt != null) {
@@ -929,7 +976,29 @@ public class DynamicObject extends Truff
             return null;
         }
 
-        private FieldValue getObfuscatedEnterpriseFieldLocation(Instance dynamicObject, Instance loc, Integer index, Instance type, Boolean allowInt) {
+        private FieldValue getObfuscatedEnterpriseFieldLocation(Instance dynamicObject, Instance loc, Integer index, Instance field_type, Boolean allowInt) {
+            Instance type = field_type;
+            if (isEterpriseFieldInfoObjSubClass(field_type)) {
+                String fieldName = null;
+                JavaClass fieldType = null;
+                for (FieldValue fv : field_type.getFieldValues()) {
+                    if (fv instanceof ObjectFieldValue) {
+                        Instance val = ((ObjectFieldValue)fv).getInstance();
+                        if (val == null) continue;
+                        String valName = val.getJavaClass().getName();
+                        if (valName.equals(String.class.getName())) {
+                            fieldName = DetailsSupport.getDetailsString(val);
+                        } else if ("tclass".equals(fv.getField().getName())) {
+                            type = val;
+                        } else if (valName.equals(Class.class.getName())) {
+                            fieldType = val.getJavaClass().getHeap().getJavaClassByID(val.getInstanceId());
+                        }
+                    }
+                }
+                assert type.getInstanceId() == dynamicObject.getJavaClass().getJavaClassId();
+                if (fieldName != null)
+                    return getDynamicObjectField(dynamicObject, fieldName, fieldType);
+            }
             if (type != null) { // TypedObjectFieldLocation
                 if (index.intValue() == 0) { // test for type Object[]
                     long typeClassId = type.getInstanceId();  // NOI18N
@@ -993,6 +1062,15 @@ public class DynamicObject extends Truff
             return false;
         }
 
+        private FieldValue getDynamicObjectField(Instance dynamicObject, String fname, JavaClass fieldType) {
+             for (FieldValue fv : dynamicObject.getFieldValues()) {
+                 if (fv.getField().getName().equals(fname)) {
+                     return createFieldValue(dynamicObject, fv);
+                 }
+             }
+             throw new IllegalArgumentException(fname);
+        }
+
         private FieldValue getDynamicObjectPrimitiveField(Instance dynamicObject, int index) {
             return getDynamicObjectField(dynamicObject, index, false);
         }
diff -pruN 2.1.10-1/visualvm/hostremote/nbproject/project.xml 2.2-1/visualvm/hostremote/nbproject/project.xml
--- 2.1.10-1/visualvm/hostremote/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/hostremote/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -39,7 +39,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
+                        <specification-version>2.4</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/hostremote/src/org/graalvm/visualvm/host/remote/model/RemoteHostOverview.java 2.2-1/visualvm/hostremote/src/org/graalvm/visualvm/host/remote/model/RemoteHostOverview.java
--- 2.1.10-1/visualvm/hostremote/src/org/graalvm/visualvm/host/remote/model/RemoteHostOverview.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/hostremote/src/org/graalvm/visualvm/host/remote/model/RemoteHostOverview.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,6 @@ import org.graalvm.visualvm.host.model.H
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
@@ -216,7 +215,7 @@ class RemoteHostOverview extends HostOve
             JmxModel jmx = JmxModelFactory.getJmxModelFor(app);
             
             if (jmx != null && jmx.getConnectionState().equals(JmxModel.ConnectionState.CONNECTED)) {
-                JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmx);
+                JvmMXBeans mxbeans = jmx.getJvmMXBeans();
                 connection = jmx.getMBeanServerConnection();
                 
                 if (mxbeans != null && connection != null) {
diff -pruN 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/browser/BrowserNode.java 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/browser/BrowserNode.java
--- 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/browser/BrowserNode.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/browser/BrowserNode.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/environment/EnvironmentViewSupport.java 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/environment/EnvironmentViewSupport.java
--- 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/environment/EnvironmentViewSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/environment/EnvironmentViewSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/CPUSamplerViewSupport.java 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/CPUSamplerViewSupport.java
--- 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/CPUSamplerViewSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/CPUSamplerViewSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -78,6 +78,7 @@ final class CPUSamplerViewSupport {
         
         private List<JFREventWithStack> data;
         private Set<String> ignoredEvents;
+        private JFRThreadInfoSupport tiSupport;
         
         
         CPUViewSupport(JFRModel model) {
@@ -95,6 +96,7 @@ final class CPUSamplerViewSupport {
             if (hasData) {
                 data = new ArrayList<>();
                 ignoredEvents = new HashSet<>();
+                tiSupport = new JFRThreadInfoSupport();
             }
         }
 
@@ -104,7 +106,7 @@ final class CPUSamplerViewSupport {
             
             try {
                 if (!ignoredEvents.contains(typeName))
-                    data.add(new JFREventWithStack(typeName, event, model));
+                    data.add(new JFREventWithStack(typeName, event, model, tiSupport));
             } catch (JFRPropertyNotAvailableException e) {
                 ignoredEvents.add(typeName);
             }
@@ -132,6 +134,7 @@ final class CPUSamplerViewSupport {
 
                 data = null;
                 ignoredEvents = null;
+                tiSupport = null;
                 threads = null;
 
                 try {
@@ -200,7 +203,7 @@ final class CPUSamplerViewSupport {
         private final Map<String, Object> threadInfo;
         
         
-        JFREventWithStack(String type, JFREvent event, JFRModel model) throws JFRPropertyNotAvailableException {
+        JFREventWithStack(String type, JFREvent event, JFRModel model, JFRThreadInfoSupport tiSupport) throws JFRPropertyNotAvailableException {
             JFRStackTrace stack;
             if ("jdk.ThreadEnd".equals(type)) { // NOI18N
                 stack = null;
@@ -219,8 +222,8 @@ final class CPUSamplerViewSupport {
             if (eventTimeI == null) throw new JFRPropertyNotAvailableException("Must define eventTime to include into sampled snapshot"); // NOI18N
             eventTime = ValuesConverter.instantToRelativeNanos(eventTimeI, model);
             
-            if (profilingEvent) threadInfo = JFRThreadInfoSupport.getThreadInfo(thread, stack, event.getString("state")); // NOI18N
-            else threadInfo = JFRThreadInfoSupport.getThreadInfo(thread, stack, getState(type));
+            if (profilingEvent) threadInfo = tiSupport.getThreadInfo(thread, stack, event.getString("state")); // NOI18N
+            else threadInfo = tiSupport.getThreadInfo(thread, stack, getState(type));
         }
         
         
diff -pruN 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/JFRThreadInfoSupport.java 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/JFRThreadInfoSupport.java
--- 2.1.10-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/JFRThreadInfoSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jfr/src/org/graalvm/visualvm/jfr/views/sampler/JFRThreadInfoSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -41,11 +41,17 @@ final class JFRThreadInfoSupport {
     static final String THREAD_ID = "tid"; // NOI18N
     static final String THREAD_STACK = "stack"; // NOI18N
     
-    static Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, String state) {
+    private final Map<StackTraceElement,StackTraceElement> cache;
+
+    JFRThreadInfoSupport() {
+        cache = new HashMap<>();
+    }
+
+    Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, String state) {
         return getThreadInfo(thread, stack, state(state));
     }
     
-    static Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, Thread.State state) {
+    Map<String,Object> getThreadInfo(JFRThread thread, JFRStackTrace stack, Thread.State state) {
         Map<String,Object> threadInfo = new HashMap<>();
         
         Long id = Long.valueOf(thread.getId());
@@ -61,7 +67,7 @@ final class JFRThreadInfoSupport {
     }
     
     
-    private static StackTraceElement[] stackTrace(JFRStackTrace stack) {
+    private StackTraceElement[] stackTrace(JFRStackTrace stack) {
         List<JFRStackFrame> frames = stack.getFrames();
         StackTraceElement[] elements = new StackTraceElement[frames.size()];
         
@@ -71,7 +77,7 @@ final class JFRThreadInfoSupport {
         return elements;
     }
     
-    private static StackTraceElement stackTraceElement(JFRStackFrame frame) {
+    private StackTraceElement stackTraceElement(JFRStackFrame frame) {
         JFRMethod method = frame.getMethod();
         
         String className = method == null ? null : method.getType().getName(); // NOI18N
@@ -82,7 +88,8 @@ final class JFRThreadInfoSupport {
         
         int lineNumber = "Native".equals(frame.getType()) ? -2 : frame.getLine(); // NOI18N
         
-        return new StackTraceElement(className, methodName, null, lineNumber);
+        StackTraceElement el = new StackTraceElement(className, methodName, null, lineNumber);
+        return cache.computeIfAbsent(el, v -> el);
     }
     
     private static Thread.State state(String state) {
diff -pruN 2.1.10-1/visualvm/jmx/nbproject/project.xml 2.2-1/visualvm/jmx/nbproject/project.xml
--- 2.1.10-1/visualvm/jmx/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -39,7 +39,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.3</specification-version>
+                        <specification-version>2.4</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/CredentialsProvider.java 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/CredentialsProvider.java
--- 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/CredentialsProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/CredentialsProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * 
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/DisconnectedJmxModel.java 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/DisconnectedJmxModel.java
--- 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/DisconnectedJmxModel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/DisconnectedJmxModel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,7 @@ import javax.management.MBeanServerConne
 import javax.management.remote.JMXServiceURL;
 import org.graalvm.visualvm.application.jvm.HeapHistogram;
 import org.graalvm.visualvm.tools.jmx.JmxModel;
+import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
 
 /**
  *
@@ -53,6 +54,11 @@ class DisconnectedJmxModel extends JmxMo
         return null;
     }
 
+    @Override
+    public JvmMXBeans getJvmMXBeans() {
+        return null;
+    }
+
     @Override
     public JMXServiceURL getJMXServiceURL() {
         return url;
diff -pruN 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxApplication.java 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxApplication.java
--- 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxApplication.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxApplication.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,7 +47,6 @@ import org.graalvm.visualvm.tools.jmx.Jm
 import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 
 /**
  * This type of application represents an application
@@ -97,7 +96,7 @@ public final class JmxApplication extend
     public int getPid() {
         if (pid == UNKNOWN_PID && getState() == Stateful.STATE_AVAILABLE) {
             if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
-                JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
                 if (mxbeans != null) {
                     RuntimeMXBean rt = mxbeans.getRuntimeMXBean();
                     if (rt != null) {
@@ -125,7 +124,7 @@ public final class JmxApplication extend
             // try to detect tunneled application
             if (getState() == Stateful.STATE_AVAILABLE) {
                 if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
-                    JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                    JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
                     if (mxbeans != null) {
                         RuntimeMXBean rt = mxbeans.getRuntimeMXBean();
                         if (rt != null) {
diff -pruN 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxModelImpl.java 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxModelImpl.java
--- 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxModelImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxModelImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -44,10 +44,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.StringTokenizer;
+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;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.management.MBeanServerConnection;
 import javax.management.remote.JMXServiceURL;
+import javax.swing.SwingUtilities;
 import org.graalvm.visualvm.application.Application;
 import org.graalvm.visualvm.application.jvm.HeapHistogram;
 import org.graalvm.visualvm.core.VisualVM;
@@ -58,9 +66,12 @@ import org.graalvm.visualvm.tools.jmx.Ca
 import org.graalvm.visualvm.tools.jmx.CachedMBeanServerConnectionFactory;
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
+import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
+import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.graalvm.visualvm.tools.jvmstat.JvmJvmstatModel;
 import org.graalvm.visualvm.tools.jvmstat.JvmJvmstatModelFactory;
 import org.graalvm.visualvm.tools.jvmstat.JvmstatModel;
+import org.openide.util.Utilities;
 
 /**
  * This class encapsulates the JMX functionality of the target Java application.
@@ -104,6 +115,8 @@ class JmxModelImpl extends JmxModel {
     private ApplicationAvailabilityListener availabilityListener;
     private JmxSupport jmxSupport;
     private final Object jmxSupportLock = new Object();
+    private JvmMXBeans mxbeans;
+    private final Object mxbeansLock = new Object();
     
     /**
      * Creates an instance of {@code JmxModel} for a {@link JvmstatApplication}.
@@ -260,6 +273,24 @@ class JmxModelImpl extends JmxModel {
     }
 
     /**
+     * <p>Method for obtaining the {@link JvmMXBeans} for
+     * the given {@link JmxModel}.</p>
+     *
+     * @return a {@link JvmMXBeans} instance containing the MXBean
+     * proxies for the Java platform MXBeans backed by the supplied
+     * {@link JmxModel}. No MBean caching is applied on the supplied
+     * {@link JmxModel}.
+     */
+    public JvmMXBeans getJvmMXBeans() {
+        synchronized (mxbeansLock) {
+            if (mxbeans == null) {
+                mxbeans = JvmMXBeansFactory.getJvmMXBeans(this);
+            }
+            return mxbeans;
+        }
+    }
+
+    /**
      * Returns the {@link JMXServiceURL} associated to this (@code JmxModel}.
      *
      * @return the {@link JMXServiceURL} associated to this (@code JmxModel}.
@@ -366,7 +397,7 @@ class JmxModelImpl extends JmxModel {
         private Checker() {
         }
 
-        public static MBeanServerConnection newChecker(
+        static MBeanServerConnection newChecker(
                 ProxyClient client, MBeanServerConnection mbsc) {
             final InvocationHandler ih = new CheckerInvocationHandler(mbsc);
             return (MBeanServerConnection) Proxy.newProxyInstance(
@@ -414,6 +445,8 @@ class JmxModelImpl extends JmxModel {
     }
 
     static class LocalVirtualMachine {
+        private static ExecutorService winExec = Executors.newCachedThreadPool();
+
         private int vmid;
         private boolean isAttachSupported;
         private String javaHome;
@@ -428,19 +461,19 @@ class JmxModelImpl extends JmxModel {
             this.javaHome = home;
         }
 
-        public int vmid() {
+        int vmid() {
             return vmid;
         }
 
-        public synchronized boolean isManageable() {
+        synchronized boolean isManageable() {
             return (address != null);
         }
 
-        public boolean isAttachable() {
+        boolean isAttachable() {
             return isAttachSupported;
         }
 
-        public synchronized void startManagementAgent() throws IOException {
+        synchronized void startManagementAgent() throws IOException {
             if (address != null) {
                 // already started
                 return;
@@ -450,8 +483,15 @@ class JmxModelImpl extends JmxModel {
                 throw new IOException("This virtual machine \"" + vmid +    // NOI18N
                         "\" does not support dynamic attach."); // NOI18N
             }
-
-            loadManagementAgent();
+            executeAndWait(() -> {
+                try {
+                    loadManagementAgent();
+                } catch (IOException ex) {
+                    LOGGER.log(Level.INFO, "loadManagementAgent for PID "+vmid+" failed", ex); // NOI18N
+                }
+                // rerurn void
+                return null;
+            });
             // fails to load or start the management agent
             if (address == null) {
                 // should never reach here
@@ -459,14 +499,15 @@ class JmxModelImpl extends JmxModel {
             }
         }
 
-        public synchronized String connectorAddress() {
+        synchronized String connectorAddress() {
             // return null if not available or no JMX agent
             return address;
         }
+
         private static final String LOCAL_CONNECTOR_ADDRESS_PROP =
                 "com.sun.management.jmxremote.localConnectorAddress";   // NOI18N
 
-        private synchronized void loadManagementAgent() throws IOException {
+        private void loadManagementAgent() throws IOException {
             VirtualMachine vm = null;
             String name = String.valueOf(vmid);
             try {
@@ -521,5 +562,23 @@ class JmxModelImpl extends JmxModel {
             }
             return null;
         }
+
+        // see AttachModelImpl.executeAndWait
+        private static <V> V executeAndWait(Callable<V> call) {
+            if (Utilities.isWindows()) {
+                Future<V> result = winExec.submit(call);
+                try {
+                    return result.get(SwingUtilities.isEventDispatchThread() ? 5 : 25, TimeUnit.SECONDS);
+                } catch (InterruptedException | ExecutionException | TimeoutException ex) {
+                    LOGGER.log(Level.INFO, "executeAndWait get", ex);    // NOI18N
+                }
+                return null;
+            }
+            try {
+                return call.call();
+            } catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        }
     }
 }
diff -pruN 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxSupport.java 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxSupport.java
--- 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -56,7 +56,6 @@ import org.graalvm.visualvm.application.
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.openide.ErrorManager;
 import org.openide.util.Exceptions;
 
@@ -76,7 +75,6 @@ public class JmxSupport {
     private static final String CMDLINE_PREFIX = "java_command: ";       // NOI18N
     private static final String CMDLINE_EMPTY = "<unknown>";            // NOI18N
 
-    private JvmMXBeans mxbeans;
     private JmxModel jmxModel;
     // HotspotDiagnostic
     private boolean hotspotDiagnosticInitialized;
@@ -88,6 +86,9 @@ public class JmxSupport {
     private Boolean hasDumpAllThreads;
     private final Object hasDumpAllThreadsLock = new Object();
     
+    private Boolean hasDiagnosticCommand;
+    private final Object hasDiagnosticCommandLock = new Object();
+
     private String commandLine;
     private final Object commandLineLock = new Object();
 
@@ -96,22 +97,13 @@ public class JmxSupport {
     }
     
     private RuntimeMXBean getRuntime() {
-        JvmMXBeans jmx = getJvmMXBeans();
+        JvmMXBeans jmx = jmxModel.getJvmMXBeans();
         if (jmx != null) {
             return jmx.getRuntimeMXBean();
         }
         return null;
     }
     
-    private synchronized JvmMXBeans getJvmMXBeans() {
-        if (mxbeans == null) {
-            if (jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
-                mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
-            }
-        }
-        return mxbeans;
-    }
-    
     Properties getSystemProperties() {
         try {
             RuntimeMXBean runtime = getRuntime();
@@ -145,7 +137,7 @@ public class JmxSupport {
     }
     
     ThreadMXBean getThreadBean() {
-        JvmMXBeans jmx = getJvmMXBeans();
+        JvmMXBeans jmx = jmxModel.getJvmMXBeans();
         if (jmx != null) {
             return jmx.getThreadMXBean();
         }
@@ -157,7 +149,7 @@ public class JmxSupport {
             if (hotspotDiagnosticInitialized) {
                 return hotspotDiagnosticMXBean;
             }
-            JvmMXBeans jmx = getJvmMXBeans();
+            JvmMXBeans jmx = jmxModel.getJvmMXBeans();
             if (jmx != null) {
                 try {
                     hotspotDiagnosticMXBean = jmx.getMXBean(
@@ -396,6 +388,27 @@ public class JmxSupport {
         }
     }
     
+    private boolean hasDiagnosticCommand() {
+        synchronized (hasDiagnosticCommandLock) {
+            if (hasDiagnosticCommand == null) {
+                hasDiagnosticCommand = Boolean.FALSE;
+                MBeanServerConnection conn = jmxModel.getMBeanServerConnection();
+                try {
+                    ObjectName diagCommName = new ObjectName(DIAGNOSTIC_COMMAND_MXBEAN_NAME);
+                    if (conn.isRegistered(diagCommName)) {
+                        hasDiagnosticCommand = Boolean.TRUE;
+                    }
+                } catch (MalformedObjectNameException ex) {
+                    Exceptions.printStackTrace(ex);
+                } catch (IOException ex) {
+                    LOGGER.log(Level.INFO, "hasDiagnosticCommand", ex); // NOI18N
+                }
+            }
+
+            return hasDiagnosticCommand.booleanValue();
+        }
+    }
+
     private boolean hasDumpAllThreads() {
         synchronized (hasDumpAllThreadsLock) {
             if (hasDumpAllThreads == null) {
@@ -435,28 +448,26 @@ public class JmxSupport {
     }
 
     String executeJCmd(String command, Map<String,Object> pars) {
-        if (jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
-            MBeanServerConnection conn = jmxModel.getMBeanServerConnection();
+        if (jmxModel.getConnectionState() == ConnectionState.CONNECTED && hasDiagnosticCommand()) {
             try {
+                MBeanServerConnection conn = jmxModel.getMBeanServerConnection();
                 ObjectName diagCommName = new ObjectName(DIAGNOSTIC_COMMAND_MXBEAN_NAME);
-                if (conn.isRegistered(diagCommName)) {
-                    Object[] params = null;
-                    String[] signature = null;
-                    Object ret;
-
-                    if (!pars.isEmpty()) {
-                        params = new Object[] {getJCmdParams(pars)};
-                        signature = new String[] {String[].class.getName()};
-                    }
-                    ret = conn.invoke(diagCommName, command, params, signature);
-                    if (ret instanceof String) {
-                        return (String)ret;
-                    }
+                Object[] params = null;
+                String[] signature = null;
+                Object ret;
+
+                if (!pars.isEmpty()) {
+                    params = new Object[]{getJCmdParams(pars)};
+                    signature = new String[]{String[].class.getName()};
+                }
+                ret = conn.invoke(diagCommName, command, params, signature);
+                if (ret instanceof String) {
+                    return (String) ret;
                 }
             } catch (MalformedObjectNameException ex) {
-                Exceptions.printStackTrace(ex);
+                throw new IllegalArgumentException(ex);
             } catch (IOException ex) {
-                LOGGER.log(Level.INFO,"executeJCmd", ex); // NOI18N
+                LOGGER.log(Level.INFO, "executeJCmd", ex); // NOI18N
             } catch (InstanceNotFoundException ex) {
                 Exceptions.printStackTrace(ex);
             } catch (MBeanException ex) {
diff -pruN 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/ProxyClient.java 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/ProxyClient.java
--- 2.1.10-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/ProxyClient.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/ProxyClient.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/jvm/nbproject/project.xml 2.2-1/visualvm/jvm/nbproject/project.xml
--- 2.1.10-1/visualvm/jvm/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jvm/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -30,7 +30,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.3</specification-version>
+                        <specification-version>2.4</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JRockitJvmProvider.java 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JRockitJvmProvider.java
--- 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JRockitJvmProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JRockitJvmProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,6 @@ import org.graalvm.visualvm.application.
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.graalvm.visualvm.tools.jvmstat.JvmstatModel;
 import org.graalvm.visualvm.tools.jvmstat.JvmstatModelFactory;
 
@@ -56,7 +55,7 @@ class JRockitJvmProvider extends JvmProv
         } else {
             JmxModel jmxModel = JmxModelFactory.getJmxModelFor(app);
             if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
-                JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
                 if (mxbeans != null) {
                     RuntimeMXBean runtime = mxbeans.getRuntimeMXBean();
                     if (runtime != null && JROCKIT_VM_NAME.equals(runtime.getVmName())) {
diff -pruN 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JmxSupport.java 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JmxSupport.java
--- 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JmxSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JmxSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -51,7 +51,6 @@ import org.graalvm.visualvm.tools.jmx.Jm
 import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.openide.util.NbBundle;
 
 /**
@@ -83,7 +82,6 @@ class JmxSupport implements DataRemovedL
     private static long INITIAL_DELAY = 100;
 
     private Application application;
-    private JvmMXBeans mxbeans;
     private JVMImpl jvm;
     private final Object processCPUTimeAttributeLock = new Object();
     private Boolean processCPUTimeAttribute;
@@ -183,14 +181,12 @@ class JmxSupport implements DataRemovedL
         return -1;
     }
 
-    synchronized JvmMXBeans getJvmMXBeans() {
-        if (mxbeans == null) {
-            JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
-            if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
-                mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
-            }
+    JvmMXBeans getJvmMXBeans() {
+        JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
+        if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
+            return jmxModel.getJvmMXBeans();
         }
-        return mxbeans;
+        return null;
     }
     
     synchronized Collection<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
diff -pruN 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JvmProvider.java 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JvmProvider.java
--- 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JvmProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/JvmProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,6 @@ import org.graalvm.visualvm.core.model.A
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.graalvm.visualvm.tools.jvmstat.JvmstatModel;
 import org.graalvm.visualvm.tools.jvmstat.JvmstatModelFactory;
 
@@ -49,7 +48,7 @@ class JvmProvider extends AbstractModelP
         } else {
             JmxModel jmxModel = JmxModelFactory.getJmxModelFor(app);
             if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
-                JvmMXBeans jmx = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                JvmMXBeans jmx = jmxModel.getJvmMXBeans();
                 if (jmx != null && jmx.getRuntimeMXBean() != null) {
                     jvm = new JVMImpl(app);
                 }
diff -pruN 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/MonitoredDataImpl.java 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/MonitoredDataImpl.java
--- 2.1.10-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/MonitoredDataImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jvm/src/org/graalvm/visualvm/jvm/MonitoredDataImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/jvmstat/src/org/graalvm/visualvm/jvmstat/JvmJvmstatModelProvider.java 2.2-1/visualvm/jvmstat/src/org/graalvm/visualvm/jvmstat/JvmJvmstatModelProvider.java
--- 2.1.10-1/visualvm/jvmstat/src/org/graalvm/visualvm/jvmstat/JvmJvmstatModelProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/jvmstat/src/org/graalvm/visualvm/jvmstat/JvmJvmstatModelProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -88,6 +88,8 @@ public class JvmJvmstatModelProvider ext
                 else if (isJavaVersion(javaVersion,"22")) model = new JvmJvmstatModel_8(app,jvmstat); // NOI18N
                 // JVM 23
                 else if (isJavaVersion(javaVersion,"23")) model = new JvmJvmstatModel_8(app,jvmstat); // NOI18N
+                // JVM 24
+                else if (isJavaVersion(javaVersion,"24")) model = new JvmJvmstatModel_8(app,jvmstat); // NOI18N
             }
             
             if (model == null) {
diff -pruN 2.1.10-1/visualvm/killapp/build.xml 2.2-1/visualvm/killapp/build.xml
--- 2.1.10-1/visualvm/killapp/build.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/build.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="org.graalvm.visualvm.modules.killapp" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project org.graalvm.visualvm.modules.killapp.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff -pruN 2.1.10-1/visualvm/killapp/manifest.mf 2.2-1/visualvm/killapp/manifest.mf
--- 2.1.10-1/visualvm/killapp/manifest.mf	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+AutoUpdate-Show-In-Client: false
+AutoUpdate-Essential-Module: true
+OpenIDE-Module: org.graalvm.visualvm.modules.killapp/1
+OpenIDE-Module-Layer: org/graalvm/visualvm/modules/killapp/layer.xml
+OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/modules/killapp/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.2
+
diff -pruN 2.1.10-1/visualvm/killapp/nbproject/build-impl.xml 2.2-1/visualvm/killapp/nbproject/build-impl.xml
--- 2.1.10-1/visualvm/killapp/nbproject/build-impl.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/nbproject/build-impl.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="org.graalvm.visualvm.killapp-impl" basedir="..">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="property"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{property}" value="@{value}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
+        <condition>
+            <not>
+                <contains string="${cluster.path.evaluated}" substring="platform"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff -pruN 2.1.10-1/visualvm/killapp/nbproject/project.properties 2.2-1/visualvm/killapp/nbproject/project.properties
--- 2.1.10-1/visualvm/killapp/nbproject/project.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,6 @@
+javac.source=1.5
+license.file=../../visualvm/startup/src/org/graalvm/visualvm/modules/startup/LICENSE.txt
+nbm.homepage=https://visualvm.github.io
+nbm.module.author=Tomas Hurka
+run.args.extra=--branding visualvm
+
diff -pruN 2.1.10-1/visualvm/killapp/nbproject/project.xml 2.2-1/visualvm/killapp/nbproject/project.xml
--- 2.1.10-1/visualvm/killapp/nbproject/project.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>org.graalvm.visualvm.modules.killapp</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>org.graalvm.visualvm.application</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.graalvm.visualvm.core</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.graalvm.visualvm.host</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.progress</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.52</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.progress.nb</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.52</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>9.12</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util.ui</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>9.13</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff -pruN 2.1.10-1/visualvm/killapp/nbproject/suite.properties 2.2-1/visualvm/killapp/nbproject/suite.properties
--- 2.1.10-1/visualvm/killapp/nbproject/suite.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/nbproject/suite.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff -pruN 2.1.10-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties 2.2-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties
--- 2.1.10-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,5 @@
+OpenIDE-Module-Display-Category=Tools
+OpenIDE-Module-Long-Description=\
+    This simple module adds ability to quicky kill locally running Java application.
+OpenIDE-Module-Name=VisualVM-Kill Application
+OpenIDE-Module-Short-Description=Kill Application
diff -pruN 2.1.10-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java 2.2-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java
--- 2.1.10-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/KillAction.java	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.graalvm.visualvm.modules.killapp;
+
+import org.graalvm.visualvm.application.Application;
+import org.graalvm.visualvm.core.datasource.DataSource;
+import org.graalvm.visualvm.core.datasupport.DataRemovedListener;
+import org.graalvm.visualvm.core.datasupport.Stateful;
+import org.graalvm.visualvm.core.ui.actions.ActionUtils;
+import org.graalvm.visualvm.core.ui.actions.MultiDataSourceAction;
+import org.graalvm.visualvm.host.Host;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import javax.swing.SwingUtilities;
+import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.progress.ProgressHandleFactory;
+import org.openide.util.Exceptions;
+import org.openide.util.NbBundle;
+import org.openide.util.RequestProcessor;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Tomas Hurka
+ */
+public final class KillAction extends MultiDataSourceAction<Application> {
+    
+    private final Set<Application> lastSelectedApplications;
+    private final RequestProcessor killRP;
+    private final PropertyChangeListener stateListener;
+
+    @NbBundle.Messages({"CTL_KillAction=Kill Application"})
+    public KillAction() {
+        super(Application.class);
+        putValue(NAME, Bundle.CTL_KillAction());
+        putValue("noIconInMenu", Boolean.TRUE); // NOI18N
+        lastSelectedApplications = new HashSet();
+        killRP = new RequestProcessor("KillAction processor", 5);   // NOI18N
+        stateListener = new PropertyChangeListener() {
+            public void propertyChange(PropertyChangeEvent evt) {
+                updateState(ActionUtils.getSelectedDataSources(Application.class));
+            }
+        };
+    }
+
+    @Override
+    protected void actionPerformed(Set<Application> dataSources, ActionEvent ae) {
+        for (Application dataSource : dataSources) {
+            killApplication((Application)dataSource);
+        }
+    }
+
+    @Override
+    protected boolean isEnabled(Set<Application> dataSources) {
+        for (DataSource dataSource : dataSources) {
+            Application application = (Application)dataSource;
+                lastSelectedApplications.add(application);
+            application.addPropertyChangeListener(Stateful.PROPERTY_STATE, stateListener);
+            if (application.getState() != Stateful.STATE_AVAILABLE) return false;
+            if (!isEnabled(application)) return false;
+        }
+        return true;
+    }
+
+    @Override
+    protected void updateState(Set<Application> dataSources) {
+        if (!lastSelectedApplications.isEmpty())
+            for (Application application : lastSelectedApplications)
+                application.removePropertyChangeListener(Stateful.PROPERTY_STATE, stateListener);
+        lastSelectedApplications.clear();
+        super.updateState(dataSources);
+    }
+
+    private void killApplication(final Application app) {
+        final String pidString = String.valueOf(app.getPid());
+        final String[] command = getCommand(pidString, false);
+
+        if (command == null) {
+            return;
+        }
+
+        final Progress handle = new Progress(pidString);
+        app.notifyWhenRemoved(handle);
+        killRP.post(new Runnable() {
+            public void run() {
+                try {
+                    Runtime.getRuntime().exec(command);
+                    Thread.sleep(5000);
+                    if (app.getState() == Stateful.STATE_AVAILABLE) {
+                        // application is still alive, try to kill it hard way
+                        Runtime.getRuntime().exec(getCommand(pidString, true));
+                        refreshJvms();
+                    }
+                } catch (IOException ex) {
+                    Exceptions.printStackTrace(ex);
+                } catch (InterruptedException ex) {
+                    Exceptions.printStackTrace(ex);
+                } finally {
+                    handle.finish();
+                }
+            }
+        });
+    }
+
+    private void refreshJvms() throws IOException {
+        String javaSub = Utilities.isWindows() ? "bin\\java.exe" : "bin/java"; // NOI18N
+        File java = new File(System.getProperty("java.home"), javaSub); // NOI18N
+
+        if (java.isFile()) {
+            String command[] = {java.getAbsolutePath(), "-version"};
+            Runtime.getRuntime().exec(command);
+        }
+    }
+
+    private boolean isEnabled(Application application) {
+        if (Application.CURRENT_APPLICATION.equals(application)) {
+            // don't commit suicide
+            return false;
+        }
+        if (!Host.LOCALHOST.equals(application.getHost())) {
+            // we cannot kill remote applications
+            return false;
+        }
+        return true;
+    }
+
+    private String[] getCommand(String pidString, boolean force) {
+        if (Utilities.isWindows()) {
+            if (force) {
+                return new String[]{"taskkill", "/F", "/PID", pidString};    // NOI18N                
+            } else {
+                return new String[]{"taskkill", "/PID", pidString};    // NOI18N
+            }
+        } else if (Utilities.isUnix()) {
+            if (force) {
+                return new String[]{"kill", "-9", pidString};   // NOI18N                
+            } else {
+                return new String[]{"kill", pidString};   // NOI18N
+            }
+        } else {
+            assert false : "strange os";  // NOI18N
+            return null;
+        }
+    }
+
+    @NbBundle.Messages({"MSG_Kill=Killing application with PID {0}"})
+    private static class Progress implements DataRemovedListener<Application>{
+
+        ProgressHandle handle;
+        boolean running;
+        
+        private Progress(String pid) {
+            handle = ProgressHandleFactory.createHandle(Bundle.MSG_Kill(pid));
+            handle.setInitialDelay(500);
+            handle.start();
+            running = true;
+        }
+
+        private synchronized void finish() {
+            if (running) {
+                running = false;
+                SwingUtilities.invokeLater(new Runnable() {
+                    public void run() {
+                        handle.finish();
+                        handle = null;
+                    }
+                });
+            }
+        }
+
+        public void dataRemoved(Application x) {
+            finish();
+        }
+    }
+}
diff -pruN 2.1.10-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml 2.2-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml
--- 2.1.10-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/killapp/src/org/graalvm/visualvm/modules/killapp/layer.xml	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="Other">
+            <file name="org-graalvm-visualvm-modules-killapp-KillAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="Applications">
+            <file name="Kill-Separator-2950.instance">
+                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+                <attr name="position" intvalue="2910"/>
+            </file>
+            <file name="org-graalvm-visualvm-modules-killapp-KillAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Other/org-graalvm-visualvm-modules-killapp-KillAction.instance"/>
+                <attr name="position" intvalue="2911"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="VisualVM">
+        <folder name="ExplorerPopupSelection">
+            <file name="Kill-Separator-1950.instance">
+                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+                <attr name="position" intvalue="1910"/>
+            </file>
+            <file name="org-graalvm-visualvm-modules-killapp-KillAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Other/org-graalvm-visualvm-modules-killapp-KillAction.instance"/>
+                <attr name="position" intvalue="1911"/>
+            </file>
+        </folder>
+    </folder>
+</filesystem>
diff -pruN 2.1.10-1/visualvm/launcher/visualvm.conf 2.2-1/visualvm/launcher/visualvm.conf
--- 2.1.10-1/visualvm/launcher/visualvm.conf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/launcher/visualvm.conf	2025-04-17 09:07:34.000000000 +0000
@@ -51,14 +51,14 @@
 # Cachedir must be different from userdir. The same cachedir and userdir
 # would cause problems.
 #
-visualvm_default_userdir="${DEFAULT_USERDIR_ROOT}/2.1.10"
-visualvm_default_cachedir="${DEFAULT_CACHEDIR_ROOT}/2.1.10"
+visualvm_default_userdir="${DEFAULT_USERDIR_ROOT}/2.2"
+visualvm_default_cachedir="${DEFAULT_CACHEDIR_ROOT}/2.2"
 
 # Options used by VisualVM launcher by default:
 # (can be overridden by explicit command line switches)
 #
 
-visualvm_default_options="-J-Xms24m -J-Xmx768m -J-Dnetbeans.accept_license_class=org.graalvm.visualvm.modules.startup.AcceptLicense -J-Dnetbeans.importclass=org.graalvm.visualvm.modules.startup.ImportSettings -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false -J-Dorg.netbeans.core.TimeableEventQueue.quantum=360000 -J-Dpolyglot.js.nashorn-compat=true -J-Dsun.misc.URLClassPath.disableJarChecking=true -J-Djdk.attach.allowAttachSelf=true -J-Dorg.openide.util.ImageUtilities.level=950 -J--add-exports=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor.event=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=jdk.attach/sun.tools.attach=ALL-UNNAMED -J--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.synth=ALL-UNNAMED -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions -J-Dnetbeans.logger.console=true"
+visualvm_default_options="-J-Xms24m -J-Xmx768m -J-Dnetbeans.accept_license_class=org.graalvm.visualvm.modules.startup.AcceptLicense -J-Dnetbeans.importclass=org.graalvm.visualvm.modules.startup.ImportSettings -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false -J-DTopSecurityManager.disable=true -J-Dorg.netbeans.core.TimeableEventQueue.quantum=360000 -J-Dpolyglot.js.nashorn-compat=true -J-Dsun.misc.URLClassPath.disableJarChecking=true -J-Djdk.attach.allowAttachSelf=true -J-Dorg.openide.util.ImageUtilities.level=950 -J--add-exports=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor.event=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=jdk.attach/sun.tools.attach=ALL-UNNAMED -J--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.synth=ALL-UNNAMED -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions"
 # for development purposes you may wish to append: -J-Dnetbeans.logger.console=true -J-Dnetbeans.exception.report.min.level=900 -J-ea
 
 # Default location of JDK:
Binary files 2.1.10-1/visualvm/launcher/visualvm.exe and 2.2-1/visualvm/launcher/visualvm.exe differ
diff -pruN 2.1.10-1/visualvm/launcher/windows-src/nbproject/project.xml 2.2-1/visualvm/launcher/windows-src/nbproject/project.xml
--- 2.1.10-1/visualvm/launcher/windows-src/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/launcher/windows-src/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -3,7 +3,7 @@
     <type>org.netbeans.modules.cnd.makeproject</type>
     <configuration>
         <data xmlns="http://www.netbeans.org/ns/make-project/1">
-            <name>VisualVM 2.1.10 Launcher Win</name>
+            <name>VisualVM 2.2 Launcher Win</name>
             <make-project-type>0</make-project-type>
             <c-extensions/>
             <cpp-extensions>cpp</cpp-extensions>
diff -pruN 2.1.10-1/visualvm/launcher/windows-src/version.h 2.2-1/visualvm/launcher/windows-src/version.h
--- 2.1.10-1/visualvm/launcher/windows-src/version.h	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/launcher/windows-src/version.h	2025-04-17 09:07:34.000000000 +0000
@@ -25,11 +25,11 @@
 
 #define COMPANY "Oracle Corporation"
 #define COMPONENT "VisualVM"
-#define VER "2.1.10.0"
-#define FVER 2,1,10,0
-#define BUILD_ID "20240911"
+#define VER "2.2.0.0"
+#define FVER 2,2,0,0
+#define BUILD_ID "20250417"
 #define INTERNAL_NAME "visualvm"
-#define COPYRIGHT "\xA9 2007, 2024, Oracle and/or its affiliates. All rights reserved."
+#define COPYRIGHT "\xA9 2007, 2025, Oracle and/or its affiliates. All rights reserved."
 #define FNAME "visualvm.exe"
 #define NAME "VisualVM"
 
diff -pruN 2.1.10-1/visualvm/launcher/windows-src/visualvm.exe.manifest 2.2-1/visualvm/launcher/windows-src/visualvm.exe.manifest
--- 2.1.10-1/visualvm/launcher/windows-src/visualvm.exe.manifest	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/launcher/windows-src/visualvm.exe.manifest	2025-04-17 09:07:34.000000000 +0000
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-<assemblyIdentity version="2.1.10.0"
+<assemblyIdentity version="2.2.0.0"
    processorArchitecture="X86"
    name="visualvm.exe"
    type="win32"/>
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/manifest.mf 2.2-1/visualvm/libs.profiler/lib.profiler/manifest.mf
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 Manifest-Version: 1.0
 OpenIDE-Module: org.graalvm.visualvm.lib.jfluid/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/lib/jfluid/Bundle.properties
-OpenIDE-Module-Specification-Version: 2.18
+OpenIDE-Module-Specification-Version: 2.19
 
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-linuxarm.sh 2.2-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-linuxarm.sh
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-linuxarm.sh	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-linuxarm.sh	2025-04-17 09:07:34.000000000 +0000
@@ -31,7 +31,7 @@ BuildForJDK()
         ARCH_TOOLS=$4
         ARCH_FLAGS=$5
 	echo $JAVA_HOME $JDK_ID $ARCH_DIR $ARCH_TOOLS $ARCH_FLAGS
-	$ARCH_TOOLS/bin/gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -DLINUX -pthread -fPIC -shared -O3 $ARCH_FLAGS -Wall \
+	$ARCH_TOOLS-gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -DLINUX -pthread -fPIC -shared -O3 $ARCH_FLAGS -Wall \
 	-o ../../release/lib/deployed/$JDK_ID/$ARCH_DIR/libprofilerinterface.so \
 	../src-jdk15/class_file_cache.c \
 	../src-jdk15/attach.c \
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-mac-arm.sh 2.2-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-mac-arm.sh
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-mac-arm.sh	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/native/build/buildnative-mac-arm.sh	2025-04-17 09:07:34.000000000 +0000
@@ -61,8 +61,13 @@ BuildForJDK()
 	BuildForArch "arm64"
 
         cp ../../release/lib/deployed/$JDK_ID/mac/libprofilerinterface.jnilib .
-	lipo libprofilerinterface.jnilib -replace arm64 libprofilerinterface_arm64.jnilib \
-	-output ../../release/lib/deployed/$JDK_ID/mac/libprofilerinterface.jnilib
+        if lipo libprofilerinterface.jnilib -verify_arch arm64 ; then
+          lipo libprofilerinterface.jnilib -replace arm64 libprofilerinterface_arm64.jnilib \
+          -output ../../release/lib/deployed/$JDK_ID/mac/libprofilerinterface.jnilib
+        else
+          lipo -create libprofilerinterface.jnilib libprofilerinterface_arm64.jnilib \
+          -output ../../release/lib/deployed/$JDK_ID/mac/libprofilerinterface.jnilib
+        fi
 
 	rm *.jnilib
 
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/native/src-jdk15/Timers.c 2.2-1/visualvm/libs.profiler/lib.profiler/native/src-jdk15/Timers.c
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/native/src-jdk15/Timers.c	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/native/src-jdk15/Timers.c	2025-04-17 09:07:34.000000000 +0000
@@ -85,6 +85,7 @@ JNIEXPORT jlong JNICALL Java_org_graalvm
 	jvmtiError res;
 	
 	res = (*_jvmti)->GetCurrentThreadCpuTime(_jvmti,&threadTime);
+	if (res == /* JVMTI_ERROR_UNSUPPORTED_OPERATION */ 73) return -1;
 	if (res != JVMTI_ERROR_NONE) fprintf(stderr, "Profiler Agent Error: GetCurrentThreadCpuTime failed with %d\n",res);
 	assert(res == JVMTI_ERROR_NONE);
 	return threadTime;
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/linux/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/linux/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/linux-amd64/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/linux-amd64/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/mac/libprofilerinterface.jnilib and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/mac/libprofilerinterface.jnilib differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-amd64/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-amd64/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-i386/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-i386/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-sparc/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-sparc/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-sparcv9/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/solaris-sparcv9/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/windows/profilerinterface.dll and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/windows/profilerinterface.dll differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/windows-amd64/profilerinterface.dll and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk15/windows-amd64/profilerinterface.dll differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-aarch64/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-aarch64/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-amd64/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-amd64/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-arm/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-arm/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-arm-vfp-hflt/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/linux-arm-vfp-hflt/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/mac/libprofilerinterface.jnilib and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/mac/libprofilerinterface.jnilib differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-amd64/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-amd64/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-i386/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-i386/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-sparc/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-sparc/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-sparcv9/libprofilerinterface.so and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/solaris-sparcv9/libprofilerinterface.so differ
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows/profilerinterface.dll and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows/profilerinterface.dll differ
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows/profilerinterface.map 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows/profilerinterface.map
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows/profilerinterface.map	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows/profilerinterface.map	2025-04-17 09:07:34.000000000 +0000
@@ -1,199 +1,199 @@
- profilerinterface
-
- Timestamp is 5af2f8ae (Wed May 09 15:33:34 2018)
-
- Preferred load address is 10000000
-
- Start         Length     Name                   Class
- 0001:00000000 00003e0cH .text                   CODE
- 0002:00000000 00000088H .idata$5                DATA
- 0002:00000088 00000004H .CRT$XCA                DATA
- 0002:0000008c 00000004H .CRT$XCZ                DATA
- 0002:00000090 00000004H .CRT$XIA                DATA
- 0002:00000094 00000004H .CRT$XIAA               DATA
- 0002:00000098 00000004H .CRT$XIZ                DATA
- 0002:000000a0 00000060H .rdata                  DATA
- 0002:00000100 00000004H .rdata$sxdata           DATA
- 0002:00000108 0000009cH .xdata$x                DATA
- 0002:000001a4 00000028H .idata$2                DATA
- 0002:000001cc 00000014H .idata$3                DATA
- 0002:000001e0 00000088H .idata$4                DATA
- 0002:00000268 0000021eH .idata$6                DATA
- 0002:00000490 00000fc3H .edata                  DATA
- 0003:00000000 00001d80H .data                   DATA
- 0003:00001d80 000004c8H .bss                    DATA
- 0004:00000000 00000058H .rsrc$01                DATA
- 0004:00000060 00000398H .rsrc$02                DATA
-
-  Address         Publics by Value              Rva+Base       Lib:Object
-
- 0000:00000000       __except_list              00000000     <absolute>
- 0000:00000001       ___safe_se_handler_count   00000001     <absolute>
- 0000:00009876       __ldused                   00009876     <absolute>
- 0000:00009876       __fltused                  00009876     <absolute>
- 0000:00000000       ___ImageBase               10000000     <linker-defined>
- 0001:00000000       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getAllLoadedClasses@8 10001000 f   Classes.obj
- 0001:00000170       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_cacheLoadedClasses@16 10001170 f   Classes.obj
- 0001:000001d0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getCachedClassFileBytes@12 100011d0 f   Classes.obj
- 0001:00000300       _register_class_prepare@16 10001300 f   Classes.obj
- 0001:00000350       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_enableClassLoadHook@8 10001350 f   Classes.obj
- 0001:00000420       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_disableClassLoadHook@8 10001420 f   Classes.obj
- 0001:00000460       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getObjectSize@12 10001460 f   Classes.obj
- 0001:00000490       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_doRedefineClasses@16 10001490 f   Classes.obj
- 0001:000006d0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_notifyAboutClassLoaderUnloading@8 100016d0 f   Classes.obj
- 0001:000006e0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_initialize15@8 100016e0 f   HeapDump.obj
- 0001:00000730       _Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_takeHeapDump15Native@12 10001730 f   HeapDump.obj
- 0001:00000790       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_getThreadCPUTimeInNanos@8 10001790 f   Timers.obj
- 0001:000007f0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_osSleep@12 100017f0 f   Timers.obj
- 0001:00000800       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_enableMicrostateAccounting@12 10001800 f   Timers.obj
- 0001:00000810       _register_gc_start@4       10001810 f   GC.obj
- 0001:00000880       _register_gc_finish@4      10001880 f   GC.obj
- 0001:00000900       _enable_gc_start_finish_hook 10001900 f   GC.obj
- 0001:000009c0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_activateGCEpochCounter@12 100019c0 f   GC.obj
- 0001:00000a30       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_resetGCEpochCounter@8 10001a30 f   GC.obj
- 0001:00000a40       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getCurrentGCEpoch@8 10001a40 f   GC.obj
- 0001:00000a50       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_objectsAdjacent@16 10001a50 f   GC.obj
- 0001:00000a90       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCRelativeTimeMetrics@12 10001a90 f   GC.obj
- 0001:00000be0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCStartFinishTimes@16 10001be0 f   GC.obj
- 0001:00000c20       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_runGC@8 10001c20 f   GC.obj
- 0001:00000c40       _convert_JVMTI_thread_status_to_jfluid_status 10001c40 f   Threads.obj
- 0001:00000d40       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordProfilerOwnThreads@16 10001d40 f   Threads.obj
- 0001:00000ef0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordAdditionalProfilerOwnThread@12 10001ef0 f   Threads.obj
- 0001:00000f20       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getTotalNumberOfThreads@8 10001f20 f   Threads.obj
- 0001:00000f80       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_suspendTargetAppThreads@12 10001f80 f   Threads.obj
- 0001:00001040       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_resumeTargetAppThreads@12 10002040 f   Threads.obj
- 0001:00001100       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_terminateTargetAppThreads@12 10002100 f   Threads.obj
- 0001:000011c0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_targetAppThreadsExist@8 100021c0 f   Threads.obj
- 0001:00001270       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getAllThreads@12 10002270 f   Threads.obj
- 0001:00001380       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getThreadsStatus@16 10002380 f   Threads.obj
- 0001:00001430       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJVMArguments@8 10002430 f   Threads.obj
- 0001:00001450       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJavaCommand@8 10002450 f   Threads.obj
- 0001:00001490       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentJavaStackDepth@12 10002490 f   Stacks.obj
- 0001:000014b0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_clearNativeStackFrameBuffer@8 100024b0 f   Stacks.obj
- 0001:000014f0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentStackFrameIds@20 100024f0 f   Stacks.obj
- 0001:00001670       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getMethodNamesForJMethodIds@20 10002670 f   Stacks.obj
- 0001:00001a20       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getAllStackTraces@20 10002a20 f   Stacks.obj
- 0001:00001c80       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_createNativeStackFrameBuffer@12 10002c80 f   Stacks.obj
- 0001:00001cd0       _get_nano_time             10002cd0 f   common_functions.obj
- 0001:00001d00       _report_usage              10002d00 f   common_functions.obj
- 0001:00001f30       _JNI_OnLoad@8              10002f30 f   common_functions.obj
- 0001:00001f80       _Agent_OnLoad@12           10002f80 f   common_functions.obj
- 0001:00002070       _cache_loaded_classes      10003070 f   class_file_cache.obj
- 0001:000022b0       _get_saved_class_file_bytes 100032b0 f   class_file_cache.obj
- 0001:000023e0       _try_removing_bytes_for_unloaded_classes 100033e0 f   class_file_cache.obj
- 0001:00002720       _waitInterceptor@16        10003720 f   class_file_cache.obj
- 0001:000027d0       _sleepInterceptor@16       100037d0 f   class_file_cache.obj
- 0001:00002880       _parkInterceptor@20        10003880 f   class_file_cache.obj
- 0001:00002930       _monitor_contended_enter_hook@16 10003930 f   class_file_cache.obj
- 0001:000029a0       _monitor_contended_entered_hook@16 100039a0 f   class_file_cache.obj
- 0001:00002a00       _vm_object_alloc@28        10003a00 f   class_file_cache.obj
- 0001:00002a70       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setParkTrackingEnabled@12 10003a70 f   class_file_cache.obj
- 0001:00002ac0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setLockContentionMonitoringEnabled@12 10003ac0 f   class_file_cache.obj
- 0001:00002ad0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setWaitTrackingEnabled@12 10003ad0 f   class_file_cache.obj
- 0001:00002b30       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setSleepTrackingEnabled@12 10003b30 f   class_file_cache.obj
- 0001:00002b80       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setVMObjectAllocEnabled@12 10003b80 f   class_file_cache.obj
- 0001:00002dc0       _class_file_load_hook@40   10003dc0 f   class_file_cache.obj
- 0001:00002f10       _native_method_bind_hook@24 10003f10 f   class_file_cache.obj
- 0001:000032d0       _parse_options_and_extract_params 100042d0 f   attach.obj
- 0001:00003580       _vm_init_hook@12           10004580 f   attach.obj
- 0001:00003590       _memcpy                    10004590 f   MSVCRT:msvcrt.dll
- 0001:000035a0       __alldiv                   100045a0 f   MSVCRT:lldiv.obj
- 0001:00003650       __allmul                   10004650 f   MSVCRT:llmul.obj
- 0001:00003684       __ftol2                    10004684 f   MSVCRT:msvcrt.dll
- 0001:0000368a       _memset                    1000468a f   MSVCRT:msvcrt.dll
- 0001:00003690       ___CppXcptFilter           10004690 f i MSVCRT:crtdll.obj
- 0001:000036b0       __initterm_e               100046b0 f i MSVCRT:crtdll.obj
- 0001:000036f6       __CRT_INIT@12              100046f6 f   MSVCRT:crtdll.obj
- 0001:00003ad9       __DllMainCRTStartup@12     10004ad9 f   MSVCRT:crtdll.obj
- 0001:00003af0       __XcptFilter               10004af0 f   MSVCRT:msvcrt.dll
- 0001:00003b00       __ValidateImageBase        10004b00 f   MSVCRT:pesect.obj
- 0001:00003b40       __FindPESection            10004b40 f   MSVCRT:pesect.obj
- 0001:00003b84       __IsNonwritableInCurrentImage 10004b84 f   MSVCRT:pesect.obj
- 0001:00003bf0       __initterm                 10004bf0 f   MSVCRT:msvcrt.dll
- 0001:00003bf6       __amsg_exit                10004bf6 f   MSVCRT:msvcrt.dll
- 0001:00003bfc       _DllMain@12                10004bfc f   MSVCRT:dllmain.obj
- 0001:00003c04       __SEH_prolog4              10004c04 f   MSVCRT:sehprolg4.obj
- 0001:00003c49       __SEH_epilog4              10004c49 f   MSVCRT:sehprolg4.obj
- 0001:00003c5d       __except_handler4          10004c5d f   MSVCRT:chandler4gs.obj
- 0001:00003c82       ___security_init_cookie    10004c82 f   MSVCRT:gs_support.obj
- 0001:00003d13       @__security_check_cookie@4 10004d13 f   MSVCRT:secchk.obj
- 0001:00003d24       __except_handler4_common   10004d24 f   MSVCRT:msvcrt.dll
- 0001:00003d2a       ___report_gsfailure        10004d2a f   MSVCRT:gs_report.obj
- 0002:00000000       __imp__UnhandledExceptionFilter@4 10005000     kernel32:KERNEL32.dll
- 0002:00000004       __imp__GetCurrentProcess@0 10005004     kernel32:KERNEL32.dll
- 0002:00000008       __imp__TerminateProcess@8  10005008     kernel32:KERNEL32.dll
- 0002:0000000c       __imp__GetSystemTimeAsFileTime@4 1000500c     kernel32:KERNEL32.dll
- 0002:00000010       __imp__GetCurrentProcessId@0 10005010     kernel32:KERNEL32.dll
- 0002:00000014       __imp__GetCurrentThreadId@0 10005014     kernel32:KERNEL32.dll
- 0002:00000018       __imp__GetTickCount@0      10005018     kernel32:KERNEL32.dll
- 0002:0000001c       __imp__QueryPerformanceCounter@4 1000501c     kernel32:KERNEL32.dll
- 0002:00000020       __imp__InterlockedCompareExchange@12 10005020     kernel32:KERNEL32.dll
- 0002:00000024       __imp__Sleep@4             10005024     kernel32:KERNEL32.dll
- 0002:00000028       __imp__InterlockedExchange@8 10005028     kernel32:KERNEL32.dll
- 0002:0000002c       __imp__GetModuleHandleA@4  1000502c     kernel32:KERNEL32.dll
- 0002:00000030       __imp__GetProcAddress@8    10005030     kernel32:KERNEL32.dll
- 0002:00000034       __imp__SetUnhandledExceptionFilter@4 10005034     kernel32:KERNEL32.dll
- 0002:00000038       \177KERNEL32_NULL_THUNK_DATA 10005038     kernel32:KERNEL32.dll
- 0002:0000003c       __imp___initterm           1000503c     MSVCRT:msvcrt.dll
- 0002:00000040       __imp___amsg_exit          10005040     MSVCRT:msvcrt.dll
- 0002:00000044       __imp___XcptFilter         10005044     MSVCRT:msvcrt.dll
- 0002:00000048       __imp___except_handler4_common 10005048     MSVCRT:msvcrt.dll
- 0002:0000004c       __imp__strtol              1000504c     MSVCRT:msvcrt.dll
- 0002:00000050       __imp__atoi                10005050     MSVCRT:msvcrt.dll
- 0002:00000054       __imp__strpbrk             10005054     MSVCRT:msvcrt.dll
- 0002:00000058       __imp__memset              10005058     MSVCRT:msvcrt.dll
- 0002:0000005c       __imp__strncpy             1000505c     MSVCRT:msvcrt.dll
- 0002:00000060       __imp___ftol2              10005060     MSVCRT:msvcrt.dll
- 0002:00000064       __imp__memmove             10005064     MSVCRT:msvcrt.dll
- 0002:00000068       __imp__memcpy              10005068     MSVCRT:msvcrt.dll
- 0002:0000006c       __imp____iob_func          1000506c     MSVCRT:msvcrt.dll
- 0002:00000070       __imp__fprintf             10005070     MSVCRT:msvcrt.dll
- 0002:00000074       __imp__calloc              10005074     MSVCRT:msvcrt.dll
- 0002:00000078       __imp___wassert            10005078     MSVCRT:msvcrt.dll
- 0002:0000007c       __imp__malloc              1000507c     MSVCRT:msvcrt.dll
- 0002:00000080       __imp__free                10005080     MSVCRT:msvcrt.dll
- 0002:00000084       \177msvcrt_NULL_THUNK_DATA 10005084     MSVCRT:msvcrt.dll
- 0002:00000088       ___xc_a                    10005088     MSVCRT:cinitexe.obj
- 0002:0000008c       ___xc_z                    1000508c     MSVCRT:cinitexe.obj
- 0002:00000090       ___xi_a                    10005090     MSVCRT:cinitexe.obj
- 0002:00000098       ___xi_z                    10005098     MSVCRT:cinitexe.obj
- 0002:000000a0       __real@408f400000000000    100050a0     GC.obj
- 0002:000000a8       __pDefaultRawDllMain       100050a8     MSVCRT:crtdll.obj
- 0002:000000b8       __load_config_used         100050b8     MSVCRT:loadcfg.obj
- 0002:00000100       ___safe_se_handler_table   10005100     <linker-defined>
- 0002:000001a4       __IMPORT_DESCRIPTOR_msvcrt 100051a4     MSVCRT:msvcrt.dll
- 0002:000001b8       __IMPORT_DESCRIPTOR_KERNEL32 100051b8     kernel32:KERNEL32.dll
- 0002:000001cc       __NULL_IMPORT_DESCRIPTOR   100051cc     MSVCRT:msvcrt.dll
- 0003:00001d70       ___native_dllmain_reason   10008d70     MSVCRT:natstart.obj
- 0003:00001d74       ___native_vcclrit_reason   10008d74     MSVCRT:natstart.obj
- 0003:00001d78       ___security_cookie         10008d78     MSVCRT:gs_cookie.obj
- 0003:00001d7c       ___security_cookie_complement 10008d7c     MSVCRT:gs_cookie.obj
- 0003:00002224       __jvmti                    10009224     <common>
- 0003:00002228       __jvmti_callbacks          10009228     <common>
- 0003:0000222c       _JVM_DumpHeap15            1000922c     <common>
- 0003:00002230       ___native_startup_state    10009230     <common>
- 0003:00002234       ___native_startup_lock     10009234     <common>
- 0003:00002238       ___onexitend               10009238     <common>
- 0003:0000223c       ___onexitbegin             1000923c     <common>
- 0003:00002240       __pRawDllMain              10009240     <common>
- 0003:00002244       ___dyn_tls_init_callback   10009244     <common>
-
- entry point at        0001:00003ad9
-
- Static symbols
-
- 0001:00000cc0       _isProfilerThread          10001cc0 f   Threads.obj
- 0001:00001470       _convert_jmethodID_to_jint 10002470 f   Stacks.obj
- 0001:00001480       _convert_jint_to_jmethodID 10002480 f   Stacks.obj
- 0001:00001580       _copy_into_data_array      10002580 f   Stacks.obj
- 0001:00001640       _copy_dummy_names_into_data_array 10002640 f   Stacks.obj
- 0001:00001d50       _initializeJVMTI           10002d50 f   common_functions.obj
- 0001:000020c0       _isSameObject              100030c0 f   class_file_cache.obj
- 0001:000020e0       _hash                      100030e0 f   class_file_cache.obj
- 0001:00002120       _grow_ctable               10003120 f   class_file_cache.obj
- 0001:000023f0       _getOwner                  100033f0 f   class_file_cache.obj
- 0001:00002450       _initializeMethods         10003450 f   class_file_cache.obj
- 0001:00002bc0       _save_class_file_bytes     10003bc0 f   class_file_cache.obj
- 0001:00003440       _setupAndCallProfilerRuntimeActivate 10004440 f   attach.obj
- 0001:000036d4       _pre_c_init                100046d4 f   MSVCRT:crtdll.obj
- 0001:0000387d       ___DllMainCRTStartup@12    1000487d f   MSVCRT:crtdll.obj
+ profilerinterface
+
+ Timestamp is 67818f3c (Fri Jan 10 22:21:00 2025)
+
+ Preferred load address is 10000000
+
+ Start         Length     Name                   Class
+ 0001:00000000 00003e1cH .text                   CODE
+ 0002:00000000 00000088H .idata$5                DATA
+ 0002:00000088 00000004H .CRT$XCA                DATA
+ 0002:0000008c 00000004H .CRT$XCZ                DATA
+ 0002:00000090 00000004H .CRT$XIA                DATA
+ 0002:00000094 00000004H .CRT$XIAA               DATA
+ 0002:00000098 00000004H .CRT$XIZ                DATA
+ 0002:000000a0 00000060H .rdata                  DATA
+ 0002:00000100 00000004H .rdata$sxdata           DATA
+ 0002:00000108 0000009cH .xdata$x                DATA
+ 0002:000001a4 00000028H .idata$2                DATA
+ 0002:000001cc 00000014H .idata$3                DATA
+ 0002:000001e0 00000088H .idata$4                DATA
+ 0002:00000268 0000021eH .idata$6                DATA
+ 0002:00000490 00000fc3H .edata                  DATA
+ 0003:00000000 00001d80H .data                   DATA
+ 0003:00001d80 000004c8H .bss                    DATA
+ 0004:00000000 00000058H .rsrc$01                DATA
+ 0004:00000060 00000398H .rsrc$02                DATA
+
+  Address         Publics by Value              Rva+Base       Lib:Object
+
+ 0000:00000000       __except_list              00000000     <absolute>
+ 0000:00000001       ___safe_se_handler_count   00000001     <absolute>
+ 0000:00009876       __ldused                   00009876     <absolute>
+ 0000:00009876       __fltused                  00009876     <absolute>
+ 0000:00000000       ___ImageBase               10000000     <linker-defined>
+ 0001:00000000       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getAllLoadedClasses@8 10001000 f   Classes.obj
+ 0001:00000170       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_cacheLoadedClasses@16 10001170 f   Classes.obj
+ 0001:000001d0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getCachedClassFileBytes@12 100011d0 f   Classes.obj
+ 0001:00000300       _register_class_prepare@16 10001300 f   Classes.obj
+ 0001:00000350       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_enableClassLoadHook@8 10001350 f   Classes.obj
+ 0001:00000420       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_disableClassLoadHook@8 10001420 f   Classes.obj
+ 0001:00000460       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getObjectSize@12 10001460 f   Classes.obj
+ 0001:00000490       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_doRedefineClasses@16 10001490 f   Classes.obj
+ 0001:000006d0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_notifyAboutClassLoaderUnloading@8 100016d0 f   Classes.obj
+ 0001:000006e0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_initialize15@8 100016e0 f   HeapDump.obj
+ 0001:00000730       _Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_takeHeapDump15Native@12 10001730 f   HeapDump.obj
+ 0001:00000790       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_getThreadCPUTimeInNanos@8 10001790 f   Timers.obj
+ 0001:00000800       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_osSleep@12 10001800 f   Timers.obj
+ 0001:00000810       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_enableMicrostateAccounting@12 10001810 f   Timers.obj
+ 0001:00000820       _register_gc_start@4       10001820 f   GC.obj
+ 0001:00000890       _register_gc_finish@4      10001890 f   GC.obj
+ 0001:00000910       _enable_gc_start_finish_hook 10001910 f   GC.obj
+ 0001:000009d0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_activateGCEpochCounter@12 100019d0 f   GC.obj
+ 0001:00000a40       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_resetGCEpochCounter@8 10001a40 f   GC.obj
+ 0001:00000a50       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getCurrentGCEpoch@8 10001a50 f   GC.obj
+ 0001:00000a60       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_objectsAdjacent@16 10001a60 f   GC.obj
+ 0001:00000aa0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCRelativeTimeMetrics@12 10001aa0 f   GC.obj
+ 0001:00000bf0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCStartFinishTimes@16 10001bf0 f   GC.obj
+ 0001:00000c30       _Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_runGC@8 10001c30 f   GC.obj
+ 0001:00000c50       _convert_JVMTI_thread_status_to_jfluid_status 10001c50 f   Threads.obj
+ 0001:00000d50       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordProfilerOwnThreads@16 10001d50 f   Threads.obj
+ 0001:00000f00       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordAdditionalProfilerOwnThread@12 10001f00 f   Threads.obj
+ 0001:00000f30       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getTotalNumberOfThreads@8 10001f30 f   Threads.obj
+ 0001:00000f90       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_suspendTargetAppThreads@12 10001f90 f   Threads.obj
+ 0001:00001050       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_resumeTargetAppThreads@12 10002050 f   Threads.obj
+ 0001:00001110       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_terminateTargetAppThreads@12 10002110 f   Threads.obj
+ 0001:000011d0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_targetAppThreadsExist@8 100021d0 f   Threads.obj
+ 0001:00001280       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getAllThreads@12 10002280 f   Threads.obj
+ 0001:00001390       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getThreadsStatus@16 10002390 f   Threads.obj
+ 0001:00001440       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJVMArguments@8 10002440 f   Threads.obj
+ 0001:00001460       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJavaCommand@8 10002460 f   Threads.obj
+ 0001:000014a0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentJavaStackDepth@12 100024a0 f   Stacks.obj
+ 0001:000014c0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_clearNativeStackFrameBuffer@8 100024c0 f   Stacks.obj
+ 0001:00001500       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentStackFrameIds@20 10002500 f   Stacks.obj
+ 0001:00001680       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getMethodNamesForJMethodIds@20 10002680 f   Stacks.obj
+ 0001:00001a30       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getAllStackTraces@20 10002a30 f   Stacks.obj
+ 0001:00001c90       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_createNativeStackFrameBuffer@12 10002c90 f   Stacks.obj
+ 0001:00001ce0       _get_nano_time             10002ce0 f   common_functions.obj
+ 0001:00001d10       _report_usage              10002d10 f   common_functions.obj
+ 0001:00001f40       _JNI_OnLoad@8              10002f40 f   common_functions.obj
+ 0001:00001f90       _Agent_OnLoad@12           10002f90 f   common_functions.obj
+ 0001:00002080       _cache_loaded_classes      10003080 f   class_file_cache.obj
+ 0001:000022c0       _get_saved_class_file_bytes 100032c0 f   class_file_cache.obj
+ 0001:000023f0       _try_removing_bytes_for_unloaded_classes 100033f0 f   class_file_cache.obj
+ 0001:00002730       _waitInterceptor@16        10003730 f   class_file_cache.obj
+ 0001:000027e0       _sleepInterceptor@16       100037e0 f   class_file_cache.obj
+ 0001:00002890       _parkInterceptor@20        10003890 f   class_file_cache.obj
+ 0001:00002940       _monitor_contended_enter_hook@16 10003940 f   class_file_cache.obj
+ 0001:000029b0       _monitor_contended_entered_hook@16 100039b0 f   class_file_cache.obj
+ 0001:00002a10       _vm_object_alloc@28        10003a10 f   class_file_cache.obj
+ 0001:00002a80       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setParkTrackingEnabled@12 10003a80 f   class_file_cache.obj
+ 0001:00002ad0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setLockContentionMonitoringEnabled@12 10003ad0 f   class_file_cache.obj
+ 0001:00002ae0       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setWaitTrackingEnabled@12 10003ae0 f   class_file_cache.obj
+ 0001:00002b40       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setSleepTrackingEnabled@12 10003b40 f   class_file_cache.obj
+ 0001:00002b90       _Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setVMObjectAllocEnabled@12 10003b90 f   class_file_cache.obj
+ 0001:00002dd0       _class_file_load_hook@40   10003dd0 f   class_file_cache.obj
+ 0001:00002f20       _native_method_bind_hook@24 10003f20 f   class_file_cache.obj
+ 0001:000032e0       _parse_options_and_extract_params 100042e0 f   attach.obj
+ 0001:00003590       _vm_init_hook@12           10004590 f   attach.obj
+ 0001:000035a0       _memcpy                    100045a0 f   MSVCRT:msvcrt.dll
+ 0001:000035b0       __alldiv                   100045b0 f   MSVCRT:lldiv.obj
+ 0001:00003660       __allmul                   10004660 f   MSVCRT:llmul.obj
+ 0001:00003694       __ftol2                    10004694 f   MSVCRT:msvcrt.dll
+ 0001:0000369a       _memset                    1000469a f   MSVCRT:msvcrt.dll
+ 0001:000036a0       ___CppXcptFilter           100046a0 f i MSVCRT:crtdll.obj
+ 0001:000036c0       __initterm_e               100046c0 f i MSVCRT:crtdll.obj
+ 0001:00003706       __CRT_INIT@12              10004706 f   MSVCRT:crtdll.obj
+ 0001:00003ae9       __DllMainCRTStartup@12     10004ae9 f   MSVCRT:crtdll.obj
+ 0001:00003b00       __XcptFilter               10004b00 f   MSVCRT:msvcrt.dll
+ 0001:00003b10       __ValidateImageBase        10004b10 f   MSVCRT:pesect.obj
+ 0001:00003b50       __FindPESection            10004b50 f   MSVCRT:pesect.obj
+ 0001:00003b94       __IsNonwritableInCurrentImage 10004b94 f   MSVCRT:pesect.obj
+ 0001:00003c00       __initterm                 10004c00 f   MSVCRT:msvcrt.dll
+ 0001:00003c06       __amsg_exit                10004c06 f   MSVCRT:msvcrt.dll
+ 0001:00003c0c       _DllMain@12                10004c0c f   MSVCRT:dllmain.obj
+ 0001:00003c14       __SEH_prolog4              10004c14 f   MSVCRT:sehprolg4.obj
+ 0001:00003c59       __SEH_epilog4              10004c59 f   MSVCRT:sehprolg4.obj
+ 0001:00003c6d       __except_handler4          10004c6d f   MSVCRT:chandler4gs.obj
+ 0001:00003c92       ___security_init_cookie    10004c92 f   MSVCRT:gs_support.obj
+ 0001:00003d23       @__security_check_cookie@4 10004d23 f   MSVCRT:secchk.obj
+ 0001:00003d34       __except_handler4_common   10004d34 f   MSVCRT:msvcrt.dll
+ 0001:00003d3a       ___report_gsfailure        10004d3a f   MSVCRT:gs_report.obj
+ 0002:00000000       __imp__UnhandledExceptionFilter@4 10005000     kernel32:KERNEL32.dll
+ 0002:00000004       __imp__GetCurrentProcess@0 10005004     kernel32:KERNEL32.dll
+ 0002:00000008       __imp__TerminateProcess@8  10005008     kernel32:KERNEL32.dll
+ 0002:0000000c       __imp__GetSystemTimeAsFileTime@4 1000500c     kernel32:KERNEL32.dll
+ 0002:00000010       __imp__GetCurrentProcessId@0 10005010     kernel32:KERNEL32.dll
+ 0002:00000014       __imp__GetCurrentThreadId@0 10005014     kernel32:KERNEL32.dll
+ 0002:00000018       __imp__GetTickCount@0      10005018     kernel32:KERNEL32.dll
+ 0002:0000001c       __imp__QueryPerformanceCounter@4 1000501c     kernel32:KERNEL32.dll
+ 0002:00000020       __imp__InterlockedCompareExchange@12 10005020     kernel32:KERNEL32.dll
+ 0002:00000024       __imp__Sleep@4             10005024     kernel32:KERNEL32.dll
+ 0002:00000028       __imp__InterlockedExchange@8 10005028     kernel32:KERNEL32.dll
+ 0002:0000002c       __imp__GetModuleHandleA@4  1000502c     kernel32:KERNEL32.dll
+ 0002:00000030       __imp__GetProcAddress@8    10005030     kernel32:KERNEL32.dll
+ 0002:00000034       __imp__SetUnhandledExceptionFilter@4 10005034     kernel32:KERNEL32.dll
+ 0002:00000038       \177KERNEL32_NULL_THUNK_DATA 10005038     kernel32:KERNEL32.dll
+ 0002:0000003c       __imp___initterm           1000503c     MSVCRT:msvcrt.dll
+ 0002:00000040       __imp___amsg_exit          10005040     MSVCRT:msvcrt.dll
+ 0002:00000044       __imp___XcptFilter         10005044     MSVCRT:msvcrt.dll
+ 0002:00000048       __imp___except_handler4_common 10005048     MSVCRT:msvcrt.dll
+ 0002:0000004c       __imp__strtol              1000504c     MSVCRT:msvcrt.dll
+ 0002:00000050       __imp__atoi                10005050     MSVCRT:msvcrt.dll
+ 0002:00000054       __imp__strpbrk             10005054     MSVCRT:msvcrt.dll
+ 0002:00000058       __imp__memset              10005058     MSVCRT:msvcrt.dll
+ 0002:0000005c       __imp__strncpy             1000505c     MSVCRT:msvcrt.dll
+ 0002:00000060       __imp___ftol2              10005060     MSVCRT:msvcrt.dll
+ 0002:00000064       __imp__memmove             10005064     MSVCRT:msvcrt.dll
+ 0002:00000068       __imp__memcpy              10005068     MSVCRT:msvcrt.dll
+ 0002:0000006c       __imp____iob_func          1000506c     MSVCRT:msvcrt.dll
+ 0002:00000070       __imp__fprintf             10005070     MSVCRT:msvcrt.dll
+ 0002:00000074       __imp__calloc              10005074     MSVCRT:msvcrt.dll
+ 0002:00000078       __imp___wassert            10005078     MSVCRT:msvcrt.dll
+ 0002:0000007c       __imp__malloc              1000507c     MSVCRT:msvcrt.dll
+ 0002:00000080       __imp__free                10005080     MSVCRT:msvcrt.dll
+ 0002:00000084       \177msvcrt_NULL_THUNK_DATA 10005084     MSVCRT:msvcrt.dll
+ 0002:00000088       ___xc_a                    10005088     MSVCRT:cinitexe.obj
+ 0002:0000008c       ___xc_z                    1000508c     MSVCRT:cinitexe.obj
+ 0002:00000090       ___xi_a                    10005090     MSVCRT:cinitexe.obj
+ 0002:00000098       ___xi_z                    10005098     MSVCRT:cinitexe.obj
+ 0002:000000a0       __real@408f400000000000    100050a0     GC.obj
+ 0002:000000a8       __pDefaultRawDllMain       100050a8     MSVCRT:crtdll.obj
+ 0002:000000b8       __load_config_used         100050b8     MSVCRT:loadcfg.obj
+ 0002:00000100       ___safe_se_handler_table   10005100     <linker-defined>
+ 0002:000001a4       __IMPORT_DESCRIPTOR_msvcrt 100051a4     MSVCRT:msvcrt.dll
+ 0002:000001b8       __IMPORT_DESCRIPTOR_KERNEL32 100051b8     kernel32:KERNEL32.dll
+ 0002:000001cc       __NULL_IMPORT_DESCRIPTOR   100051cc     MSVCRT:msvcrt.dll
+ 0003:00001d70       ___native_dllmain_reason   10008d70     MSVCRT:natstart.obj
+ 0003:00001d74       ___native_vcclrit_reason   10008d74     MSVCRT:natstart.obj
+ 0003:00001d78       ___security_cookie         10008d78     MSVCRT:gs_cookie.obj
+ 0003:00001d7c       ___security_cookie_complement 10008d7c     MSVCRT:gs_cookie.obj
+ 0003:00002224       __jvmti                    10009224     <common>
+ 0003:00002228       __jvmti_callbacks          10009228     <common>
+ 0003:0000222c       _JVM_DumpHeap15            1000922c     <common>
+ 0003:00002230       ___native_startup_state    10009230     <common>
+ 0003:00002234       ___native_startup_lock     10009234     <common>
+ 0003:00002238       ___onexitend               10009238     <common>
+ 0003:0000223c       ___onexitbegin             1000923c     <common>
+ 0003:00002240       __pRawDllMain              10009240     <common>
+ 0003:00002244       ___dyn_tls_init_callback   10009244     <common>
+
+ entry point at        0001:00003ae9
+
+ Static symbols
+
+ 0001:00000cd0       _isProfilerThread          10001cd0 f   Threads.obj
+ 0001:00001480       _convert_jmethodID_to_jint 10002480 f   Stacks.obj
+ 0001:00001490       _convert_jint_to_jmethodID 10002490 f   Stacks.obj
+ 0001:00001590       _copy_into_data_array      10002590 f   Stacks.obj
+ 0001:00001650       _copy_dummy_names_into_data_array 10002650 f   Stacks.obj
+ 0001:00001d60       _initializeJVMTI           10002d60 f   common_functions.obj
+ 0001:000020d0       _isSameObject              100030d0 f   class_file_cache.obj
+ 0001:000020f0       _hash                      100030f0 f   class_file_cache.obj
+ 0001:00002130       _grow_ctable               10003130 f   class_file_cache.obj
+ 0001:00002400       _getOwner                  10003400 f   class_file_cache.obj
+ 0001:00002460       _initializeMethods         10003460 f   class_file_cache.obj
+ 0001:00002bd0       _save_class_file_bytes     10003bd0 f   class_file_cache.obj
+ 0001:00003450       _setupAndCallProfilerRuntimeActivate 10004450 f   attach.obj
+ 0001:000036e4       _pre_c_init                100046e4 f   MSVCRT:crtdll.obj
+ 0001:0000388d       ___DllMainCRTStartup@12    1000488d f   MSVCRT:crtdll.obj
Binary files 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows-amd64/profilerinterface.dll and 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows-amd64/profilerinterface.dll differ
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows-amd64/profilerinterface.map 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows-amd64/profilerinterface.map
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows-amd64/profilerinterface.map	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/release/lib/deployed/jdk16/windows-amd64/profilerinterface.map	2025-04-17 09:07:34.000000000 +0000
@@ -1,190 +1,190 @@
- profilerinterface
-
- Timestamp is 5af2f809 (Wed May 09 15:30:49 2018)
-
- Preferred load address is 0000000180000000
-
- Start         Length     Name                   Class
- 0001:00000000 00005197H .text                   CODE
- 0001:00005197 0000033aH .text$x                 CODE
- 0002:00000000 000000d8H .idata$5                DATA
- 0002:000000d8 00000008H .CRT$XCA                DATA
- 0002:000000e0 00000008H .CRT$XCZ                DATA
- 0002:000000e8 00000008H .CRT$XIA                DATA
- 0002:000000f0 00000008H .CRT$XIAA               DATA
- 0002:000000f8 00000008H .CRT$XIZ                DATA
- 0002:00000100 00000010H .rdata                  DATA
- 0002:00000110 00000794H .xdata                  DATA
- 0002:000008a4 00000028H .idata$2                DATA
- 0002:000008cc 00000014H .idata$3                DATA
- 0002:000008e0 000000d8H .idata$4                DATA
- 0002:000009b8 0000017cH .idata$6                DATA
- 0002:00000b40 00000f22H .edata                  DATA
- 0003:00000000 00001e80H .data                   DATA
- 0003:00001e80 000002f8H .bss                    DATA
- 0004:00000000 00000570H .pdata                  DATA
- 0005:00000000 00000058H .rsrc$01                DATA
- 0005:00000060 00000398H .rsrc$02                DATA
-
-  Address         Publics by Value              Rva+Base               Lib:Object
-
- 0000:00000000       ___safe_se_handler_count   0000000000000000     <absolute>
- 0000:00000000       ___safe_se_handler_table   0000000000000000     <absolute>
- 0000:00000000       __ImageBase                0000000180000000     <linker-defined>
- 0001:00000000       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getAllLoadedClasses 0000000180001000 f   Classes.obj
- 0001:000001e0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_cacheLoadedClasses 00000001800011e0 f   Classes.obj
- 0001:00000280       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getCachedClassFileBytes 0000000180001280 f   Classes.obj
- 0001:000003d0       register_class_prepare     00000001800013d0 f   Classes.obj
- 0001:00000420       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_enableClassLoadHook 0000000180001420 f   Classes.obj
- 0001:00000520       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_disableClassLoadHook 0000000180001520 f   Classes.obj
- 0001:00000570       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getObjectSize 0000000180001570 f   Classes.obj
- 0001:000005a0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_doRedefineClasses 00000001800015a0 f   Classes.obj
- 0001:00000880       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_notifyAboutClassLoaderUnloading 0000000180001880 f   Classes.obj
- 0001:00000890       Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_initialize15 0000000180001890 f   HeapDump.obj
- 0001:00000900       Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_takeHeapDump15Native 0000000180001900 f   HeapDump.obj
- 0001:00000980       Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_getThreadCPUTimeInNanos 0000000180001980 f   Timers.obj
- 0001:000009f0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_osSleep 00000001800019f0 f   Timers.obj
- 0001:00000a00       Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_enableMicrostateAccounting 0000000180001a00 f   Timers.obj
- 0001:00000a10       register_gc_start          0000000180001a10 f   GC.obj
- 0001:00000aa0       register_gc_finish         0000000180001aa0 f   GC.obj
- 0001:00000b30       enable_gc_start_finish_hook 0000000180001b30 f   GC.obj
- 0001:00000c20       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_activateGCEpochCounter 0000000180001c20 f   GC.obj
- 0001:00000d80       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_resetGCEpochCounter 0000000180001d80 f   GC.obj
- 0001:00000da0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getCurrentGCEpoch 0000000180001da0 f   GC.obj
- 0001:00000db0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_objectsAdjacent 0000000180001db0 f   GC.obj
- 0001:00000de0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCRelativeTimeMetrics 0000000180001de0 f   GC.obj
- 0001:00000f20       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCStartFinishTimes 0000000180001f20 f   GC.obj
- 0001:00000f90       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_runGC 0000000180001f90 f   GC.obj
- 0001:00000fb0       convert_JVMTI_thread_status_to_jfluid_status 0000000180001fb0 f   Threads.obj
- 0001:00001110       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordProfilerOwnThreads 0000000180002110 f   Threads.obj
- 0001:00001350       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordAdditionalProfilerOwnThread 0000000180002350 f   Threads.obj
- 0001:000013a0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getTotalNumberOfThreads 00000001800023a0 f   Threads.obj
- 0001:00001410       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_suspendTargetAppThreads 0000000180002410 f   Threads.obj
- 0001:000015b0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_resumeTargetAppThreads 00000001800025b0 f   Threads.obj
- 0001:00001750       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_terminateTargetAppThreads 0000000180002750 f   Threads.obj
- 0001:000018e0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_targetAppThreadsExist 00000001800028e0 f   Threads.obj
- 0001:00001a60       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getAllThreads 0000000180002a60 f   Threads.obj
- 0001:00001bd0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getThreadsStatus 0000000180002bd0 f   Threads.obj
- 0001:00001d50       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJVMArguments 0000000180002d50 f   Threads.obj
- 0001:00001d70       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJavaCommand 0000000180002d70 f   Threads.obj
- 0001:00001e30       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentJavaStackDepth 0000000180002e30 f   Stacks.obj
- 0001:00001e60       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_clearNativeStackFrameBuffer 0000000180002e60 f   Stacks.obj
- 0001:00001eb0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentStackFrameIds 0000000180002eb0 f   Stacks.obj
- 0001:000023f0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getMethodNamesForJMethodIds 00000001800033f0 f   Stacks.obj
- 0001:00002810       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getAllStackTraces 0000000180003810 f   Stacks.obj
- 0001:00002ba0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_createNativeStackFrameBuffer 0000000180003ba0 f   Stacks.obj
- 0001:00002c00       get_nano_time              0000000180003c00 f   common_functions.obj
- 0001:00002c30       report_usage               0000000180003c30 f   common_functions.obj
- 0001:00002ed0       JNI_OnLoad                 0000000180003ed0 f   common_functions.obj
- 0001:00002f30       Agent_OnLoad               0000000180003f30 f   common_functions.obj
- 0001:00003090       cache_loaded_classes       0000000180004090 f   class_file_cache.obj
- 0001:000033e0       get_saved_class_file_bytes 00000001800043e0 f   class_file_cache.obj
- 0001:000035b0       try_removing_bytes_for_unloaded_classes 00000001800045b0 f   class_file_cache.obj
- 0001:000039e0       waitInterceptor            00000001800049e0 f   class_file_cache.obj
- 0001:00003ab0       sleepInterceptor           0000000180004ab0 f   class_file_cache.obj
- 0001:00003b80       parkInterceptor            0000000180004b80 f   class_file_cache.obj
- 0001:00003c70       monitor_contended_enter_hook 0000000180004c70 f   class_file_cache.obj
- 0001:00003d70       monitor_contended_entered_hook 0000000180004d70 f   class_file_cache.obj
- 0001:00003df0       vm_object_alloc            0000000180004df0 f   class_file_cache.obj
- 0001:00003ea0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setParkTrackingEnabled 0000000180004ea0 f   class_file_cache.obj
- 0001:00003f00       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setLockContentionMonitoringEnabled 0000000180004f00 f   class_file_cache.obj
- 0001:00003f10       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setWaitTrackingEnabled 0000000180004f10 f   class_file_cache.obj
- 0001:00003f80       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setSleepTrackingEnabled 0000000180004f80 f   class_file_cache.obj
- 0001:00003fe0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setVMObjectAllocEnabled 0000000180004fe0 f   class_file_cache.obj
- 0001:000042c0       class_file_load_hook       00000001800052c0 f   class_file_cache.obj
- 0001:00004460       native_method_bind_hook    0000000180005460 f   class_file_cache.obj
- 0001:00004830       parse_options_and_extract_params 0000000180005830 f   attach.obj
- 0001:00004bb0       vm_init_hook               0000000180005bb0 f   attach.obj
- 0001:00004bbe       memcpy                     0000000180005bbe f   MSVCRT:msvcrt.dll
- 0001:00004bc4       memset                     0000000180005bc4 f   MSVCRT:msvcrt.dll
- 0001:00004c00       _CRT_INIT                  0000000180005c00 f   MSVCRT:crtdll.obj
- 0001:00004fc4       _DllMainCRTStartup         0000000180005fc4 f   MSVCRT:crtdll.obj
- 0001:00005002       _XcptFilter                0000000180006002 f   MSVCRT:msvcrt.dll
- 0001:00005010       _ValidateImageBase         0000000180006010 f   MSVCRT:pesect.obj
- 0001:00005040       _FindPESection             0000000180006040 f   MSVCRT:pesect.obj
- 0001:00005088       _IsNonwritableInCurrentImage 0000000180006088 f   MSVCRT:pesect.obj
- 0001:000050ca       _initterm                  00000001800060ca f   MSVCRT:msvcrt.dll
- 0001:000050d0       _amsg_exit                 00000001800060d0 f   MSVCRT:msvcrt.dll
- 0001:000050d6       __C_specific_handler       00000001800060d6 f   MSVCRT:msvcrt.dll
- 0001:000050dc       DllMain                    00000001800060dc f   MSVCRT:dllmain.obj
- 0001:000050e4       __security_init_cookie     00000001800060e4 f   MSVCRT:gs_support.obj
- 0002:00000000       __imp_GetCurrentProcessId  0000000180007000     kernel32:KERNEL32.dll
- 0002:00000008       __imp_GetCurrentThreadId   0000000180007008     kernel32:KERNEL32.dll
- 0002:00000010       __imp_GetTickCount         0000000180007010     kernel32:KERNEL32.dll
- 0002:00000018       __imp_QueryPerformanceCounter 0000000180007018     kernel32:KERNEL32.dll
- 0002:00000020       __imp_Sleep                0000000180007020     kernel32:KERNEL32.dll
- 0002:00000028       __imp_GetModuleHandleA     0000000180007028     kernel32:KERNEL32.dll
- 0002:00000030       __imp_GetProcAddress       0000000180007030     kernel32:KERNEL32.dll
- 0002:00000038       __imp_GetSystemTimeAsFileTime 0000000180007038     kernel32:KERNEL32.dll
- 0002:00000040       \177KERNEL32_NULL_THUNK_DATA 0000000180007040     kernel32:KERNEL32.dll
- 0002:00000048       __imp_memset               0000000180007048     MSVCRT:msvcrt.dll
- 0002:00000050       __imp_strpbrk              0000000180007050     MSVCRT:msvcrt.dll
- 0002:00000058       __imp_atoi                 0000000180007058     MSVCRT:msvcrt.dll
- 0002:00000060       __imp_strtol               0000000180007060     MSVCRT:msvcrt.dll
- 0002:00000068       __imp__XcptFilter          0000000180007068     MSVCRT:msvcrt.dll
- 0002:00000070       __imp__initterm            0000000180007070     MSVCRT:msvcrt.dll
- 0002:00000078       __imp_strncpy              0000000180007078     MSVCRT:msvcrt.dll
- 0002:00000080       __imp___C_specific_handler 0000000180007080     MSVCRT:msvcrt.dll
- 0002:00000088       __imp_memmove              0000000180007088     MSVCRT:msvcrt.dll
- 0002:00000090       __imp_memcpy               0000000180007090     MSVCRT:msvcrt.dll
- 0002:00000098       __imp___iob_func           0000000180007098     MSVCRT:msvcrt.dll
- 0002:000000a0       __imp_fprintf              00000001800070a0     MSVCRT:msvcrt.dll
- 0002:000000a8       __imp_calloc               00000001800070a8     MSVCRT:msvcrt.dll
- 0002:000000b0       __imp__wassert             00000001800070b0     MSVCRT:msvcrt.dll
- 0002:000000b8       __imp_malloc               00000001800070b8     MSVCRT:msvcrt.dll
- 0002:000000c0       __imp__amsg_exit           00000001800070c0     MSVCRT:msvcrt.dll
- 0002:000000c8       __imp_free                 00000001800070c8     MSVCRT:msvcrt.dll
- 0002:000000d0       \177msvcrt_NULL_THUNK_DATA 00000001800070d0     MSVCRT:msvcrt.dll
- 0002:000000d8       __xc_a                     00000001800070d8     MSVCRT:cinitexe.obj
- 0002:000000e0       __xc_z                     00000001800070e0     MSVCRT:cinitexe.obj
- 0002:000000e8       __xi_a                     00000001800070e8     MSVCRT:cinitexe.obj
- 0002:000000f8       __xi_z                     00000001800070f8     MSVCRT:cinitexe.obj
- 0002:00000100       __real@447a0000            0000000180007100     GC.obj
- 0002:00000108       _pDefaultRawDllMain        0000000180007108     MSVCRT:crtdll.obj
- 0002:000008a4       __IMPORT_DESCRIPTOR_msvcrt 00000001800078a4     MSVCRT:msvcrt.dll
- 0002:000008b8       __IMPORT_DESCRIPTOR_KERNEL32 00000001800078b8     kernel32:KERNEL32.dll
- 0002:000008cc       __NULL_IMPORT_DESCRIPTOR   00000001800078cc     MSVCRT:msvcrt.dll
- 0003:00001e60       _fltused                   000000018000ae60     MSVCRT:dllsupp.obj
- 0003:00001e64       __native_dllmain_reason    000000018000ae64     MSVCRT:natstart.obj
- 0003:00001e68       __native_vcclrit_reason    000000018000ae68     MSVCRT:natstart.obj
- 0003:00001e70       __security_cookie          000000018000ae70     MSVCRT:gs_cookie.obj
- 0003:00001e78       __security_cookie_complement 000000018000ae78     MSVCRT:gs_cookie.obj
- 0003:00002130       _jvmti                     000000018000b130     <common>
- 0003:00002138       _jvmti_callbacks           000000018000b138     <common>
- 0003:00002140       JVM_DumpHeap15             000000018000b140     <common>
- 0003:00002148       __native_startup_state     000000018000b148     <common>
- 0003:00002150       __native_startup_lock      000000018000b150     <common>
- 0003:00002158       __onexitend                000000018000b158     <common>
- 0003:00002160       __onexitbegin              000000018000b160     <common>
- 0003:00002168       _pRawDllMain               000000018000b168     <common>
- 0003:00002170       __dyn_tls_init_callback    000000018000b170     <common>
-
- entry point at        0001:00004fc4
-
- Static symbols
-
- 0001:00001030       isProfilerThread           0000000180002030 f   Threads.obj
- 0001:00001d90       convert_jmethodID_to_jint  0000000180002d90 f   Stacks.obj
- 0001:00001e10       convert_jint_to_jmethodID  0000000180002e10 f   Stacks.obj
- 0001:00002010       copy_into_data_array       0000000180003010 f   Stacks.obj
- 0001:00002100       copy_dummy_names_into_data_array 0000000180003100 f   Stacks.obj
- 0001:00002c90       initializeJVMTI            0000000180003c90 f   common_functions.obj
- 0001:000030f0       isSameObject               00000001800040f0 f   class_file_cache.obj
- 0001:00003120       hash                       0000000180004120 f   class_file_cache.obj
- 0001:000031a0       grow_ctable                00000001800041a0 f   class_file_cache.obj
- 0001:000035c0       getOwner                   00000001800045c0 f   class_file_cache.obj
- 0001:00003630       initializeMethods          0000000180004630 f   class_file_cache.obj
- 0001:00004030       save_class_file_bytes      0000000180005030 f   class_file_cache.obj
- 0001:000049f0       setupAndCallProfilerRuntimeActivate 00000001800059f0 f   attach.obj
- 0001:00004bcc       pre_c_init                 0000000180005bcc f   MSVCRT:crtdll.obj
- 0001:00004dd4       __DllMainCRTStartup        0000000180005dd4 f   MSVCRT:crtdll.obj
- 0001:00005197       __DllMainCRTStartup$filt$0 0000000180006197 f   MSVCRT:crtdll.obj
- 0001:000051f7       __DllMainCRTStartup$filt$1 00000001800061f7 f   MSVCRT:crtdll.obj
- 0001:00005257       __DllMainCRTStartup$filt$2 0000000180006257 f   MSVCRT:crtdll.obj
- 0001:000052b7       __DllMainCRTStartup$filt$3 00000001800062b7 f   MSVCRT:crtdll.obj
- 0001:00005317       __DllMainCRTStartup$filt$4 0000000180006317 f   MSVCRT:crtdll.obj
- 0001:00005377       __DllMainCRTStartup$filt$5 0000000180006377 f   MSVCRT:crtdll.obj
- 0001:000053d7       __DllMainCRTStartup$filt$6 00000001800063d7 f   MSVCRT:crtdll.obj
- 0001:00005437       __DllMainCRTStartup$filt$7 0000000180006437 f   MSVCRT:crtdll.obj
- 0001:00005497       __DllMainCRTStartup$fin$8  0000000180006497 f   MSVCRT:crtdll.obj
- 0001:000054b0       _IsNonwritableInCurrentImage$filt$0 00000001800064b0 f   MSVCRT:pesect.obj
+ profilerinterface
+
+ Timestamp is 67818f7c (Fri Jan 10 22:22:04 2025)
+
+ Preferred load address is 0000000180000000
+
+ Start         Length     Name                   Class
+ 0001:00000000 000051a7H .text                   CODE
+ 0001:000051a7 0000033aH .text$x                 CODE
+ 0002:00000000 000000d8H .idata$5                DATA
+ 0002:000000d8 00000008H .CRT$XCA                DATA
+ 0002:000000e0 00000008H .CRT$XCZ                DATA
+ 0002:000000e8 00000008H .CRT$XIA                DATA
+ 0002:000000f0 00000008H .CRT$XIAA               DATA
+ 0002:000000f8 00000008H .CRT$XIZ                DATA
+ 0002:00000100 00000010H .rdata                  DATA
+ 0002:00000110 00000794H .xdata                  DATA
+ 0002:000008a4 00000028H .idata$2                DATA
+ 0002:000008cc 00000014H .idata$3                DATA
+ 0002:000008e0 000000d8H .idata$4                DATA
+ 0002:000009b8 0000017cH .idata$6                DATA
+ 0002:00000b40 00000f22H .edata                  DATA
+ 0003:00000000 00001e80H .data                   DATA
+ 0003:00001e80 000002f8H .bss                    DATA
+ 0004:00000000 00000570H .pdata                  DATA
+ 0005:00000000 00000058H .rsrc$01                DATA
+ 0005:00000060 00000398H .rsrc$02                DATA
+
+  Address         Publics by Value              Rva+Base               Lib:Object
+
+ 0000:00000000       ___safe_se_handler_count   0000000000000000     <absolute>
+ 0000:00000000       ___safe_se_handler_table   0000000000000000     <absolute>
+ 0000:00000000       __ImageBase                0000000180000000     <linker-defined>
+ 0001:00000000       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getAllLoadedClasses 0000000180001000 f   Classes.obj
+ 0001:000001e0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_cacheLoadedClasses 00000001800011e0 f   Classes.obj
+ 0001:00000280       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getCachedClassFileBytes 0000000180001280 f   Classes.obj
+ 0001:000003d0       register_class_prepare     00000001800013d0 f   Classes.obj
+ 0001:00000420       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_enableClassLoadHook 0000000180001420 f   Classes.obj
+ 0001:00000520       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_disableClassLoadHook 0000000180001520 f   Classes.obj
+ 0001:00000570       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_getObjectSize 0000000180001570 f   Classes.obj
+ 0001:000005a0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_doRedefineClasses 00000001800015a0 f   Classes.obj
+ 0001:00000880       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_notifyAboutClassLoaderUnloading 0000000180001880 f   Classes.obj
+ 0001:00000890       Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_initialize15 0000000180001890 f   HeapDump.obj
+ 0001:00000900       Java_org_graalvm_visualvm_lib_jfluid_server_system_HeapDump_takeHeapDump15Native 0000000180001900 f   HeapDump.obj
+ 0001:00000980       Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_getThreadCPUTimeInNanos 0000000180001980 f   Timers.obj
+ 0001:00000a00       Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_osSleep 0000000180001a00 f   Timers.obj
+ 0001:00000a10       Java_org_graalvm_visualvm_lib_jfluid_server_system_Timers_enableMicrostateAccounting 0000000180001a10 f   Timers.obj
+ 0001:00000a20       register_gc_start          0000000180001a20 f   GC.obj
+ 0001:00000ab0       register_gc_finish         0000000180001ab0 f   GC.obj
+ 0001:00000b40       enable_gc_start_finish_hook 0000000180001b40 f   GC.obj
+ 0001:00000c30       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_activateGCEpochCounter 0000000180001c30 f   GC.obj
+ 0001:00000d90       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_resetGCEpochCounter 0000000180001d90 f   GC.obj
+ 0001:00000db0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getCurrentGCEpoch 0000000180001db0 f   GC.obj
+ 0001:00000dc0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_objectsAdjacent 0000000180001dc0 f   GC.obj
+ 0001:00000df0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCRelativeTimeMetrics 0000000180001df0 f   GC.obj
+ 0001:00000f30       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_getGCStartFinishTimes 0000000180001f30 f   GC.obj
+ 0001:00000fa0       Java_org_graalvm_visualvm_lib_jfluid_server_system_GC_runGC 0000000180001fa0 f   GC.obj
+ 0001:00000fc0       convert_JVMTI_thread_status_to_jfluid_status 0000000180001fc0 f   Threads.obj
+ 0001:00001120       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordProfilerOwnThreads 0000000180002120 f   Threads.obj
+ 0001:00001360       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_recordAdditionalProfilerOwnThread 0000000180002360 f   Threads.obj
+ 0001:000013b0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getTotalNumberOfThreads 00000001800023b0 f   Threads.obj
+ 0001:00001420       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_suspendTargetAppThreads 0000000180002420 f   Threads.obj
+ 0001:000015c0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_resumeTargetAppThreads 00000001800025c0 f   Threads.obj
+ 0001:00001760       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_terminateTargetAppThreads 0000000180002760 f   Threads.obj
+ 0001:000018f0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_targetAppThreadsExist 00000001800028f0 f   Threads.obj
+ 0001:00001a70       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getAllThreads 0000000180002a70 f   Threads.obj
+ 0001:00001be0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getThreadsStatus 0000000180002be0 f   Threads.obj
+ 0001:00001d60       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJVMArguments 0000000180002d60 f   Threads.obj
+ 0001:00001d80       Java_org_graalvm_visualvm_lib_jfluid_server_system_Threads_getJavaCommand 0000000180002d80 f   Threads.obj
+ 0001:00001e40       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentJavaStackDepth 0000000180002e40 f   Stacks.obj
+ 0001:00001e70       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_clearNativeStackFrameBuffer 0000000180002e70 f   Stacks.obj
+ 0001:00001ec0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getCurrentStackFrameIds 0000000180002ec0 f   Stacks.obj
+ 0001:00002400       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getMethodNamesForJMethodIds 0000000180003400 f   Stacks.obj
+ 0001:00002820       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_getAllStackTraces 0000000180003820 f   Stacks.obj
+ 0001:00002bb0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Stacks_createNativeStackFrameBuffer 0000000180003bb0 f   Stacks.obj
+ 0001:00002c10       get_nano_time              0000000180003c10 f   common_functions.obj
+ 0001:00002c40       report_usage               0000000180003c40 f   common_functions.obj
+ 0001:00002ee0       JNI_OnLoad                 0000000180003ee0 f   common_functions.obj
+ 0001:00002f40       Agent_OnLoad               0000000180003f40 f   common_functions.obj
+ 0001:000030a0       cache_loaded_classes       00000001800040a0 f   class_file_cache.obj
+ 0001:000033f0       get_saved_class_file_bytes 00000001800043f0 f   class_file_cache.obj
+ 0001:000035c0       try_removing_bytes_for_unloaded_classes 00000001800045c0 f   class_file_cache.obj
+ 0001:000039f0       waitInterceptor            00000001800049f0 f   class_file_cache.obj
+ 0001:00003ac0       sleepInterceptor           0000000180004ac0 f   class_file_cache.obj
+ 0001:00003b90       parkInterceptor            0000000180004b90 f   class_file_cache.obj
+ 0001:00003c80       monitor_contended_enter_hook 0000000180004c80 f   class_file_cache.obj
+ 0001:00003d80       monitor_contended_entered_hook 0000000180004d80 f   class_file_cache.obj
+ 0001:00003e00       vm_object_alloc            0000000180004e00 f   class_file_cache.obj
+ 0001:00003eb0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setParkTrackingEnabled 0000000180004eb0 f   class_file_cache.obj
+ 0001:00003f10       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setLockContentionMonitoringEnabled 0000000180004f10 f   class_file_cache.obj
+ 0001:00003f20       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setWaitTrackingEnabled 0000000180004f20 f   class_file_cache.obj
+ 0001:00003f90       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setSleepTrackingEnabled 0000000180004f90 f   class_file_cache.obj
+ 0001:00003ff0       Java_org_graalvm_visualvm_lib_jfluid_server_system_Classes_setVMObjectAllocEnabled 0000000180004ff0 f   class_file_cache.obj
+ 0001:000042d0       class_file_load_hook       00000001800052d0 f   class_file_cache.obj
+ 0001:00004470       native_method_bind_hook    0000000180005470 f   class_file_cache.obj
+ 0001:00004840       parse_options_and_extract_params 0000000180005840 f   attach.obj
+ 0001:00004bc0       vm_init_hook               0000000180005bc0 f   attach.obj
+ 0001:00004bce       memcpy                     0000000180005bce f   MSVCRT:msvcrt.dll
+ 0001:00004bd4       memset                     0000000180005bd4 f   MSVCRT:msvcrt.dll
+ 0001:00004c10       _CRT_INIT                  0000000180005c10 f   MSVCRT:crtdll.obj
+ 0001:00004fd4       _DllMainCRTStartup         0000000180005fd4 f   MSVCRT:crtdll.obj
+ 0001:00005012       _XcptFilter                0000000180006012 f   MSVCRT:msvcrt.dll
+ 0001:00005020       _ValidateImageBase         0000000180006020 f   MSVCRT:pesect.obj
+ 0001:00005050       _FindPESection             0000000180006050 f   MSVCRT:pesect.obj
+ 0001:00005098       _IsNonwritableInCurrentImage 0000000180006098 f   MSVCRT:pesect.obj
+ 0001:000050da       _initterm                  00000001800060da f   MSVCRT:msvcrt.dll
+ 0001:000050e0       _amsg_exit                 00000001800060e0 f   MSVCRT:msvcrt.dll
+ 0001:000050e6       __C_specific_handler       00000001800060e6 f   MSVCRT:msvcrt.dll
+ 0001:000050ec       DllMain                    00000001800060ec f   MSVCRT:dllmain.obj
+ 0001:000050f4       __security_init_cookie     00000001800060f4 f   MSVCRT:gs_support.obj
+ 0002:00000000       __imp_GetCurrentProcessId  0000000180007000     kernel32:KERNEL32.dll
+ 0002:00000008       __imp_GetCurrentThreadId   0000000180007008     kernel32:KERNEL32.dll
+ 0002:00000010       __imp_GetTickCount         0000000180007010     kernel32:KERNEL32.dll
+ 0002:00000018       __imp_QueryPerformanceCounter 0000000180007018     kernel32:KERNEL32.dll
+ 0002:00000020       __imp_Sleep                0000000180007020     kernel32:KERNEL32.dll
+ 0002:00000028       __imp_GetModuleHandleA     0000000180007028     kernel32:KERNEL32.dll
+ 0002:00000030       __imp_GetProcAddress       0000000180007030     kernel32:KERNEL32.dll
+ 0002:00000038       __imp_GetSystemTimeAsFileTime 0000000180007038     kernel32:KERNEL32.dll
+ 0002:00000040       \177KERNEL32_NULL_THUNK_DATA 0000000180007040     kernel32:KERNEL32.dll
+ 0002:00000048       __imp_memset               0000000180007048     MSVCRT:msvcrt.dll
+ 0002:00000050       __imp_strpbrk              0000000180007050     MSVCRT:msvcrt.dll
+ 0002:00000058       __imp_atoi                 0000000180007058     MSVCRT:msvcrt.dll
+ 0002:00000060       __imp_strtol               0000000180007060     MSVCRT:msvcrt.dll
+ 0002:00000068       __imp__XcptFilter          0000000180007068     MSVCRT:msvcrt.dll
+ 0002:00000070       __imp__initterm            0000000180007070     MSVCRT:msvcrt.dll
+ 0002:00000078       __imp_strncpy              0000000180007078     MSVCRT:msvcrt.dll
+ 0002:00000080       __imp___C_specific_handler 0000000180007080     MSVCRT:msvcrt.dll
+ 0002:00000088       __imp_memmove              0000000180007088     MSVCRT:msvcrt.dll
+ 0002:00000090       __imp_memcpy               0000000180007090     MSVCRT:msvcrt.dll
+ 0002:00000098       __imp___iob_func           0000000180007098     MSVCRT:msvcrt.dll
+ 0002:000000a0       __imp_fprintf              00000001800070a0     MSVCRT:msvcrt.dll
+ 0002:000000a8       __imp_calloc               00000001800070a8     MSVCRT:msvcrt.dll
+ 0002:000000b0       __imp__wassert             00000001800070b0     MSVCRT:msvcrt.dll
+ 0002:000000b8       __imp_malloc               00000001800070b8     MSVCRT:msvcrt.dll
+ 0002:000000c0       __imp__amsg_exit           00000001800070c0     MSVCRT:msvcrt.dll
+ 0002:000000c8       __imp_free                 00000001800070c8     MSVCRT:msvcrt.dll
+ 0002:000000d0       \177msvcrt_NULL_THUNK_DATA 00000001800070d0     MSVCRT:msvcrt.dll
+ 0002:000000d8       __xc_a                     00000001800070d8     MSVCRT:cinitexe.obj
+ 0002:000000e0       __xc_z                     00000001800070e0     MSVCRT:cinitexe.obj
+ 0002:000000e8       __xi_a                     00000001800070e8     MSVCRT:cinitexe.obj
+ 0002:000000f8       __xi_z                     00000001800070f8     MSVCRT:cinitexe.obj
+ 0002:00000100       __real@447a0000            0000000180007100     GC.obj
+ 0002:00000108       _pDefaultRawDllMain        0000000180007108     MSVCRT:crtdll.obj
+ 0002:000008a4       __IMPORT_DESCRIPTOR_msvcrt 00000001800078a4     MSVCRT:msvcrt.dll
+ 0002:000008b8       __IMPORT_DESCRIPTOR_KERNEL32 00000001800078b8     kernel32:KERNEL32.dll
+ 0002:000008cc       __NULL_IMPORT_DESCRIPTOR   00000001800078cc     MSVCRT:msvcrt.dll
+ 0003:00001e60       _fltused                   000000018000ae60     MSVCRT:dllsupp.obj
+ 0003:00001e64       __native_dllmain_reason    000000018000ae64     MSVCRT:natstart.obj
+ 0003:00001e68       __native_vcclrit_reason    000000018000ae68     MSVCRT:natstart.obj
+ 0003:00001e70       __security_cookie          000000018000ae70     MSVCRT:gs_cookie.obj
+ 0003:00001e78       __security_cookie_complement 000000018000ae78     MSVCRT:gs_cookie.obj
+ 0003:00002130       _jvmti                     000000018000b130     <common>
+ 0003:00002138       _jvmti_callbacks           000000018000b138     <common>
+ 0003:00002140       JVM_DumpHeap15             000000018000b140     <common>
+ 0003:00002148       __native_startup_state     000000018000b148     <common>
+ 0003:00002150       __native_startup_lock      000000018000b150     <common>
+ 0003:00002158       __onexitend                000000018000b158     <common>
+ 0003:00002160       __onexitbegin              000000018000b160     <common>
+ 0003:00002168       _pRawDllMain               000000018000b168     <common>
+ 0003:00002170       __dyn_tls_init_callback    000000018000b170     <common>
+
+ entry point at        0001:00004fd4
+
+ Static symbols
+
+ 0001:00001040       isProfilerThread           0000000180002040 f   Threads.obj
+ 0001:00001da0       convert_jmethodID_to_jint  0000000180002da0 f   Stacks.obj
+ 0001:00001e20       convert_jint_to_jmethodID  0000000180002e20 f   Stacks.obj
+ 0001:00002020       copy_into_data_array       0000000180003020 f   Stacks.obj
+ 0001:00002110       copy_dummy_names_into_data_array 0000000180003110 f   Stacks.obj
+ 0001:00002ca0       initializeJVMTI            0000000180003ca0 f   common_functions.obj
+ 0001:00003100       isSameObject               0000000180004100 f   class_file_cache.obj
+ 0001:00003130       hash                       0000000180004130 f   class_file_cache.obj
+ 0001:000031b0       grow_ctable                00000001800041b0 f   class_file_cache.obj
+ 0001:000035d0       getOwner                   00000001800045d0 f   class_file_cache.obj
+ 0001:00003640       initializeMethods          0000000180004640 f   class_file_cache.obj
+ 0001:00004040       save_class_file_bytes      0000000180005040 f   class_file_cache.obj
+ 0001:00004a00       setupAndCallProfilerRuntimeActivate 0000000180005a00 f   attach.obj
+ 0001:00004bdc       pre_c_init                 0000000180005bdc f   MSVCRT:crtdll.obj
+ 0001:00004de4       __DllMainCRTStartup        0000000180005de4 f   MSVCRT:crtdll.obj
+ 0001:000051a7       __DllMainCRTStartup$filt$0 00000001800061a7 f   MSVCRT:crtdll.obj
+ 0001:00005207       __DllMainCRTStartup$filt$1 0000000180006207 f   MSVCRT:crtdll.obj
+ 0001:00005267       __DllMainCRTStartup$filt$2 0000000180006267 f   MSVCRT:crtdll.obj
+ 0001:000052c7       __DllMainCRTStartup$filt$3 00000001800062c7 f   MSVCRT:crtdll.obj
+ 0001:00005327       __DllMainCRTStartup$filt$4 0000000180006327 f   MSVCRT:crtdll.obj
+ 0001:00005387       __DllMainCRTStartup$filt$5 0000000180006387 f   MSVCRT:crtdll.obj
+ 0001:000053e7       __DllMainCRTStartup$filt$6 00000001800063e7 f   MSVCRT:crtdll.obj
+ 0001:00005447       __DllMainCRTStartup$filt$7 0000000180006447 f   MSVCRT:crtdll.obj
+ 0001:000054a7       __DllMainCRTStartup$fin$8  00000001800064a7 f   MSVCRT:crtdll.obj
+ 0001:000054c0       _IsNonwritableInCurrentImage$filt$0 00000001800064c0 f   MSVCRT:pesect.obj
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/CommonConstants.java 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/CommonConstants.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/CommonConstants.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/CommonConstants.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -94,6 +94,7 @@ public interface CommonConstants {
     public static final int JDK_210 = 19;
     public static final int JDK_220 = 20;
     public static final int JDK_230 = 21;
+    public static final int JDK_240 = 22;
     public static final int JDK_CVM = 5;
     public static final int JDK_UNSUPPORTED = -1;
 
@@ -117,6 +118,7 @@ public interface CommonConstants {
     public static final String JDK_210_STRING = "jdk210"; // NOI18N
     public static final String JDK_220_STRING = "jdk220"; // NOI18N
     public static final String JDK_230_STRING = "jdk230"; // NOI18N
+    public static final String JDK_240_STRING = "jdk240"; // NOI18N
     public static final String JDK_CVM_STRING = "cvm";  // NOI18N
     public static final String JDK_UNSUPPORTED_STRING = "UNSUPPORTED_JDK"; // NOI18N
 
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/Platform.java 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/Platform.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/Platform.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/global/Platform.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -307,6 +307,8 @@ public class Platform implements CommonC
             jdkVersion = JDK_220;
         } else if (isJavaVersion(javaVersion,"23")) { // NOI18N
             jdkVersion = JDK_230;
+        } else if (isJavaVersion(javaVersion,"24")) { // NOI18N
+            jdkVersion = JDK_240;
         } else if (javaVersion.equals("CVM")) { // NOI18N
             jdkVersion = JDK_CVM;
         } else {
@@ -361,6 +363,7 @@ public class Platform implements CommonC
             case JDK_210: return JDK_210_STRING;
             case JDK_220: return JDK_220_STRING;
             case JDK_230: return JDK_230_STRING;
+            case JDK_240: return JDK_240_STRING;
             case JDK_CVM: return JDK_CVM_STRING;
             case JDK_UNSUPPORTED: return JDK_UNSUPPORTED_STRING;
         }
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/instrumentation/JavaClassConstants.java 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/instrumentation/JavaClassConstants.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/instrumentation/JavaClassConstants.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/instrumentation/JavaClassConstants.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,7 @@ public interface JavaClassConstants {
 
     /* Class file constants */
     public static final int JAVA_MAGIC = 0xCAFEBABE;
-    public static final int JAVA_MAJOR_VERSION = 67;
+    public static final int JAVA_MAJOR_VERSION = 68;
     public static final int JAVA_MINOR_VERSION = 0;
     public static final int JAVA_MIN_MAJOR_VERSION = 45;
     public static final int JAVA_MIN_MINOR_VERSION = 3;
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/StackTraceSnapshotBuilder.java 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/StackTraceSnapshotBuilder.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/StackTraceSnapshotBuilder.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/StackTraceSnapshotBuilder.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/server/ProfilerRuntime.java 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/server/ProfilerRuntime.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/server/ProfilerRuntime.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/server/ProfilerRuntime.java	2025-04-17 09:07:34.000000000 +0000
@@ -556,6 +556,9 @@ public class ProfilerRuntime implements
         
         try {
             threadName = thread.getName();
+            if (threadName.length() == 0) {
+                threadName = thread.toString();
+            }
         } catch (NullPointerException e) {
             threadName = "*Unknown thread ("+threadId+")*";  // NOI18N
         }
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/wireprotocol/RootClassLoadedCommand.java 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/wireprotocol/RootClassLoadedCommand.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/wireprotocol/RootClassLoadedCommand.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/wireprotocol/RootClassLoadedCommand.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler/test/qa-functional/src/org/graalvm/visualvm/lib/jfluid/tests/jfluid/monitor/MonitorTestCase.java 2.2-1/visualvm/libs.profiler/lib.profiler/test/qa-functional/src/org/graalvm/visualvm/lib/jfluid/tests/jfluid/monitor/MonitorTestCase.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler/test/qa-functional/src/org/graalvm/visualvm/lib/jfluid/tests/jfluid/monitor/MonitorTestCase.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler/test/qa-functional/src/org/graalvm/visualvm/lib/jfluid/tests/jfluid/monitor/MonitorTestCase.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/manifest.mf 2.2-1/visualvm/libs.profiler/lib.profiler.common/manifest.mf
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.common/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 OpenIDE-Module: org.graalvm.visualvm.lib.common/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/lib/common/Bundle.properties
-OpenIDE-Module-Specification-Version: 2.11
+OpenIDE-Module-Specification-Version: 2.12
 OpenIDE-Module-Needs: org.graalvm.visualvm.lib.common.Profiler
 
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/nbproject/project.xml 2.2-1/visualvm/libs.profiler/lib.profiler.common/nbproject/project.xml
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.common/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
 This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,7 @@ questions.
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.18</specification-version>
+                        <specification-version>2.19</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/Bundle.properties 2.2-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/Bundle.properties
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@ IntegrationUtils_PlatformJava200=Java SE
 IntegrationUtils_PlatformJava210=Java SE 21
 IntegrationUtils_PlatformJava220=Java SE 22
 IntegrationUtils_PlatformJava230=Java SE 23
+IntegrationUtils_PlatformJava240=Java SE 24
 IntegrationUtils_PlatformJavaCvm=CVM
 IntegrationUtils_PlatformWindowsOs=Windows, 32bit JVM
 IntegrationUtils_PlatformWindowsAmd64Os=Windows, 64bit JVM
@@ -89,6 +90,7 @@ IntegrationUtils_Jdk200Name=Java SE 20 (
 IntegrationUtils_Jdk210Name=Java SE 21 (JRE or JDK)
 IntegrationUtils_Jdk220Name=Java SE 22 (JRE or JDK)
 IntegrationUtils_Jdk230Name=Java SE 23 (JRE or JDK)
+IntegrationUtils_Jdk240Name=Java SE 24 (JRE or JDK)
 IntegrationUtils_JdkCvmName=CVM
 IntegrationUtils_RemoteString=remote
 # HTML-formatted
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/IntegrationUtils.java 2.2-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/IntegrationUtils.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/IntegrationUtils.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.common/src/org/graalvm/visualvm/lib/common/integration/IntegrationUtils.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -68,6 +68,7 @@ public class IntegrationUtils {
     public static final String PLATFORM_JAVA_210 = messages.getString("IntegrationUtils_PlatformJava210"); // NOI18N
     public static final String PLATFORM_JAVA_220 = messages.getString("IntegrationUtils_PlatformJava220"); // NOI18N
     public static final String PLATFORM_JAVA_230 = messages.getString("IntegrationUtils_PlatformJava230"); // NOI18N
+    public static final String PLATFORM_JAVA_240 = messages.getString("IntegrationUtils_PlatformJava240"); // NOI18N
     public static final String PLATFORM_JAVA_CVM = messages.getString("IntegrationUtils_PlatformJavaCvm"); // NOI18N
     public static final String PLATFORM_WINDOWS_OS = messages.getString("IntegrationUtils_PlatformWindowsOs"); // NOI18N
     public static final String PLATFORM_WINDOWS_AMD64_OS = messages.getString("IntegrationUtils_PlatformWindowsAmd64Os"); // NOI18N
@@ -109,6 +110,7 @@ public class IntegrationUtils {
     private static final String JDK_210_NAME = messages.getString("IntegrationUtils_Jdk210Name"); // NOI18N
     private static final String JDK_220_NAME = messages.getString("IntegrationUtils_Jdk220Name"); // NOI18N
     private static final String JDK_230_NAME = messages.getString("IntegrationUtils_Jdk230Name"); // NOI18N
+    private static final String JDK_240_NAME = messages.getString("IntegrationUtils_Jdk240Name"); // NOI18N
     private static final String JDK_CVM_NAME = messages.getString("IntegrationUtils_JdkCvmName"); // NOI18N
     private static final String HTML_REMOTE_STRING = "&lt;" + messages.getString("IntegrationUtils_RemoteString") + "&gt;"; // NOI18N
     private static final String EXPORT_SETENV_MESSAGE = messages.getString("IntegrationUtils_ExportSetenvMessage"); // NOI18N
@@ -308,6 +310,8 @@ public class IntegrationUtils {
             return PLATFORM_JAVA_220;
         } else if (javaVersionString.equals(CommonConstants.JDK_230_STRING)) {
             return PLATFORM_JAVA_230;
+        } else if (javaVersionString.equals(CommonConstants.JDK_240_STRING)) {
+            return PLATFORM_JAVA_240;
         } else if (javaVersionString.equals(CommonConstants.JDK_CVM_STRING)) {
             return PLATFORM_JAVA_CVM;
         }
@@ -399,6 +403,8 @@ public class IntegrationUtils {
             return JDK_220_NAME;
         } else if (javaPlatform.equals(PLATFORM_JAVA_230)) {
             return JDK_230_NAME;
+        } else if (javaPlatform.equals(PLATFORM_JAVA_240)) {
+            return JDK_240_NAME;
         } else if (javaPlatform.equals(PLATFORM_JAVA_CVM)) {
             return JDK_CVM_NAME;
         }
@@ -446,6 +452,8 @@ public class IntegrationUtils {
             return "jdk16"; //NOI18N // for JDK 22 we use the same as for 6.0 for now
         } else if (javaPlatform.equals(PLATFORM_JAVA_230)) {
             return "jdk16"; //NOI18N // for JDK 23 we use the same as for 6.0 for now
+        } else if (javaPlatform.equals(PLATFORM_JAVA_240)) {
+            return "jdk16"; //NOI18N // for JDK 24 we use the same as for 6.0 for now
         } else if (javaPlatform.equals(PLATFORM_JAVA_CVM)) {
             return "cvm";  // NOI18N
         }
@@ -516,6 +524,8 @@ public class IntegrationUtils {
             return PLATFORM_JAVA_220;
         } else if (jdkVersion == Platform.JDK_230) {
             return PLATFORM_JAVA_230;
+        } else if (jdkVersion == Platform.JDK_240) {
+            return PLATFORM_JAVA_240;
         }
 
         return null;
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -87,7 +87,7 @@ abstract class AbstractLongMap {
         long index = getIndex(key);
 
         while (true) {
-            long mapKey = getID(index);
+            long mapKey = getID(index, 0);
 
             if (mapKey == key) {
                 return createEntry(index);
@@ -105,9 +105,9 @@ abstract class AbstractLongMap {
         long index = getIndex(key);
 
         while (true) {
-            long mapKey = getID(index);
+            long mapKey = getID(index, 0);
             if (mapKey == 0L) {
-                putID(index, key);
+                putID(index, 0, key);
                 return createEntry(index,value);
             } else if (mapKey == key) {
                 return createEntry(index);
@@ -135,33 +135,33 @@ abstract class AbstractLongMap {
         }
     }
 
-    long getID(long index) {
+    long getID(long base, int offset) {
         if (ID_SIZE == 4) {
-            return ((long)dumpBuffer.getInt(index)) & 0xFFFFFFFFL;
+            return ((long)dumpBuffer.getInt(base, offset)) & 0xFFFFFFFFL;
         }
-        return dumpBuffer.getLong(index);
+        return dumpBuffer.getLong(base, offset);
     }
     
-    void putID(long index,long key) {
+    void putID(long base, int offset,long key) {
         if (ID_SIZE == 4) {
-            dumpBuffer.putInt(index,(int)key);
+            dumpBuffer.putInt(base, offset,(int)key);
         } else {
-            dumpBuffer.putLong(index,key);
+            dumpBuffer.putLong(base, offset, key);
         }
     }
     
-    long getFoffset(long index) {
+    long getFoffset(long base, int offset) {
         if (FOFFSET_SIZE == 4) {
-            return dumpBuffer.getInt(index);
+            return dumpBuffer.getInt(base, offset);
         }
-        return dumpBuffer.getLong(index);
+        return dumpBuffer.getLong(base, offset);
     }
     
-    void putFoffset(long index,long key) {
+    void putFoffset(long base, int offset,long key) {
         if (FOFFSET_SIZE == 4) {
-            dumpBuffer.putInt(index,(int)key);
+            dumpBuffer.putInt(base, offset, (int)key);
         } else {
-            dumpBuffer.putLong(index,key);
+            dumpBuffer.putLong(base, offset, key);
         }
     }
 
@@ -231,17 +231,17 @@ abstract class AbstractLongMap {
             }
         }
         
-        byte getByte(long index);
+        byte getByte(long base, int offset);
         
-        int getInt(long index);
+        int getInt(long base, int offset);
 
-        long getLong(long index);
+        long getLong(long base, int offset);
 
-        void putByte(long index, byte data);
+        void putByte(long base, int offset, byte data);
 
-        void putInt(long index, int data);
+        void putInt(long base, int offset, int data);
 
-        void putLong(long index, long data);
+        void putLong(long base, int offset, long data);
 
         void force() throws IOException;
 
@@ -293,13 +293,13 @@ abstract class AbstractLongMap {
 
         //~ Methods --------------------------------------------------------------------------------------------------------------
 
-        public synchronized byte getByte(long index) {
-            int i = loadBufferIfNeeded(index);
+        public synchronized byte getByte(long base, int offset) {
+            int i = loadBufferIfNeeded(base+offset);
             return buf[i];
         }
 
-        public synchronized int getInt(long index) {
-            int i = loadBufferIfNeeded(index);
+        public synchronized int getInt(long base, int offset) {
+            int i = loadBufferIfNeeded(base+offset);
             int ch1 = ((int) buf[i++]) & 0xFF;
             int ch2 = ((int) buf[i++]) & 0xFF;
             int ch3 = ((int) buf[i++]) & 0xFF;
@@ -308,8 +308,8 @@ abstract class AbstractLongMap {
             return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
         }
 
-        public synchronized long getLong(long index) {
-           int i = loadBufferIfNeeded(index);
+        public synchronized long getLong(long base, int offset) {
+           int i = loadBufferIfNeeded(base+offset);
            return (((long)buf[i++] << 56) +
                   ((long)(buf[i++] & 255) << 48) +
                   ((long)(buf[i++] & 255) << 40) +
@@ -320,14 +320,14 @@ abstract class AbstractLongMap {
                   ((buf[i++] & 255) <<  0));
         }
 
-        public synchronized void putByte(long index, byte data) {
-            int i = loadBufferIfNeeded(index);
+        public synchronized void putByte(long base, int offset, byte data) {
+            int i = loadBufferIfNeeded(base+offset);
             buf[i] = data;
             bufferModified = true;
         }
 
-        public synchronized void putInt(long index, int data) {
-            int i = loadBufferIfNeeded(index);
+        public synchronized void putInt(long base, int offset, int data) {
+            int i = loadBufferIfNeeded(base+offset);
             buf[i++] = (byte) (data >>> 24);
             buf[i++] = (byte) (data >>> 16);
             buf[i++] = (byte) (data >>> 8);
@@ -335,8 +335,8 @@ abstract class AbstractLongMap {
             bufferModified = true;
         }
 
-        public synchronized void putLong(long index, long data) {
-            int i = loadBufferIfNeeded(index);
+        public synchronized void putLong(long base, int offset, long data) {
+            int i = loadBufferIfNeeded(base+offset);
             buf[i++] = (byte) (data >>> 56);
             buf[i++] = (byte) (data >>> 48);
             buf[i++] = (byte) (data >>> 40);
@@ -408,28 +408,28 @@ abstract class AbstractLongMap {
 
         //~ Methods --------------------------------------------------------------------------------------------------------------
 
-        public byte getByte(long index) {
-            return buf.get((int) index);
+        public byte getByte(long base, int offset) {
+            return buf.get((int) base+offset);
         }
 
-        public int getInt(long index) {
-            return buf.getInt((int) index);
+        public int getInt(long base, int offset) {
+            return buf.getInt((int) base+offset);
         }
 
-        public long getLong(long index) {
-            return buf.getLong((int) index);
+        public long getLong(long base, int offset) {
+            return buf.getLong((int) base+offset);
         }
 
-        public void putByte(long index, byte data) {
-            buf.put((int) index, data);
+        public void putByte(long base, int offset, byte data) {
+            buf.put((int) base+offset, data);
         }
 
-        public void putInt(long index, int data) {
-            buf.putInt((int) index, data);
+        public void putInt(long base, int offset, int data) {
+            buf.putInt((int) base+offset, data);
         }
 
-        public void putLong(long index, long data) {
-            buf.putLong((int) index, data);
+        public void putLong(long base, int offset, long data) {
+            buf.putLong((int) base+offset, data);
         }
 
         @Override
@@ -489,28 +489,28 @@ abstract class AbstractLongMap {
 
         //~ Methods --------------------------------------------------------------------------------------------------------------
 
-        public byte getByte(long index) {
-            return dumpBuffer[getBufferIndex(index)].get(getBufferOffset(index));
+        public byte getByte(long base, int offset) {
+            return dumpBuffer[getBufferIndex(base)].get(getBufferOffset(base)+offset);
         }
 
-        public int getInt(long index) {
-            return dumpBuffer[getBufferIndex(index)].getInt(getBufferOffset(index));
+        public int getInt(long base, int offset) {
+            return dumpBuffer[getBufferIndex(base)].getInt(getBufferOffset(base)+offset);
         }
 
-        public long getLong(long index) {
-            return dumpBuffer[getBufferIndex(index)].getLong(getBufferOffset(index));
+        public long getLong(long base, int offset) {
+            return dumpBuffer[getBufferIndex(base)].getLong(getBufferOffset(base)+offset);
         }
 
-        public void putByte(long index, byte data) {
-            dumpBuffer[getBufferIndex(index)].put(getBufferOffset(index),data);
+        public void putByte(long base, int offset, byte data) {
+            dumpBuffer[getBufferIndex(base)].put(getBufferOffset(base)+offset,data);
         }
 
-        public void putInt(long index, int data) {
-            dumpBuffer[getBufferIndex(index)].putInt(getBufferOffset(index),data);
+        public void putInt(long base, int offset, int data) {
+            dumpBuffer[getBufferIndex(base)].putInt(getBufferOffset(base)+offset,data);
         }
 
-        public void putLong(long index, long data) {
-            dumpBuffer[getBufferIndex(index)].putLong(getBufferOffset(index),data);
+        public void putLong(long base, int offset, long data) {
+            dumpBuffer[getBufferIndex(base)].putLong(getBufferOffset(base)+offset,data);
         }
 
         private int getBufferIndex(long index) {
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/CacheDirectory.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/CacheDirectory.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/CacheDirectory.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/CacheDirectory.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/DominatorTree.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/DominatorTree.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/DominatorTree.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/DominatorTree.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofHeap.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofHeap.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofHeap.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofHeap.java	2025-04-17 09:07:34.000000000 +0000
@@ -1312,7 +1312,16 @@ class HprofHeap implements Heap {
             TagBounds heapDumpSegmentBounds = tagBounds[HEAP_DUMP_SEGMENT];
 
             if (heapDumpSegmentBounds != null) {
-                heapDumpSegmentBounds = heapDumpSegmentBounds.union(tagBounds[HEAP_DUMP_END]);
+                TagBounds heapDumpEndBounds = tagBounds[HEAP_DUMP_END];
+                if (heapDumpEndBounds == null) {
+                    throw new IOException("Heap dump is broken.\nTag 0x"+Integer.toHexString(HEAP_DUMP_END)+" is missing."); // NOI18N
+                }
+                if (heapDumpSegmentBounds.endOffset == heapDumpEndBounds.startOffset) {
+                    // shortcut - just one segment
+                    sc.accept(heapDumpSegmentBounds.startOffset,heapDumpSegmentBounds.endOffset);
+                    return;
+                }
+                heapDumpSegmentBounds = heapDumpSegmentBounds.union(heapDumpEndBounds);
                 long start = heapDumpSegmentBounds.startOffset;
                 long[] offset = new long[] { start };
                 long segmentStart = 0;
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofProxy.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofProxy.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofProxy.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/HprofProxy.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,9 @@
 
 package org.graalvm.visualvm.lib.jfluid.heap;
 
+import java.util.Map;
 import java.util.Properties;
+import java.util.WeakHashMap;
 
 
 /**
@@ -56,7 +58,9 @@ class HprofProxy {
             Instance map = (Instance) propertiesInstance.getValueOfField("map"); // NOI18N
             if (map != null) {
                 entriesObj = (ObjectArrayDump) map.getValueOfField("table"); // NOI18N
-                return getPropertiesFromTable(entriesObj, props, "key", "val"); // NOI18N
+                if (entriesObj != null) {
+                    return getPropertiesFromTable(entriesObj, props, "key", "val"); // NOI18N
+                }
             } else {    // old Hashtable
                 entriesObj = (ObjectArrayDump) propertiesInstance.getValueOfField("elementData"); // NOI18N
                 if (entriesObj != null) {
@@ -141,16 +145,24 @@ class HprofProxy {
                 return "*unknown coder*".toCharArray();
         }
     }
-    
+
+    private static final Map<Heap,int[]> CACHE = new WeakHashMap<>();
+
     private static int[] getStringUTF16ShiftBytes(Heap heap) {
-        JavaClass utf16Class = heap.getJavaClassByName("java.lang.StringUTF16");                  // NOI18N
-        Integer HI_BYTE_SHIFT = (Integer) utf16Class.getValueOfStaticField("HI_BYTE_SHIFT");      // NOI18N
-        Integer LO_BYTE_SHIFT = (Integer) utf16Class.getValueOfStaticField("LO_BYTE_SHIFT");      // NOI18N
+        int[] shiftBytes = CACHE.get(heap);
         
-        if (HI_BYTE_SHIFT != null && LO_BYTE_SHIFT != null) {
-            return new int[] {HI_BYTE_SHIFT.intValue(),LO_BYTE_SHIFT.intValue()};
+        if (shiftBytes == null) {
+            JavaClass utf16Class = heap.getJavaClassByName("java.lang.StringUTF16");                  // NOI18N
+            Integer HI_BYTE_SHIFT = (Integer) utf16Class.getValueOfStaticField("HI_BYTE_SHIFT");      // NOI18N
+            Integer LO_BYTE_SHIFT = (Integer) utf16Class.getValueOfStaticField("LO_BYTE_SHIFT");      // NOI18N
+
+            if (HI_BYTE_SHIFT != null && LO_BYTE_SHIFT != null) {
+                shiftBytes = new int[] {HI_BYTE_SHIFT.intValue(), LO_BYTE_SHIFT.intValue()};
+            }
+            // use default
+            shiftBytes = new int[] {0,8};
+            CACHE.put(heap, shiftBytes);
         }
-        // use default
-        return new int[] {0,8};
+        return shiftBytes;
     }
 }
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/LongMap.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/LongMap.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/LongMap.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/LongMap.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -40,6 +40,7 @@ import java.util.TreeSet;
  *  - references flags (byte) - bit 0 set - has zero or one reference,
  *                            - bit 1 set - has GC root
  *                            - bit 2 set - tree object
+ *                            - bit 3 set - deep object
  *  - ID/offset (long/int) - ID if reference flag bit 0 is set, otherwise offset to reference list file
  *  - retained size (long/int)
  *
@@ -70,17 +71,17 @@ class LongMap extends AbstractLongMap {
 
         private Entry(long off,long value) {
             offset = off;
-            putFoffset(offset + KEY_SIZE, value);
+            putFoffset(offset, KEY_SIZE, value);
         }
 
         //~ Methods --------------------------------------------------------------------------------------------------------------
 
         void setIndex(int index) {
-            dumpBuffer.putInt(offset + KEY_SIZE + FOFFSET_SIZE, index);
+            dumpBuffer.putInt(offset, KEY_SIZE + FOFFSET_SIZE, index);
         }
 
         int getIndex() {
-            return dumpBuffer.getInt(offset + KEY_SIZE + FOFFSET_SIZE);
+            return dumpBuffer.getInt(offset, KEY_SIZE + FOFFSET_SIZE);
         }
 
         void setTreeObj() {
@@ -176,38 +177,38 @@ class LongMap extends AbstractLongMap {
         }
         
         long getOffset() {
-            return getFoffset(offset + KEY_SIZE);
+            return getFoffset(offset, KEY_SIZE);
         }
 
         void setRetainedSize(long size) {
             if (FOFFSET_SIZE == 4) {
-                dumpBuffer.putInt(offset + KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE, (int)size);
+                dumpBuffer.putInt(offset, KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE, (int)size);
             } else {
-                dumpBuffer.putLong(offset + KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE, size);
+                dumpBuffer.putLong(offset, KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE, size);
             }
         }
 
         long getRetainedSize() {
             if (FOFFSET_SIZE == 4) {
-                return dumpBuffer.getInt(offset + KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE);
+                return dumpBuffer.getInt(offset, KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE);
             }
-            return dumpBuffer.getLong(offset + KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE);            
+            return dumpBuffer.getLong(offset, KEY_SIZE + FOFFSET_SIZE + 4 + 1 + ID_SIZE);
         }
 
         private void setReferencesPointer(long instanceId) {
-            putID(offset + KEY_SIZE + FOFFSET_SIZE + 4 + 1, instanceId);
+            putID(offset, KEY_SIZE + FOFFSET_SIZE + 4 + 1, instanceId);
         }
 
         private long getReferencesPointer() {
-            return getID(offset + KEY_SIZE + FOFFSET_SIZE + 4 + 1);
+            return getID(offset, KEY_SIZE + FOFFSET_SIZE + 4 + 1);
         }
 
         private void setFlags(byte flags) {
-            dumpBuffer.putByte(offset + KEY_SIZE + FOFFSET_SIZE + 4, flags);
+            dumpBuffer.putByte(offset, KEY_SIZE + FOFFSET_SIZE + 4, flags);
         }
 
         private byte getFlags() {
-            return dumpBuffer.getByte(offset + KEY_SIZE + FOFFSET_SIZE + 4);
+            return dumpBuffer.getByte(offset, KEY_SIZE + FOFFSET_SIZE + 4);
         }
     }
 
@@ -284,7 +285,7 @@ class LongMap extends AbstractLongMap {
         long[] bigIds = new long[number];
         long min = 0;
         for (long index=0;index<fileSize;index+=ENTRY_SIZE) {
-            long id = getID(index);
+            long id = getID(index, 0);
             if (id != 0) {
                 long retainedSize = createEntry(index).getRetainedSize();
                 if (bigObjects.size()<number) {
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/NearestGCRoot.java 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/NearestGCRoot.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/NearestGCRoot.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/NearestGCRoot.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/ResultsPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/ResultsPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/ResultsPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/ResultsPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTitledPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTitledPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTitledPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTitledPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTreeTable.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTreeTable.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTreeTable.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/JTreeTable.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/table/SortableTableModel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/table/SortableTableModel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/table/SortableTableModel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/components/table/SortableTableModel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/CCTDisplay.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/CCTDisplay.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/CCTDisplay.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/CCTDisplay.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/FlatProfilePanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/FlatProfilePanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/FlatProfilePanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/FlatProfilePanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/ReverseCallGraphPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/ReverseCallGraphPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/ReverseCallGraphPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/ReverseCallGraphPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/SubtreeCallGraphPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/SubtreeCallGraphPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/SubtreeCallGraphPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/cpu/SubtreeCallGraphPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/Bundle.properties 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/Bundle.properties
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -27,12 +27,14 @@ JDBCView_InvocationsColumnName=Invocatio
 JDBCView_ColumnCommands=Command Type
 JDBCView_ColumnTables=Tables
 JDBCView_ColumnStatements=Statement Type
+JDBCView_ColumnAverage=Average Time
 JDBCView_ColumnToolTip=SQL query and calling methods
 JDBCView_TimeColumnToolTip=Time spent in all invocations of the SQL query
 JDBCView_InvocationsColumnToolTip=Number of times the SQL query was invoked
 JDBCView_ColumnCommandsToolTip=SQL Command Type
 JDBCView_ColumnTablesToolTip=Database Tables
 JDBCView_ColumnStatementsToolTip=SQL Statement Type
+JDBCView_ColumnAverageToolTip=Average time per invocation
 JDBCView_OtherCommand=other command
 JDBCView_RegularStatement=regular
 JDBCView_PreparedStatement=prepared
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCTreeTableView.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCTreeTableView.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCTreeTableView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCTreeTableView.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -144,6 +144,7 @@ abstract class JDBCTreeTableView extends
         renderers[1].setMaxValue(__totalObjects);
         renderers[0].setDiffMode(diff);
         renderers[1].setDiffMode(diff);
+        timeRenderer.setDiffMode(diff);
         treeTableModel.setRoot(PresoObjAllocCCTNode.rootNode(nodes.toArray(new PresoObjAllocCCTNode[0])));
 
         currentData = newData;
@@ -154,6 +155,7 @@ abstract class JDBCTreeTableView extends
         renderers[1].setMaxValue(0);
         renderers[0].setDiffMode(false);
         renderers[1].setDiffMode(false);
+        timeRenderer.setDiffMode(false);
 
         treeTableModel.setRoot(PresoObjAllocCCTNode.rootNode(new PresoObjAllocCCTNode[0]));
 
@@ -192,6 +194,7 @@ abstract class JDBCTreeTableView extends
     
     
     private HideableBarRenderer[] renderers;
+    private McsTimeRenderer timeRenderer;
     
     HideableBarRenderer.BarDiffMode barDiffMode() {
         return HideableBarRenderer.BarDiffMode.MODE_BAR_DIFF;
@@ -237,6 +240,7 @@ abstract class JDBCTreeTableView extends
         renderers[0].setBarDiffMode(barDiffMode);
         renderers[1] = new HideableBarRenderer(new NumberRenderer());
         renderers[1].setBarDiffMode(barDiffMode);
+        timeRenderer = new McsTimeRenderer();
         
         long refTime = 123456;
         renderers[0].setMaxValue(refTime);
@@ -249,16 +253,18 @@ abstract class JDBCTreeTableView extends
         treeTable.setDefaultColumnWidth(1, renderers[0].getOptimalWidth());
         treeTable.setDefaultColumnWidth(2, renderers[1].getMaxNoBarWidth());
         
+        LabelRenderer tr = new LabelRenderer();
+        tr.setHorizontalAlignment(LabelRenderer.TRAILING);
+        tr.setValue("X"+treeTableModel.getColumnName(3)+"X", -1);       // NOI18N
+        treeTable.setColumnRenderer(3, timeRenderer);
+        treeTable.setDefaultColumnWidth(3, tr.getPreferredSize().width);
+        treeTable.setColumnVisibility(3, false);
+
         // Debug columns
         LabelRenderer lr = new LabelRenderer();
         lr.setHorizontalAlignment(LabelRenderer.TRAILING);
         lr.setValue("XStatement TypeX", -1);
         
-        treeTable.setColumnRenderer(3, lr);
-        treeTable.setDefaultSortOrder(3, SortOrder.ASCENDING);
-        treeTable.setDefaultColumnWidth(3, lr.getPreferredSize().width);
-        treeTable.setColumnVisibility(3, false);
-        
         treeTable.setColumnRenderer(4, lr);
         treeTable.setDefaultSortOrder(4, SortOrder.ASCENDING);
         treeTable.setDefaultColumnWidth(4, lr.getPreferredSize().width);
@@ -269,6 +275,11 @@ abstract class JDBCTreeTableView extends
         treeTable.setDefaultColumnWidth(5, lr.getPreferredSize().width);
         treeTable.setColumnVisibility(5, false);
         
+        treeTable.setColumnRenderer(6, lr);
+        treeTable.setDefaultSortOrder(6, SortOrder.ASCENDING);
+        treeTable.setDefaultColumnWidth(6, lr.getPreferredSize().width);
+        treeTable.setColumnVisibility(6, false);
+
         ProfilerTableContainer tableContainer = new ProfilerTableContainer(treeTable, false, null);
         
         setLayout(new BorderLayout());
@@ -307,7 +318,8 @@ abstract class JDBCTreeTableView extends
                                         INVOCATIONS_COLUMN_TOOLTIP,
                                         COMMANDS_COLUMN_TOOLTIP,
                                         TABLES_COLUMN_TOOLTIP,
-                                        STATEMENTS_COLUMN_TOOLTIP
+                                        STATEMENTS_COLUMN_TOOLTIP,
+                                        AVERAGE_COLUMN_TOOLTIP
                                     });
     }
     
@@ -409,11 +421,13 @@ abstract class JDBCTreeTableView extends
                 return COLUMN_TOTALTIME;
             } else if (columnIndex == 2) {
                 return COLUMN_INVOCATIONS;
-            }  else if (columnIndex == 3) {
-                return COLUMN_COMMANDS;
+            } else if (columnIndex == 3) {
+                return COLUMN_AVEGARE;
             } else if (columnIndex == 4) {
-                return COLUMN_TABLES;
+                return COLUMN_COMMANDS;
             } else if (columnIndex == 5) {
+                return COLUMN_TABLES;
+            } else if (columnIndex == 6) {
                 return COLUMN_STATEMENTS;
             }
             return null;
@@ -427,17 +441,19 @@ abstract class JDBCTreeTableView extends
             } else if (columnIndex == 2) {
                 return Integer.class;
             } else if (columnIndex == 3) {
-                return String.class;
+                return Long.class;
             } else if (columnIndex == 4) {
                 return String.class;
             } else if (columnIndex == 5) {
                 return String.class;
+            } else if (columnIndex == 6) {
+                return String.class;
             }
             return Long.class;
         }
 
         public int getColumnCount() {
-            return 6;
+            return 7;
         }
 
         public Object getValueAt(TreeNode node, int columnIndex) {
@@ -449,19 +465,21 @@ abstract class JDBCTreeTableView extends
             } else if (columnIndex == 2) {
                 return jdbcNode.nCalls;
             } else if (columnIndex == 3) {
+                return jdbcNode.totalObjSize/jdbcNode.nCalls;
+            } else if (columnIndex == 4) {
                 if (jdbcNode instanceof SQLQueryNode) {
                     return commandString(((SQLQueryNode)jdbcNode).getCommandType());
                 } else {
                     return "-"; // NOI18N
                 }
                 
-            } else if (columnIndex == 4) {
+            } else if (columnIndex == 5) {
                 if (jdbcNode instanceof SQLQueryNode) {
                     return formatTables(((SQLQueryNode)jdbcNode).getTables());
                 } else {
                     return "-"; // NOI18N
                 }
-            } else if (columnIndex == 5) {
+            } else if (columnIndex == 6) {
                 if (jdbcNode instanceof SQLQueryNode) {
                     switch (((SQLQueryNode)jdbcNode).getStatementType()) {
                         case JdbcCCTProvider.SQL_PREPARED_STATEMENT: return STATEMENT_PREPARED;
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCView.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCView.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/jdbc/JDBCView.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -44,12 +44,14 @@ public abstract class JDBCView extends D
     static final String COLUMN_COMMANDS = messages.getString("JDBCView_ColumnCommands"); // NOI18N
     static final String COLUMN_TABLES = messages.getString("JDBCView_ColumnTables"); // NOI18N
     static final String COLUMN_STATEMENTS = messages.getString("JDBCView_ColumnStatements"); // NOI18N
+    static final String COLUMN_AVEGARE = messages.getString("JDBCView_ColumnAverage"); // NOI18N
     static final String NAME_COLUMN_TOOLTIP = messages.getString("JDBCView_ColumnToolTip"); // NOI18N
     static final String TOTAL_TIME_COLUMN_TOOLTIP = messages.getString("JDBCView_TimeColumnToolTip"); // NOI18N
     static final String INVOCATIONS_COLUMN_TOOLTIP = messages.getString("JDBCView_InvocationsColumnToolTip"); // NOI18N
     static final String COMMANDS_COLUMN_TOOLTIP = messages.getString("JDBCView_ColumnCommandsToolTip"); // NOI18N
     static final String TABLES_COLUMN_TOOLTIP = messages.getString("JDBCView_ColumnTablesToolTip"); // NOI18N
     static final String STATEMENTS_COLUMN_TOOLTIP = messages.getString("JDBCView_ColumnStatementsToolTip"); // NOI18N
+    static final String AVERAGE_COLUMN_TOOLTIP = messages.getString("JDBCView_ColumnAverageToolTip"); // NOI18N
 
     static final String OTHER_COMMAND = messages.getString("JDBCView_OtherCommand"); // NOI18N
     
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/LiveReverseMemCallGraphPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/LiveReverseMemCallGraphPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/LiveReverseMemCallGraphPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/LiveReverseMemCallGraphPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/MemoryResultsPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/MemoryResultsPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/MemoryResultsPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/MemoryResultsPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/SnapshotReverseMemCallGraphPanel.java 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/SnapshotReverseMemCallGraphPanel.java
--- 2.1.10-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/SnapshotReverseMemCallGraphPanel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/lib.profiler.ui/src/org/graalvm/visualvm/lib/ui/memory/SnapshotReverseMemCallGraphPanel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.api/src/org/graalvm/visualvm/lib/profiler/spi/ProfilerStorageProvider.java 2.2-1/visualvm/libs.profiler/profiler.api/src/org/graalvm/visualvm/lib/profiler/spi/ProfilerStorageProvider.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.api/src/org/graalvm/visualvm/lib/profiler/spi/ProfilerStorageProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.api/src/org/graalvm/visualvm/lib/profiler/spi/ProfilerStorageProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -193,12 +193,9 @@ public abstract class ProfilerStoragePro
 
         protected void saveProperties(Properties properties, FileObject storage) throws IOException {
             synchronized (this) {
-                OutputStream os = storage.getOutputStream();
-                BufferedOutputStream bos = new BufferedOutputStream(os);
-                try {
+                try (OutputStream os = storage.getOutputStream();
+                     BufferedOutputStream bos = new BufferedOutputStream(os)) {
                     properties.storeToXML(bos, ""); // NOI18N
-                } finally {
-                    if (bos != null) bos.close();
                 }
             }
         }
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.attach/manifest.mf 2.2-1/visualvm/libs.profiler/profiler.attach/manifest.mf
--- 2.1.10-1/visualvm/libs.profiler/profiler.attach/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.attach/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 Manifest-Version: 1.0
 OpenIDE-Module: org.graalvm.visualvm.lib.profiler.attach/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/lib/profiler/attach/Bundle.properties
-OpenIDE-Module-Specification-Version: 2.3
+OpenIDE-Module-Specification-Version: 2.4
 
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.attach/nbproject/project.xml 2.2-1/visualvm/libs.profiler/profiler.attach/nbproject/project.xml
--- 2.1.10-1/visualvm/libs.profiler/profiler.attach/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.attach/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
 This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,7 @@ questions.
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.11</specification-version>
+                        <specification-version>2.12</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/providers/TargetPlatformEnum.java 2.2-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/providers/TargetPlatformEnum.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/providers/TargetPlatformEnum.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/providers/TargetPlatformEnum.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -48,7 +48,8 @@ public class TargetPlatformEnum {
                                                  IntegrationUtils.PLATFORM_JAVA_170,IntegrationUtils.PLATFORM_JAVA_180,
                                                  IntegrationUtils.PLATFORM_JAVA_190,IntegrationUtils.PLATFORM_JAVA_200,
                                                  IntegrationUtils.PLATFORM_JAVA_210,IntegrationUtils.PLATFORM_JAVA_220,
-                                                 IntegrationUtils.PLATFORM_JAVA_230,IntegrationUtils.PLATFORM_JAVA_CVM,
+                                                 IntegrationUtils.PLATFORM_JAVA_230,IntegrationUtils.PLATFORM_JAVA_240,
+                                                 IntegrationUtils.PLATFORM_JAVA_CVM,
                                              };
     public static final TargetPlatformEnum JDK5 = new TargetPlatformEnum(0);
     public static final TargetPlatformEnum JDK6 = new TargetPlatformEnum(1);
@@ -69,7 +70,8 @@ public class TargetPlatformEnum {
     public static final TargetPlatformEnum JDK21 = new TargetPlatformEnum(16);
     public static final TargetPlatformEnum JDK22 = new TargetPlatformEnum(17);
     public static final TargetPlatformEnum JDK23 = new TargetPlatformEnum(18);
-    public static final TargetPlatformEnum JDK_CVM = new TargetPlatformEnum(19);
+    public static final TargetPlatformEnum JDK24 = new TargetPlatformEnum(19);
+    public static final TargetPlatformEnum JDK_CVM = new TargetPlatformEnum(20);
 
     //~ Instance fields ----------------------------------------------------------------------------------------------------------
 
@@ -97,7 +99,7 @@ public class TargetPlatformEnum {
     }
 
     public static Iterator<TargetPlatformEnum> iterator() {
-        List<TargetPlatformEnum> jvmList = new ArrayList<>(20);
+        List<TargetPlatformEnum> jvmList = new ArrayList<>(21);
         jvmList.add(JDK5);
         jvmList.add(JDK6);
         jvmList.add(JDK7);
@@ -117,6 +119,7 @@ public class TargetPlatformEnum {
         jvmList.add(JDK21);
         jvmList.add(JDK22);
         jvmList.add(JDK23);
+        jvmList.add(JDK24);
         jvmList.add(JDK_CVM);
 
         return jvmList.listIterator();
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/spi/AbstractRemotePackExporter.java 2.2-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/spi/AbstractRemotePackExporter.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/spi/AbstractRemotePackExporter.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.attach/src/org/graalvm/visualvm/lib/profiler/attach/spi/AbstractRemotePackExporter.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,6 +73,7 @@ abstract public class AbstractRemotePack
             put(TargetPlatformEnum.JDK21.toString(), "15"); //NOI18N
             put(TargetPlatformEnum.JDK22.toString(), "15"); //NOI18N
             put(TargetPlatformEnum.JDK23.toString(), "15"); //NOI18N
+            put(TargetPlatformEnum.JDK24.toString(), "15"); //NOI18N
             put(TargetPlatformEnum.JDK_CVM.toString(), "cvm"); //NOI18N
         }
     };
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/api/StringDecoder.java 2.2-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/api/StringDecoder.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/api/StringDecoder.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/api/StringDecoder.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,8 @@
 package org.graalvm.visualvm.lib.profiler.heapwalk.details.api;
 
 import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
 import org.graalvm.visualvm.lib.jfluid.heap.Heap;
 import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
 
@@ -34,6 +36,8 @@ import org.graalvm.visualvm.lib.jfluid.h
  */
 public final class StringDecoder {
 
+    private static final Map<Heap,int[]> CACHE = new WeakHashMap<>();
+
     private final byte coder;
     private final List<String> values;
     private int HI_BYTE_SHIFT;
@@ -43,18 +47,23 @@ public final class StringDecoder {
         coder = c;
         values = val;
         if (coder == 1) {
-            JavaClass utf16Class = heap.getJavaClassByName("java.lang.StringUTF16"); // NOI18N
-            Integer hiShift = (Integer) utf16Class.getValueOfStaticField("HI_BYTE_SHIFT"); // NOI18N
-            Integer loShift = (Integer) utf16Class.getValueOfStaticField("LO_BYTE_SHIFT"); // NOI18N
-
-            if (hiShift != null && loShift != null) {
-                HI_BYTE_SHIFT = hiShift.intValue();
-                LO_BYTE_SHIFT = loShift.intValue();
-            } else {
-                // use default
-                HI_BYTE_SHIFT = 0;
-                LO_BYTE_SHIFT = 8;
+            int[] shiftBytes = CACHE.get(heap);
+
+            if (shiftBytes == null) {
+                JavaClass utf16Class = heap.getJavaClassByName("java.lang.StringUTF16"); // NOI18N
+                Integer hiShift = (Integer) utf16Class.getValueOfStaticField("HI_BYTE_SHIFT"); // NOI18N
+                Integer loShift = (Integer) utf16Class.getValueOfStaticField("LO_BYTE_SHIFT"); // NOI18N
+
+                if (hiShift != null && loShift != null) {
+                    shiftBytes = new int[] {hiShift.intValue(), loShift.intValue()};
+                } else {
+                    // use default
+                    shiftBytes = new int[] {0,8};
+                }
+                CACHE.put(heap, shiftBytes);
             }
+            HI_BYTE_SHIFT = shiftBytes[0];
+            LO_BYTE_SHIFT = shiftBytes[1];
         }
     }
 
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/NioDetailsProvider.java 2.2-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/NioDetailsProvider.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/NioDetailsProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/NioDetailsProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/UtilDetailsProvider.java 2.2-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/UtilDetailsProvider.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/UtilDetailsProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/UtilDetailsProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/ReferenceChain.java 2.2-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/ReferenceChain.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/ReferenceChain.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/ReferenceChain.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,8 +42,8 @@ final public class ReferenceChain {
     private long id;
     private char type;
 
-    private static char TYPE_INSTANCE = 0;
-    private static char TYPE_CLASS = 1;
+    private static final char TYPE_INSTANCE = 0;
+    private static final char TYPE_CLASS = 1;
 
     public ReferenceChain(Heap heap, Object obj, ReferenceChain next) {
         this.obj = new WeakReference<>(obj);
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineImpl.java 2.2-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineImpl.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -239,8 +239,7 @@ public class OQLEngineImpl {
             Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
 
             CompiledScript whereCs = null;
-            CompiledScript selectCs = null;
-            selectCs = ((Compilable)engine).compile(selectCode);
+            CompiledScript selectCs = ((Compilable)engine).compile(selectCode);
             
             if (q.whereExpr != null) {
                 whereCs = ((Compilable)engine).compile(q.whereExpr.replace('\n', ' ')); // NOI18N
@@ -252,9 +251,8 @@ public class OQLEngineImpl {
 
                 toInspect.push(clazz);
 
-                JavaClass inspecting = null;
                 while(!toInspect.isEmpty()) {
-                    inspecting = toInspect.pop();
+                    JavaClass inspecting = toInspect.pop();
                     inspected.add(inspecting);
                     if (q.isInstanceOf) {
                         for(JavaClass subclass : inspecting.getSubClasses()) {
@@ -307,13 +305,13 @@ public class OQLEngineImpl {
         }
 
         if (jsObject instanceof Iterator) {
-            Iterator iter = (Iterator) jsObject;
+            Iterator<?> iter = (Iterator) jsObject;
             while (iter.hasNext()) {
                 if (dispatchValue(iter.next(), visitor)) return true;
             }
             return false;
         } else if (jsObject instanceof Enumeration) {
-            Enumeration enm = (Enumeration) jsObject;
+            Enumeration<?> enm = (Enumeration) jsObject;
             while (enm.hasMoreElements()) {
                 Object elem = enm.nextElement();
                 if (dispatchValue(elem, visitor)) return true;
@@ -360,9 +358,7 @@ public class OQLEngineImpl {
     public Object unwrapJavaObject(Object object, boolean tryAssociativeArray) {
         if (object == null) return null;
         String className = object.getClass().getName();
-        boolean isNativeJS = className.contains(".javascript.")     // NOI18N
-                          || className.equals("jdk.nashorn.api.scripting.ScriptObjectMirror")  // NOI18N
-                          || className.startsWith("com.oracle.truffle.object.") // NOI18N
+        boolean isNativeJS = className.startsWith("com.oracle.truffle.object.") // NOI18N
                           || className.equals("org.graalvm.polyglot.Value"); // NOI18N
 
         try {
@@ -370,10 +366,7 @@ public class OQLEngineImpl {
             if (isNativeJS && ret == null && tryAssociativeArray) {
                 ret = ((Invocable)engine).invokeFunction("unwrapMap", object); // NOI18N
             }
-            if (ret == null) {
-                return object;
-            }
-            return ret;
+            return ret == null ? object : ret;
         } catch (Exception ex) {
             LOGGER.log(Level.WARNING, "Error unwrapping JS object", ex); // NOI18N
         }
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/Snapshot.java 2.2-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/Snapshot.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/Snapshot.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.oql/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/Snapshot.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -43,14 +43,12 @@ import org.graalvm.visualvm.lib.profiler
 import org.openide.util.Enumerations;
 
 /**
- *
- * @author      Jaroslav Bachorik
- */
-/**
  * A helper class for OQL engine allowing easy access to the underlying
  * heapwalker model
+ * 
+ * @author      Jaroslav Bachorik
  */
-public class Snapshot {
+public final class Snapshot {
 
     private static final String BOOLEAN_CODE = "Z"; // NOI18N
     private static final String CHAR_CODE = "C"; // NOI18N
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineTest.java 2.2-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineTest.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineTest.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/engine/api/impl/OQLEngineTest.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -576,7 +576,7 @@ public class OQLEngineTest {
     public void testLength() throws Exception {
         System.out.println("length");
 
-        final Class[] rsltClass = new Class[1];
+        final Class<?>[] rsltClass = new Class<?>[1];
 //        final boolean sorted[] = new boolean[] {true};
 
 
@@ -595,7 +595,7 @@ public class OQLEngineTest {
     public void testCountNoClosure() throws Exception {
         System.out.println("count - no closure");
 
-        final Class[] rsltClass = new Class[1];
+        final Class<?>[] rsltClass = new Class<?>[1];
 //        final boolean sorted[] = new boolean[] {true};
 
 
@@ -614,7 +614,7 @@ public class OQLEngineTest {
     public void testCount() throws Exception {
         System.out.println("count");
 
-        final Class[] rsltClass = new Class[1];
+        final Class<?>[] rsltClass = new Class<?>[1];
 //        final boolean sorted[] = new boolean[] {true};
 
 
@@ -633,7 +633,7 @@ public class OQLEngineTest {
     public void testMultivalue() throws Exception {
         System.out.println("multi-value");
 
-        final Class[] rsltClass = new Class[1];
+        final Class<?>[] rsltClass = new Class<?>[1];
 //        final boolean sorted[] = new boolean[] {true};
 
 
@@ -750,7 +750,7 @@ public class OQLEngineTest {
         if (o instanceof Map) {
             List<String> els = new ArrayList<>();
             Map<?,?> m = (Map) o;
-            for (Map.Entry e : m.entrySet()) {
+            for (Map.Entry<?,?> e : m.entrySet()) {
                 els.add(e.getKey()+"="+e.getValue());
             }
             els.sort(null);
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/repository/api/OQLQueryRepositoryTest.java 2.2-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/repository/api/OQLQueryRepositoryTest.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/repository/api/OQLQueryRepositoryTest.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.oql/test/unit/src/org/graalvm/visualvm/lib/profiler/oql/repository/api/OQLQueryRepositoryTest.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -69,7 +69,7 @@ public class OQLQueryRepositoryTest {
     public void testListAllCategories() {
         System.out.println("listAllCategories");
 
-        List result = instance.listCategories();
+        List<?> result = instance.listCategories();
         assertTrue(!result.isEmpty());
     }
 
@@ -81,7 +81,7 @@ public class OQLQueryRepositoryTest {
     public void testListMatchingCategories() {
         System.out.println("listMatchingCategories");
         String pattern = "Sam.*";
-        List result = instance.listCategories(pattern);
+        List<?> result = instance.listCategories(pattern);
         assertEquals(1, result.size());
     }
 
@@ -93,7 +93,7 @@ public class OQLQueryRepositoryTest {
     public void testListNonMatchingCategories() {
         System.out.println("listNonMatchingCategories");
         String pattern = "[0-9]+";
-        List result = instance.listCategories(pattern);
+        List<?> result = instance.listCategories(pattern);
         assertEquals(0, result.size());
     }
 
@@ -104,7 +104,7 @@ public class OQLQueryRepositoryTest {
     @Test
     public void testListAllQueries() {
         System.out.println("listAllQueries");
-        List result = instance.listQueries();
+        List<?> result = instance.listQueries();
         assertEquals(11, result.size());
     }
 
@@ -116,7 +116,7 @@ public class OQLQueryRepositoryTest {
     public void testListAllCategoryQueries() {
         System.out.println("listAllCategoryQueries");
         OQLQueryCategory category = instance.listCategories().get(0);
-        List result = instance.listQueries(category);
+        List<?> result = instance.listQueries(category);
         assertEquals(4, result.size());
     }
 
@@ -127,7 +127,7 @@ public class OQLQueryRepositoryTest {
     @Test
     public void testListAllMatchingQueries() {
         System.out.println("listAllMatchingQueries");
-        List result = instance.listQueries(".+?allocated.*");
+        List<?> result = instance.listQueries(".+?allocated.*");
         assertEquals(2, result.size());
     }
 
@@ -139,7 +139,7 @@ public class OQLQueryRepositoryTest {
     public void testListMatchingCategoryQueries() {
         System.out.println("listMatchingCategoryQueries");
         OQLQueryCategory category = instance.listCategories().get(0);
-        List result = instance.listQueries(category, ".+?allocated.*");
+        List<?> result = instance.listQueries(category, ".+?allocated.*");
         assertEquals(2, result.size());
     }
 }
diff -pruN 2.1.10-1/visualvm/libs.profiler/profiler.snaptracer/src/org/graalvm/visualvm/lib/profiler/snaptracer/impl/export/DataExport.java 2.2-1/visualvm/libs.profiler/profiler.snaptracer/src/org/graalvm/visualvm/lib/profiler/snaptracer/impl/export/DataExport.java
--- 2.1.10-1/visualvm/libs.profiler/profiler.snaptracer/src/org/graalvm/visualvm/lib/profiler/snaptracer/impl/export/DataExport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/libs.profiler/profiler.snaptracer/src/org/graalvm/visualvm/lib/profiler/snaptracer/impl/export/DataExport.java	2025-04-17 09:07:34.000000000 +0000
@@ -96,10 +96,8 @@ public final class DataExport {
         
         TracerSupportImpl.getInstance().perform(new Runnable() {
             public void run() {
-                Writer writer = null;
                 TracerProgressObject progress = null;
-                try {
-                    writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); // NOI18N
+                try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8")) { // NOI18N
                     ExportBatch batch = null;
 
                     if (filter == XML_FILTER)
@@ -123,8 +121,6 @@ public final class DataExport {
                         progress.finish();
                     }
                     LOGGER.log(Level.INFO, "Exporting data failed", t); // NOI18N
-                } finally {
-                    if (writer != null) try { writer.close(); } catch (Exception e) {}
                 }
             }
         });
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/build.xml 2.2-1/visualvm/nashorn.jdk15/build.xml
--- 2.1.10-1/visualvm/nashorn.jdk15/build.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/build.xml	2025-04-17 09:07:34.000000000 +0000
@@ -2,8 +2,8 @@
 <!-- You may freely edit this file. See harness/README in the NetBeans platform -->
 <!-- for some information on what you could do (e.g. targets to override). -->
 <!-- If you delete this file and reopen the project it will be recreated. -->
-<project name="org.graalvm.visualvm.modules.nashorn.jdk15" default="netbeans" basedir=".">
-    <description>Builds, tests, and runs the project org.graalvm.visualvm.modules.nashorn.jdk15.</description>
+<project name="org.graalvm.visualvm.nashorn.jdk15" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project org.graalvm.visualvm.nashorn.jdk15.</description>
     <import file="nbproject/build-impl.xml"/>
     <target name="download-all-extbins" unless="ext.binaries.downloaded" depends="init">
       <echo>Downloading external binaries (external/ directory)...</echo>
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/external/asm-util-9.5-license.txt 2.2-1/visualvm/nashorn.jdk15/external/asm-util-9.5-license.txt
--- 2.1.10-1/visualvm/nashorn.jdk15/external/asm-util-9.5-license.txt	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/external/asm-util-9.5-license.txt	1970-01-01 00:00:00.000000000 +0000
@@ -1,37 +0,0 @@
-Name: OW2 ASM
-Version: 9.5
-Files: asm-util-9.5.jar
-License: BSD-INRIA
-Origin: OW2 Consortium
-URL: https://repository.ow2.org/nexus/content/repositories/releases/org/ow2/asm/
-Description: Bytecode manipulation library
-
-*******************************************************************************
-* ASM: a very small and fast Java bytecode manipulation framework
-* Copyright (c) 2000-2011 INRIA, France Telecom
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-* 1. Redistributions of source code must retain the above copyright
-*   notice, this list of conditions and the following disclaimer.
-* 2. Redistributions in binary form must reproduce the above copyright
-*   notice, this list of conditions and the following disclaimer in the
-*   documentation and/or other materials provided with the distribution.
-* 3. Neither the name of the copyright holders nor the names of its
-*   contributors may be used to endorse or promote products derived from
-*   this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-* THE POSSIBILITY OF SUCH DAMAGE.
-*******************************************************************************
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/external/asm-util-9.7-license.txt 2.2-1/visualvm/nashorn.jdk15/external/asm-util-9.7-license.txt
--- 2.1.10-1/visualvm/nashorn.jdk15/external/asm-util-9.7-license.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/external/asm-util-9.7-license.txt	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,37 @@
+Name: OW2 ASM
+Version: 9.7
+Files: asm-util-9.7.jar
+License: BSD-INRIA
+Origin: OW2 Consortium
+URL: https://repository.ow2.org/nexus/content/repositories/releases/org/ow2/asm/
+Description: Bytecode manipulation library
+
+*******************************************************************************
+* ASM: a very small and fast Java bytecode manipulation framework
+* Copyright (c) 2000-2011 INRIA, France Telecom
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+*   notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+*   notice, this list of conditions and the following disclaimer in the
+*   documentation and/or other materials provided with the distribution.
+* 3. Neither the name of the copyright holders nor the names of its
+*   contributors may be used to endorse or promote products derived from
+*   this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+* THE POSSIBILITY OF SUCH DAMAGE.
+*******************************************************************************
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/external/binaries-list 2.2-1/visualvm/nashorn.jdk15/external/binaries-list
--- 2.1.10-1/visualvm/nashorn.jdk15/external/binaries-list	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/external/binaries-list	2025-04-17 09:07:34.000000000 +0000
@@ -1,2 +1,2 @@
 F67F5FFAA5F5130CF6FB9B133DA00C7DF3B532A5 org.openjdk.nashorn:nashorn-core:15.4
-64B5A1FC8C1B15ED2EFD6A063E976BC8D3DC5FFE org.ow2.asm:asm-util:9.5
+C0655519F24D92AF2202CB681CD7C1569DF6EAD6 org.ow2.asm:asm-util:9.7
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/manifest.mf 2.2-1/visualvm/nashorn.jdk15/manifest.mf
--- 2.1.10-1/visualvm/nashorn.jdk15/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,7 +1,8 @@
 Manifest-Version: 1.0
 AutoUpdate-Show-In-Client: false
+AutoUpdate-Essential-Module: true
 OpenIDE-Module-Java-Dependencies: Java > 15
-OpenIDE-Module: org.graalvm.visualvm.modules.nashorn.jdk15
-OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/modules/nashorn/jdk15/Bundle.properties
+OpenIDE-Module: org.graalvm.visualvm.nashorn.jdk15
+OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/nashorn/jdk15/Bundle.properties
 OpenIDE-Module-Specification-Version: 1.1
 
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/nbproject/build-impl.xml 2.2-1/visualvm/nashorn.jdk15/nbproject/build-impl.xml
--- 2.1.10-1/visualvm/nashorn.jdk15/nbproject/build-impl.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/nbproject/build-impl.xml	2025-04-17 09:07:34.000000000 +0000
@@ -3,7 +3,7 @@
 *** GENERATED FROM project.xml - DO NOT EDIT  ***
 ***         EDIT ../build.xml INSTEAD         ***
 -->
-<project name="org.graalvm.visualvm.modules.nashorn.jdk15-impl" basedir="..">
+<project name="org.graalvm.visualvm.nashorn.jdk15-impl" basedir="..">
     <property file="nbproject/private/suite-private.properties"/>
     <property file="nbproject/suite.properties"/>
     <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/nbproject/project.properties 2.2-1/visualvm/nashorn.jdk15/nbproject/project.properties
--- 2.1.10-1/visualvm/nashorn.jdk15/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,11 +1,11 @@
 file.reference.nashorn-core-15.4.jar=external/nashorn-core-15.4.jar
-file.reference.asm-util-9.5.jar=external/asm-util-9.5.jar
+file.reference.asm-util-9.7.jar=external/asm-util-9.7.jar
 is.eager=true
 license.file=../startup/src/org/graalvm/visualvm/modules/startup/LICENSE.txt
 nbm.homepage=https://visualvm.github.io
 nbm.module.author=Tomas Hurka
 nbm.needs.restart=true
 release.external/nashorn-core-15.4.jar=modules/ext/nashorn-core-15.4.jar
-release.external/asm-util-9.5.jar=modules/ext/asm-util-9.5.jar
-javac.source=1.8
+release.external/asm-util-9.7.jar=modules/ext/asm-util-9.7.jar
+javac.source=1.15
 javac.compilerargs=-Xlint -Xlint:-serial
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/nbproject/project.xml 2.2-1/visualvm/nashorn.jdk15/nbproject/project.xml
--- 2.1.10-1/visualvm/nashorn.jdk15/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -3,7 +3,7 @@
     <type>org.netbeans.modules.apisupport.project</type>
     <configuration>
         <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
-            <code-name-base>org.graalvm.visualvm.modules.nashorn.jdk15</code-name-base>
+            <code-name-base>org.graalvm.visualvm.nashorn.jdk15</code-name-base>
             <suite-component/>
             <module-dependencies>
                 <dependency>
@@ -21,8 +21,8 @@
                 <binary-origin>external/nashorn-core-15.4.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/asm-util-9.5.jar</runtime-relative-path>
-                <binary-origin>external/asm-util-9.5.jar</binary-origin>
+                <runtime-relative-path>ext/asm-util-9.7.jar</runtime-relative-path>
+                <binary-origin>external/asm-util-9.7.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/modules/nashorn/jdk15/Bundle.properties 2.2-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/modules/nashorn/jdk15/Bundle.properties
--- 2.1.10-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/modules/nashorn/jdk15/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/modules/nashorn/jdk15/Bundle.properties	1970-01-01 00:00:00.000000000 +0000
@@ -1,5 +0,0 @@
-OpenIDE-Module-Display-Category=Libraries
-OpenIDE-Module-Long-Description=\
-    Nashorn is an Open Source JavaScript (ECMAScript 5.1 and some 6 features) engine for the JVM.
-OpenIDE-Module-Name=Nashorn for JDK 15+
-OpenIDE-Module-Short-Description=Nashorn is JavaScript engine for the JVM.
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/nashorn/jdk15/Bundle.properties 2.2-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/nashorn/jdk15/Bundle.properties
--- 2.1.10-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/nashorn/jdk15/Bundle.properties	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/src/org/graalvm/visualvm/nashorn/jdk15/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,5 @@
+OpenIDE-Module-Display-Category=Libraries
+OpenIDE-Module-Long-Description=\
+    Nashorn is an Open Source JavaScript (ECMAScript 5.1 and some 6 features) engine for the JVM.
+OpenIDE-Module-Name=Nashorn for JDK 15+
+OpenIDE-Module-Short-Description=Nashorn is JavaScript engine for the JVM.
diff -pruN 2.1.10-1/visualvm/nashorn.jdk15/src/org/openjdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java 2.2-1/visualvm/nashorn.jdk15/src/org/openjdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
--- 2.1.10-1/visualvm/nashorn.jdk15/src/org/openjdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java	1970-01-01 00:00:00.000000000 +0000
+++ 2.2-1/visualvm/nashorn.jdk15/src/org/openjdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java	2025-04-17 09:07:34.000000000 +0000
@@ -0,0 +1,393 @@
+/*
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.openjdk.nashorn.internal.runtime.linker;
+
+import static org.openjdk.nashorn.internal.lookup.Lookup.MH;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup;
+import java.lang.invoke.MethodType;
+import java.lang.invoke.VarHandle;
+import java.lang.reflect.Modifier;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.CodeSigner;
+import java.security.CodeSource;
+import java.security.Permissions;
+import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import jdk.dynalink.CallSiteDescriptor;
+import jdk.dynalink.StandardOperation;
+import jdk.dynalink.beans.StaticClass;
+import jdk.dynalink.linker.support.SimpleLinkRequest;
+import org.openjdk.nashorn.internal.runtime.Context;
+import org.openjdk.nashorn.internal.runtime.ECMAErrors;
+import org.openjdk.nashorn.internal.runtime.ECMAException;
+import org.openjdk.nashorn.internal.runtime.ScriptFunction;
+import org.openjdk.nashorn.internal.runtime.ScriptObject;
+
+/**
+ * A factory class that generates adapter classes. Adapter classes allow
+ * implementation of Java interfaces and extending of Java classes from
+ * JavaScript. For every combination of a superclass to extend and interfaces to
+ * implement (collectively: "original types"), exactly one adapter class is
+ * generated that extends the specified superclass and implements the specified
+ * interfaces. (But see the discussion of class-based overrides for exceptions.)
+ * <p>
+ * The adapter class is generated in a new secure class loader that inherits
+ * Nashorn's protection domain, and has either one of the original types' class
+ * loader or the Nashorn's class loader as its parent - the parent class loader
+ * is chosen so that all the original types and the Nashorn core classes are
+ * visible from it (as the adapter will have constant pool references to
+ * ScriptObject and ScriptFunction classes). In case none of the candidate class
+ * loaders has visibility of all the required types, an error is thrown. The
+ * class uses {@link JavaAdapterBytecodeGenerator} to generate the adapter class
+ * itself; see its documentation for details about the generated class.
+ * <p>
+ * You normally don't use this class directly, but rather either create adapters
+ * from script using {@link org.openjdk.nashorn.internal.objects.NativeJava#extend(Object, Object...)},
+ * using the {@code new} operator on abstract classes and interfaces (see
+ * {@link org.openjdk.nashorn.internal.objects.NativeJava#type(Object, Object)}), or
+ * implicitly when passing script functions to Java methods expecting SAM types.
+ */
+
+public final class JavaAdapterFactory {
+    private static final ProtectionDomain MINIMAL_PERMISSION_DOMAIN = createMinimalPermissionDomain();
+
+    // context with permissions needs for AdapterInfo creation
+    private static final AccessControlContext CREATE_ADAPTER_INFO_ACC_CTXT =
+        ClassAndLoader.createPermAccCtxt("createClassLoader", "getClassLoader",
+            "accessDeclaredMembers", "accessClassInPackage.org.openjdk.nashorn.internal.runtime");
+
+    /**
+     * A mapping from an original Class object to AdapterInfo representing the adapter for the class it represents.
+     */
+    private static final ClassValue<Map<List<Class<?>>, AdapterInfo>> ADAPTER_INFO_MAPS = new ClassValue<>() {
+        @Override
+        protected Map<List<Class<?>>, AdapterInfo> computeValue(final Class<?> type) {
+            return new ConcurrentHashMap<>();
+        }
+    };
+
+    private static final ClassValue<Boolean> AUTO_CONVERTIBLE_FROM_FUNCTION = new ClassValue<>() {
+        @Override
+        protected Boolean computeValue(final Class<?> type) {
+            try {
+                return getAdapterInfo(new Class<?>[] { type }).autoConvertibleFromFunction;
+            } catch (Exception e) {
+                return false;
+            }
+        }
+    };
+
+    /**
+     * Returns an adapter class for the specified original types. The adapter
+     * class extends/implements the original class/interfaces.
+     *
+     * @param types the original types. The caller must pass at least one Java
+     *        type representing either a public interface or a non-final public
+     *        class with at least one public or protected constructor. If more
+     *        than one type is specified, at most one can be a class and the
+     *        rest have to be interfaces. The class can be in any position in
+     *        the array. Invoking the method twice with exactly the same types
+     *        in the same order will return the same adapter class, any
+     *        reordering of types or even addition or removal of redundant types
+     *        (i.e., interfaces that other types in the list already
+     *        implement/extend, or {@code java.lang.Object} in a list of types
+     *        consisting purely of interfaces) will result in a different
+     *        adapter class, even though those adapter classes are functionally
+     *        identical; we deliberately don't want to incur the additional
+     *        processing cost of canonicalizing type lists.
+     * @param classOverrides a JavaScript object with functions serving as the
+     *        class-level overrides and implementations. These overrides are
+     *        defined for all instances of the class, and can be further
+     *        overridden on a per-instance basis by passing additional objects
+     *        in the constructor.
+     * @param lookup the lookup object identifying the caller class. The
+     *        generated adapter class will have the protection domain of the
+     *        caller class iff the lookup object is full-strength, otherwise it
+     *        will be completely unprivileged.
+     *
+     * @return an adapter class. See this class' documentation for details on
+     *         the generated adapter class.
+     *
+     * @throws ECMAException with a TypeError if the adapter class can not be
+     *         generated because the original class is final, non-public, or has
+     *         no public or protected constructors.
+     */
+    public static StaticClass getAdapterClassFor(final Class<?>[] types, final ScriptObject classOverrides, final MethodHandles.Lookup lookup) {
+        return getAdapterClassFor(types, classOverrides, getProtectionDomain(lookup));
+    }
+
+    private static StaticClass getAdapterClassFor(final Class<?>[] types, final ScriptObject classOverrides, final ProtectionDomain protectionDomain) {
+        assert types != null && types.length > 0;
+        final SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            for (final Class<?> type : types) {
+                // check for restricted package access
+                Context.checkPackageAccess(type);
+                // check for classes, interfaces in reflection
+                ReflectionCheckLinker.checkReflectionAccess(type, true);
+            }
+        }
+        return getAdapterInfo(types).getAdapterClass(classOverrides, protectionDomain);
+    }
+
+    private static ProtectionDomain getProtectionDomain(final MethodHandles.Lookup lookup) {
+        if((lookup.lookupModes() & Lookup.PRIVATE) == 0) {
+            return MINIMAL_PERMISSION_DOMAIN;
+        }
+        return getProtectionDomain(lookup.lookupClass());
+    }
+
+    private static ProtectionDomain getProtectionDomain(final Class<?> clazz) {
+        return AccessController.doPrivileged((PrivilegedAction<ProtectionDomain>) clazz::getProtectionDomain);
+    }
+
+    /**
+     * Returns a method handle representing a constructor that takes a single
+     * argument of the source type (which, really, should be one of {@link ScriptObject},
+     * {@link ScriptFunction}, or {@link Object}, and returns an instance of the
+     * adapter for the target type. Used to implement the function autoconverters
+     * as well as the Nashorn JSR-223 script engine's {@code getInterface()}
+     * method.
+     *
+     * @param sourceType the source type; should be either {@link ScriptObject},
+     *        {@link ScriptFunction}, or {@link Object}. In case of {@code Object},
+     *        it will return a method handle that dispatches to either the script
+     *        object or function constructor at invocation based on the actual
+     *        argument.
+     * @param targetType the target type, for which adapter instances will be created
+     * @param lookup method handle lookup to use
+     *
+     * @return the constructor method handle.
+     *
+     * @throws Exception if anything goes wrong
+     */
+    public static MethodHandle getConstructor(final Class<?> sourceType, final Class<?> targetType, final MethodHandles.Lookup lookup) throws Exception {
+        final StaticClass adapterClass = getAdapterClassFor(new Class<?>[] { targetType }, null, lookup);
+        return MH.bindTo(Bootstrap.getLinkerServices().getGuardedInvocation(new SimpleLinkRequest(
+                new CallSiteDescriptor(lookup, StandardOperation.NEW,
+                        MethodType.methodType(targetType, StaticClass.class, sourceType)), false,
+                        adapterClass, null)).getInvocation(), adapterClass);
+    }
+
+    /**
+     * Returns whether an instance of the specified class/interface can be
+     * generated from a ScriptFunction. Returns {@code true} iff: the adapter
+     * for the class/interface can be created, it is abstract (this includes
+     * interfaces), it has at least one abstract method, all the abstract
+     * methods share the same name, and it has a public or protected default
+     * constructor. Note that invoking this class will most likely result in the
+     * adapter class being defined in the JVM if it hasn't been already.
+     *
+     * @param clazz the inspected class
+     *
+     * @return {@code true} iff an instance of the specified class/interface can
+     *         be generated from a ScriptFunction.
+     */
+    static boolean isAutoConvertibleFromFunction(final Class<?> clazz) {
+        return AUTO_CONVERTIBLE_FROM_FUNCTION.get(clazz);
+    }
+
+    private static AdapterInfo getAdapterInfo(final Class<?>[] types) {
+        final ClassAndLoader definingClassAndLoader = ClassAndLoader.getDefiningClassAndLoader(types);
+
+        final Map<List<Class<?>>, AdapterInfo> adapterInfoMap = ADAPTER_INFO_MAPS.get(definingClassAndLoader.getRepresentativeClass());
+        return adapterInfoMap.computeIfAbsent(List.of(types), t -> createAdapterInfo(t, definingClassAndLoader));
+    }
+
+   /**
+     * For a given class, create its adapter class and associated info.
+     *
+     * @param types the class and interfaces for which the adapter is created
+     *
+     * @return the adapter info for the class.
+     */
+    private static AdapterInfo createAdapterInfo(final List<Class<?>> types, final ClassAndLoader definingClassAndLoader) {
+        Class<?> superClass = null;
+        final List<Class<?>> interfaces = new ArrayList<>(types.size());
+        final Set<Class<?>> interfacesDedup = new HashSet<>(Math.max((int) (types.size()/.75f) + 1, 16));
+        for(final Class<?> t: types) {
+            final int mod = t.getModifiers();
+            if(!t.isInterface()) {
+                if (superClass == t) {
+                    throw adaptationException(ErrorOutcome.DUPLICATE_TYPE, t.getCanonicalName());
+                } else if(superClass != null) {
+                    throw adaptationException(ErrorOutcome.MULTIPLE_SUPERCLASSES, t.getCanonicalName() + " and " + superClass.getCanonicalName());
+                } else if (Modifier.isFinal(mod)) {
+                    throw adaptationException(ErrorOutcome.FINAL_CLASS, t.getCanonicalName());
+                }
+                superClass = t;
+            } else {
+                if (interfaces.size() > 65535) {
+                    throw adaptationException(ErrorOutcome.TOO_MANY_INTERFACES, "65535");
+                } else if (!interfacesDedup.add(t)) {
+                    throw adaptationException(ErrorOutcome.DUPLICATE_TYPE, t.getCanonicalName());
+                }
+                interfaces.add(t);
+            }
+
+            if(!Modifier.isPublic(mod)) {
+                throw adaptationException(ErrorOutcome.NON_PUBLIC_CLASS, t.getCanonicalName());
+            }
+        }
+
+        final Class<?> effectiveSuperClass = superClass == null ? Object.class : superClass;
+        return AccessController.doPrivileged((PrivilegedAction<AdapterInfo>) () ->
+            new AdapterInfo(effectiveSuperClass, interfaces, definingClassAndLoader),
+            CREATE_ADAPTER_INFO_ACC_CTXT);
+    }
+
+    static ECMAException adaptationException(ErrorOutcome outcome, String... messageArgs) {
+        return ECMAErrors.typeError("extend." + outcome, messageArgs);
+    }
+
+    /**
+     * Contains various error outcomes for attempting to generate an adapter class.
+     */
+    enum ErrorOutcome {
+        FINAL_CLASS,
+        NON_PUBLIC_CLASS,
+        NO_ACCESSIBLE_CONSTRUCTOR,
+        MULTIPLE_SUPERCLASSES,
+        DUPLICATE_TYPE,
+        TOO_MANY_INTERFACES,
+        NO_COMMON_LOADER,
+        FINAL_FINALIZER
+    }
+
+    private static class AdapterInfo {
+        private static final ClassAndLoader SCRIPT_OBJECT_LOADER = new ClassAndLoader(ScriptFunction.class, true);
+        private static final VarHandle INSTANCE_ADAPTERS;
+        static {
+            try {
+                INSTANCE_ADAPTERS = MethodHandles.lookup().findVarHandle(AdapterInfo.class, "instanceAdapters", Map.class);
+            } catch (ReflectiveOperationException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        private final ClassLoader commonLoader;
+        // TODO: soft reference the JavaAdapterClassLoader objects. They can be recreated when needed.
+        private final JavaAdapterClassLoader classAdapterGenerator;
+        private final JavaAdapterClassLoader instanceAdapterGenerator;
+        private Map<CodeSource, StaticClass> instanceAdapters;
+        final boolean autoConvertibleFromFunction;
+
+        AdapterInfo(final Class<?> superClass, final List<Class<?>> interfaces, final ClassAndLoader definingLoader) {
+            this.commonLoader = findCommonLoader(definingLoader);
+            final JavaAdapterBytecodeGenerator gen = new JavaAdapterBytecodeGenerator(superClass, interfaces, commonLoader, false);
+            this.autoConvertibleFromFunction = gen.isAutoConvertibleFromFunction();
+            instanceAdapterGenerator = gen.createAdapterClassLoader();
+            this.classAdapterGenerator = new JavaAdapterBytecodeGenerator(superClass, interfaces, commonLoader, true).createAdapterClassLoader();
+        }
+
+        StaticClass getAdapterClass(final ScriptObject classOverrides, final ProtectionDomain protectionDomain) {
+            return classOverrides == null ? getInstanceAdapterClass(protectionDomain) :
+                getClassAdapterClass(classOverrides, protectionDomain);
+        }
+
+        private StaticClass getInstanceAdapterClass(final ProtectionDomain protectionDomain) {
+            CodeSource codeSource = protectionDomain.getCodeSource();
+            if(codeSource == null) {
+                codeSource = MINIMAL_PERMISSION_DOMAIN.getCodeSource();
+            }
+            var ia = instanceAdapters;
+            if (ia == null) {
+                var nia = new ConcurrentHashMap<CodeSource, StaticClass>();
+                @SuppressWarnings("unchecked")
+                var xia = (Map<CodeSource, StaticClass>)INSTANCE_ADAPTERS.compareAndExchange(this, null, nia);
+                ia = xia == null ? nia : xia;
+            }
+            return ia.computeIfAbsent(codeSource, cs -> {
+                // Any "unknown source" code source will default to no permission domain.
+                final ProtectionDomain effectiveDomain =
+                    cs.equals(MINIMAL_PERMISSION_DOMAIN.getCodeSource())
+                    ? MINIMAL_PERMISSION_DOMAIN : protectionDomain;
+
+                return instanceAdapterGenerator.generateClass(commonLoader, effectiveDomain);
+            });
+        }
+
+        private StaticClass getClassAdapterClass(final ScriptObject classOverrides, final ProtectionDomain protectionDomain) {
+            JavaAdapterServices.setClassOverrides(classOverrides);
+            try {
+                return classAdapterGenerator.generateClass(commonLoader, protectionDomain);
+            } finally {
+                JavaAdapterServices.setClassOverrides(null);
+            }
+        }
+
+        /**
+         * Choose between the passed class loader and the class loader that defines the
+         * ScriptObject class, based on which of the two can see the classes in both.
+         *
+         * @param classAndLoader the loader and a representative class from it that will
+         *        be used to add the generated adapter to its ADAPTER_INFO_MAPS.
+         *
+         * @return the class loader that sees both the specified class and Nashorn classes.
+         */
+        private static ClassLoader findCommonLoader(final ClassAndLoader classAndLoader) {
+            if(classAndLoader.canSee(SCRIPT_OBJECT_LOADER)) {
+                return classAndLoader.getLoader();
+            }
+            if (SCRIPT_OBJECT_LOADER.canSee(classAndLoader)) {
+                return SCRIPT_OBJECT_LOADER.getLoader();
+            }
+            // try context class loader
+            if (checkContextCL(classAndLoader) && checkContextCL(SCRIPT_OBJECT_LOADER)) {
+                return Thread.currentThread().getContextClassLoader();
+            }
+            throw adaptationException(ErrorOutcome.NO_COMMON_LOADER, classAndLoader.getRepresentativeClass().getCanonicalName());
+        }
+
+        private static boolean checkContextCL(final ClassAndLoader classAndLoader) {
+            try {
+                ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+                final Class<?> otherClass = classAndLoader.getRepresentativeClass();
+                return Class.forName(otherClass.getName(), false, contextClassLoader) == otherClass;
+            } catch (ClassNotFoundException e) {
+                return false;
+            }
+        }
+    }
+
+    private static ProtectionDomain createMinimalPermissionDomain() {
+        // Generated classes need to have at least the permission to access Nashorn runtime and runtime.linker packages.
+        final Permissions permissions = new Permissions();
+        permissions.add(new RuntimePermission("accessClassInPackage.org.openjdk.nashorn.internal.runtime"));
+        permissions.add(new RuntimePermission("accessClassInPackage.org.openjdk.nashorn.internal.runtime.linker"));
+        return new ProtectionDomain(new CodeSource(null, (CodeSigner[])null), permissions);
+    }
+}
diff -pruN 2.1.10-1/visualvm/nbproject/project.properties 2.2-1/visualvm/nbproject/project.properties
--- 2.1.10-1/visualvm/nbproject/project.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/nbproject/project.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,10 +1,11 @@
 app.icon=branding/core/core.jar/org/netbeans/core/startup/frame48.gif
 app.name=${branding.token}
-app.title=VisualVM 2.1.10
+app.title=VisualVM 2.2
 modules=\
     ${project.org.graalvm.visualvm.core}:\
     ${project.org.graalvm.visualvm.modules.appui}:\
     ${project.org.graalvm.visualvm.modules.startup}:\
+    ${project.org.graalvm.visualvm.modules.killapp}:\
     ${project.org.graalvm.visualvm.application}:\
     ${project.org.graalvm.visualvm.host}:\
     ${project.org.graalvm.visualvm.coredump}:\
@@ -28,7 +29,7 @@ modules=\
     ${project.org.graalvm.visualvm.heapviewer}:\
     ${project.org.graalvm.visualvm.heapviewer.console}:\
     ${project.org.graalvm.visualvm.heapviewer.truffle}:\
-    ${project.org.graalvm.visualvm.modules.graalvm}:\
+    ${project.org.graalvm.visualvm.graalvm}:\
     ${project.org.graalvm.visualvm.sampler.truffle}:\
     ${project.org.graalvm.visualvm.pluginimporter}:\
     ${project.org.graalvm.visualvm.gotosource}:\
@@ -44,10 +45,10 @@ modules=\
     ${project.org.graalvm.visualvm.lib.profiler.oql}:\
     ${project.org.graalvm.visualvm.lib.profiler.snaptracer}:\
     ${project.org.graalvm.visualvm.lib.profiler.utilities}:\
-    ${project.org.graalvm.visualvm.nashorn.jdk15}:\
     ${project.org.graalvm.visualvm.jfr}:\
     ${project.org.graalvm.visualvm.jfr.generic}
 #    ${project.org.graalvm.visualvm.jfr.jdk11}
+#    ${project.org.graalvm.visualvm.nashorn.jdk15}
 project.org.graalvm.visualvm.api.caching=caching.api
 project.org.graalvm.visualvm.application=application
 project.org.graalvm.visualvm.applicationviews=applicationviews
@@ -62,14 +63,14 @@ project.org.graalvm.visualvm.heapviewer.
 project.org.graalvm.visualvm.host=host
 project.org.graalvm.visualvm.host.remote=hostremote
 project.org.graalvm.visualvm.host.views=hostviews
-project.org.graalvm.visualvm.nashorn.jdk15=nashorn.jdk15
+#project.org.graalvm.visualvm.nashorn.jdk15=nashorn.jdk15
 project.org.graalvm.visualvm.jfr=jfr
 project.org.graalvm.visualvm.jfr.generic=jfr.generic
 #project.org.graalvm.visualvm.jfr.jdk11=jfr.jdk11
 project.org.graalvm.visualvm.jmx=jmx
 project.org.graalvm.visualvm.jvm=jvm
 project.org.graalvm.visualvm.jvmstat=jvmstat
-project.org.graalvm.visualvm.modules.graalvm=graalvm
+project.org.graalvm.visualvm.graalvm=graalvm
 project.org.graalvm.visualvm.sampler.truffle=sampler.truffle
 project.org.graalvm.visualvm.pluginimporter=pluginimporter
 project.org.graalvm.visualvm.profiler=profiler
@@ -81,6 +82,7 @@ project.org.graalvm.visualvm.tools=tools
 project.org.graalvm.visualvm.core=core
 project.org.graalvm.visualvm.modules.appui=appui
 project.org.graalvm.visualvm.modules.startup=startup
+project.org.graalvm.visualvm.modules.killapp=killapp
 project.org.graalvm.visualvm.uisupport=uisupport
 
 project.org.graalvm.visualvm.lib.jfluid=libs.profiler/lib.profiler
diff -pruN 2.1.10-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/ClusterUpdateProvider.java 2.2-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/ClusterUpdateProvider.java
--- 2.1.10-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/ClusterUpdateProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/ClusterUpdateProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -172,9 +172,7 @@ public class ClusterUpdateProvider imple
 
     private static void readConfigFile (File cf, Map<String, String> attr) {
         Document document = null;
-        InputStream is = null;
-        try {
-            is = new BufferedInputStream (new FileInputStream (cf));
+        try (InputStream is = new BufferedInputStream (new FileInputStream (cf))) {
             InputSource xmlInputSource = new InputSource (is);
             document = XMLUtil.parse (xmlInputSource, false, false, null, EntityCatalog.getDefault ());
         } catch (SAXException saxe) {
@@ -184,14 +182,6 @@ public class ClusterUpdateProvider imple
         } catch (IOException ioe) {
             LOG.log(Level.INFO, "Error while reading " + cf);
             LOG.log(Level.WARNING, ioe.getLocalizedMessage (), ioe);
-        } finally {
-            if (is != null) {
-                try {
-                    is.close ();
-                } catch (IOException e){
-                    //ignore
-                }
-            }
         }
 
         assert document.getDocumentElement () != null : "File " + cf + " must contain document element.";
diff -pruN 2.1.10-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/PluginImporter.java 2.2-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/PluginImporter.java
--- 2.1.10-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/PluginImporter.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/pluginimporter/src/org/graalvm/visualvm/pluginimporter/PluginImporter.java	2025-04-17 09:07:34.000000000 +0000
@@ -325,18 +325,13 @@ public class PluginImporter {
 
     private static Node getUpdateTrackingConf(File moduleUpdateTracking) {
         Document document = null;
-        InputStream is;
-        try {
-            is = new BufferedInputStream(new FileInputStream(moduleUpdateTracking));
+        try (InputStream is = new BufferedInputStream(new FileInputStream(moduleUpdateTracking))) {
             InputSource xmlInputSource = new InputSource(is);
             document = XMLUtil.parse(xmlInputSource, false, false, null, org.openide.xml.EntityCatalog.getDefault());
-            is.close();
         } catch (SAXException saxe) {
             LOG.log(Level.WARNING, "SAXException when reading " + moduleUpdateTracking + ", cause: " + saxe);
             //for issue #217118 investigation what is corrupted and how
-            FileReader reader = null;
-            try {
-                reader = new FileReader(moduleUpdateTracking);
+            try (FileReader reader = new FileReader(moduleUpdateTracking)){
                 char[] text = new char[1024];
                 String fileContent = "";
                 while (reader.read(text) > 0) {
@@ -345,14 +340,6 @@ public class PluginImporter {
                 LOG.log(Level.WARNING, "SAXException in file:\n------FILE START------\n " + fileContent + "\n------FILE END-----\n");
             } catch (Exception ex) {
                 //don't need to fail in logging
-            } finally {
-                if (reader != null) {
-                    try {
-                        reader.close();
-                    } catch (IOException ex) {
-                        //don't need any info from logging fail
-                    }
-                }
             }
             return null;
         } catch (IOException ioe) {
diff -pruN 2.1.10-1/visualvm/profiler/nbproject/project.xml 2.2-1/visualvm/profiler/nbproject/project.xml
--- 2.1.10-1/visualvm/profiler/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/profiler/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -48,7 +48,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.18</specification-version>
+                        <specification-version>2.19</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/profiler/src/org/graalvm/visualvm/profiler/ProfilerSupport.java 2.2-1/visualvm/profiler/src/org/graalvm/visualvm/profiler/ProfilerSupport.java
--- 2.1.10-1/visualvm/profiler/src/org/graalvm/visualvm/profiler/ProfilerSupport.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/profiler/src/org/graalvm/visualvm/profiler/ProfilerSupport.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -179,6 +179,8 @@ public final class ProfilerSupport {
             return NbBundle.getMessage(ProfilerSupport.class, "STR_Java_platform_name", 22); // NOI18N
         if (Platform.JDK_230_STRING.equals(code))
             return NbBundle.getMessage(ProfilerSupport.class, "STR_Java_platform_name", 23); // NOI18N
+        if (Platform.JDK_240_STRING.equals(code))
+            return NbBundle.getMessage(ProfilerSupport.class, "STR_Java_platform_name", 24); // NOI18N
         throw new IllegalArgumentException("Unknown java code " + code); // NOI18N
     }
     
@@ -434,8 +436,8 @@ public final class ProfilerSupport {
             String code = "jdk1" + i; // NOI18N
             if (supportsProfiling(code, 32) || supportsProfiling(code, 64)) codesl.add(code);
         }
-        // jdk 10 .. jdk 23
-        for (int i = 10; i <= 23; i++) {
+        // jdk 10 .. jdk 24
+        for (int i = 10; i <= 24; i++) {
             String code = "jdk" + i +"0"; // NOI18N
             if (supportsProfiling(code, 32) || supportsProfiling(code, 64)) codesl.add(code);
         }
diff -pruN 2.1.10-1/visualvm/sampler/manifest.mf 2.2-1/visualvm/sampler/manifest.mf
--- 2.1.10-1/visualvm/sampler/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,6 @@
 Manifest-Version: 1.0
 AutoUpdate-Show-In-Client: false
+AutoUpdate-Essential-Module: true
 OpenIDE-Module: org.graalvm.visualvm.sampler/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/sampler/Bundle.properties
 OpenIDE-Module-Specification-Version: 2.2
diff -pruN 2.1.10-1/visualvm/sampler/nbproject/project.xml 2.2-1/visualvm/sampler/nbproject/project.xml
--- 2.1.10-1/visualvm/sampler/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -111,7 +111,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
+                        <specification-version>2.4</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/SamplerImpl.java 2.2-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/SamplerImpl.java
--- 2.1.10-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/SamplerImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/SamplerImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * 
  * This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,6 @@ import org.graalvm.visualvm.tools.attach
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.graalvm.visualvm.uisupport.HTMLLabel;
 import org.graalvm.visualvm.uisupport.HTMLTextArea;
 import java.awt.Dimension;
@@ -707,7 +706,7 @@ final class SamplerImpl {
                 ThreadsMemory threadsMemory = null;
                 JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
                 if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
-                    JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                    JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
                     if (mxbeans != null) {
                         memoryBean = mxbeans.getMemoryMXBean();
                         try {
diff -pruN 2.1.10-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/CPUView.java 2.2-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/CPUView.java
--- 2.1.10-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/CPUView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/CPUView.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * 
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/ThreadInfoProvider.java 2.2-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/ThreadInfoProvider.java
--- 2.1.10-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/ThreadInfoProvider.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler/src/org/graalvm/visualvm/sampler/cpu/ThreadInfoProvider.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,6 @@ import org.graalvm.visualvm.core.datasup
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
 import java.util.logging.Level;
@@ -74,9 +73,9 @@ public final class ThreadInfoProvider {
         if (jmxModel.getConnectionState() != JmxModel.ConnectionState.CONNECTED) {
            return NbBundle.getMessage(ThreadInfoProvider.class, "MSG_unavailable_create_jmx"); // NOI18N
         }
-        JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+        JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
         if (mxbeans == null) {
-            LOGGER.log(Level.INFO, "JvmMXBeansFactory.getJvmMXBeans(jmxModel) returns null for " + application); // NOI18N
+            LOGGER.log(Level.INFO, "jmxModel.getJvmMXBeans() returns null for " + application); // NOI18N
             return NbBundle.getMessage(ThreadInfoProvider.class, "MSG_unavailable_threads", VisualVM.getInstance().getLogfileHandle()); // NOI18N
         }
 //////        //TODO
diff -pruN 2.1.10-1/visualvm/sampler.truffle/manifest.mf 2.2-1/visualvm/sampler.truffle/manifest.mf
--- 2.1.10-1/visualvm/sampler.truffle/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler.truffle/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,6 @@
 Manifest-Version: 1.0
 AutoUpdate-Show-In-Client: false
+AutoUpdate-Essential-Module: true
 OpenIDE-Module: org.graalvm.visualvm.sampler.truffle/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/sampler/truffle/Bundle.properties
 OpenIDE-Module-Specification-Version: 2.1
diff -pruN 2.1.10-1/visualvm/sampler.truffle/nbproject/project.xml 2.2-1/visualvm/sampler.truffle/nbproject/project.xml
--- 2.1.10-1/visualvm/sampler.truffle/nbproject/project.xml	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler.truffle/nbproject/project.xml	2025-04-17 09:07:34.000000000 +0000
@@ -111,7 +111,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.0</specification-version>
+                        <specification-version>2.4</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff -pruN 2.1.10-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/SamplerImpl.java 2.2-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/SamplerImpl.java
--- 2.1.10-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/SamplerImpl.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/SamplerImpl.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * 
  * This code is free software; you can redistribute it and/or modify it
@@ -86,7 +86,6 @@ import org.graalvm.visualvm.threaddump.T
 import org.graalvm.visualvm.tools.jmx.JmxModel;
 import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
 import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
-import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
 import org.graalvm.visualvm.uisupport.HTMLLabel;
 import org.graalvm.visualvm.uisupport.HTMLTextArea;
 import org.openide.DialogDisplayer;
@@ -629,7 +628,7 @@ final class SamplerImpl {
                 MemoryMXBean memoryBean = null;
                 JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
                 if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
-                    JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
+                    JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
                     if (mxbeans != null) {
                         memoryBean = mxbeans.getMemoryMXBean();
                     }
diff -pruN 2.1.10-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/cpu/CPUView.java 2.2-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/cpu/CPUView.java
--- 2.1.10-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/cpu/CPUView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/sampler.truffle/src/org/graalvm/visualvm/sampler/truffle/cpu/CPUView.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * 
  * This code is free software; you can redistribute it and/or modify it
diff -pruN 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/Bundle.properties 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/Bundle.properties
--- 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/Bundle.properties	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/Bundle.properties	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,7 @@ ACSD_RejectButton=Click to reject licens
 OpenIDE-Module-Short-Description=VisualVM startup Module
 
 VisualVMStartup_ErrorStartupCaption=Error Starting VisualVM
-VisualVMStartup_IncorrectVersionMsg=<html><br><b>You are running VisualVM using an unsupported Java version: {0}.</b><br><br>Please use JDK 8 to JDK 23 to run VisualVM. For information<br>about requirements and setup visit https://visualvm.github.io.<br><br><hr><i>Java: {1}<br>JVM: {2}<br>Location: {3}</i><br><br></html>
+VisualVMStartup_IncorrectVersionMsg=<html><br><b>You are running VisualVM using an unsupported Java version: {0}.</b><br><br>Please use JDK 8 to JDK 24 to run VisualVM. For information<br>about requirements and setup visit https://visualvm.github.io.<br><br><hr><i>Java: {1}<br>JVM: {2}<br>Location: {3}</i><br><br></html>
 VisualVMStartup_JreMsg=<html><br><b>You are running VisualVM using Java Runtime Environment (JRE).</b><br><br>Please use Java Development Kit (JDK) to run VisualVM. For information<br>about requirements and setup visit https://visualvm.github.io.<br><br><hr><i>Java: {0}<br>JVM: {1}<br>Location: {2}</i><br><br></html>
 VisualVMStartup_OpenJ9Msg=<html><br><b>You are running VisualVM using Eclipse OpenJ9.</b><br><br>Please use HotSpot based JDK to run VisualVM. You can still monitor OpenJ9 via JMX.<br>For information about requirements and setup visit https://visualvm.github.io.<br><br><hr><i>Java: {0}<br>JVM: {1}<br>Location: {2}</i><br><br></html>
 
diff -pruN 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/CopyFiles.java 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/CopyFiles.java
--- 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/CopyFiles.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/CopyFiles.java	2025-04-17 09:07:34.000000000 +0000
@@ -68,11 +68,9 @@ final class CopyFiles extends Object {
     private CopyFiles(File source, File target, File patternsFile) throws IOException {
         this.sourceRoot = source;
         this.targetRoot = target;
-        try {
-            InputStream is = new FileInputStream(patternsFile);
-            Reader reader = new InputStreamReader(is, "utf-8"); // NOI18N
+        try (InputStream is = new FileInputStream(patternsFile);
+             Reader reader = new InputStreamReader(is, "utf-8")) { // NOI18N
             readPatterns(reader);
-            reader.close();
         } catch (IOException ex) {
             // set these to null to stop further copying (see copyDeep method)
             sourceRoot = null;
@@ -194,15 +192,9 @@ final class CopyFiles extends Object {
             currentProperties.keySet().removeAll(excludeKeys);
             // copy just selected keys
             LOGGER.log(Level.FINE, "  Only keys: {0}", currentProperties.keySet());
-            OutputStream out = null;
-            try {
-                ensureParent(targetFile);
-                out = new FileOutputStream(targetFile);
+            ensureParent(targetFile);
+            try (OutputStream out = new FileOutputStream(targetFile)) {
                 currentProperties.store(out);
-            } finally {
-                if (out != null) {
-                    out.close();
-                }
             }
         }
     }
diff -pruN 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/ImportSettings.java 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/ImportSettings.java
--- 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/ImportSettings.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/ImportSettings.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -90,7 +90,8 @@ public class ImportSettings {
         "2.1.7",                                                                // NOI18N
         "2.1.8",                                                                // NOI18N
         "2.1.9",                                                                // NOI18N
-        "2.1.10"                                                                // NOI18N
+        "2.1.10",                                                               // NOI18N
+        "2.2"                                                                   // NOI18N
     };
     
     
diff -pruN 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/VisualVMStartup.java 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/VisualVMStartup.java
--- 2.1.10-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/VisualVMStartup.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/startup/src/org/graalvm/visualvm/modules/startup/VisualVMStartup.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -120,7 +120,8 @@ final class VisualVMStartup extends Modu
             || javaVersion.startsWith("20") // NOI18N
             || javaVersion.startsWith("21") // NOI18N
             || javaVersion.startsWith("22") // NOI18N
-            || javaVersion.startsWith("23");// NOI18N
+            || javaVersion.startsWith("23") // NOI18N
+            || javaVersion.startsWith("24");// NOI18N
     }
     
     private static boolean isOpenJ9() {
diff -pruN 2.1.10-1/visualvm/threaddump/src/org/graalvm/visualvm/threaddump/impl/ThreadDumpView.java 2.2-1/visualvm/threaddump/src/org/graalvm/visualvm/threaddump/impl/ThreadDumpView.java
--- 2.1.10-1/visualvm/threaddump/src/org/graalvm/visualvm/threaddump/impl/ThreadDumpView.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/threaddump/src/org/graalvm/visualvm/threaddump/impl/ThreadDumpView.java	2025-04-17 09:07:34.000000000 +0000
@@ -34,7 +34,6 @@ import java.awt.BorderLayout;
 import java.awt.Color;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
@@ -138,9 +137,7 @@ class ThreadDumpView extends SnapshotVie
         private void loadThreadDump(final File file) {
             VisualVM.getInstance().runTask(new Runnable() {
             public void run() {
-              InputStream is = null;
-              try {
-                is = new FileInputStream(file);
+              try (InputStream is = new FileInputStream(file)) {
                 byte[] data = new byte[(int)file.length()];
                 try {
                   is.read(data);
@@ -163,16 +160,8 @@ class ThreadDumpView extends SnapshotVie
                 } catch (Exception ex) {
                   LOGGER.throwing(ThreadDumpView.class.getName(), "loadThreadDump", ex);     // NOI18N
                 }
-              } catch (FileNotFoundException ex) {
+              } catch (IOException ex) {
                 LOGGER.log(Level.INFO, "Failed to load thread dump", ex);       // NOI18N
-              } finally {
-                  if (is != null) {
-                      try {
-                          is.close();
-                      } catch (IOException e) {
-                          // ignore
-                      }
-                  }
               }
            }
           });
diff -pruN 2.1.10-1/visualvm/tools/manifest.mf 2.2-1/visualvm/tools/manifest.mf
--- 2.1.10-1/visualvm/tools/manifest.mf	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/tools/manifest.mf	2025-04-17 09:07:34.000000000 +0000
@@ -3,5 +3,5 @@ AutoUpdate-Show-In-Client: false
 AutoUpdate-Essential-Module: true
 OpenIDE-Module: org.graalvm.visualvm.tools/2
 OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/tools/Bundle.properties
-OpenIDE-Module-Specification-Version: 2.3
+OpenIDE-Module-Specification-Version: 2.4
 
diff -pruN 2.1.10-1/visualvm/tools/src/org/graalvm/visualvm/tools/jmx/JmxModel.java 2.2-1/visualvm/tools/src/org/graalvm/visualvm/tools/jmx/JmxModel.java
--- 2.1.10-1/visualvm/tools/src/org/graalvm/visualvm/tools/jmx/JmxModel.java	2024-09-11 13:00:08.000000000 +0000
+++ 2.2-1/visualvm/tools/src/org/graalvm/visualvm/tools/jmx/JmxModel.java	2025-04-17 09:07:34.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -160,6 +160,17 @@ public abstract class JmxModel extends M
     public abstract JMXServiceURL getJMXServiceURL();
 
     /**
+     * <p>Method for obtaining the {@link JvmMXBeans} for
+     * the given {@link JmxModel}.</p>
+     *
+     * @return a {@link JvmMXBeans} instance containing the MXBean
+     * proxies for the Java platform MXBeans backed by the supplied
+     * {@link JmxModel}. No MBean caching is applied on the supplied
+     * {@link JmxModel}.
+     */
+    public abstract JvmMXBeans getJvmMXBeans();
+
+    /**
      * Returns the current system properties in the target Application.
      *
      * <p> This method returns the system properties in the target virtual
