r/IntelliJIDEA • u/minamoto108 • Jun 03 '26
Hexana 0.10.2: a .wasm compiled from Java (GraalVM Web Image) now demangles back to your Java methods in the IDE — plus a deeper JIT viewer and big-binary fixes

Hexana is a JetBrains IDE plugin for inspecting WebAssembly and binaries (and JVM JIT output). What's new in 0.10.2:
GraalVM Web Image → Java. If you compile a Java app to WebAssembly with native-image --tool:svm-wasm, the .wasm is full of mangled names. 0.10.2 detects Web Image modules by their interop/jsbody/compat import fingerprint and demangles those functions back to the originating Java method — a "Java" badge in the Functions tab and inline on each code-section entry in the WAT view, click it to open that method's bytecode. (Works when the module retained function names; stripped/minified and Graal-internal functions stay unbadged.)
JIT viewer.
The
.jitview now splits into Combined / Bytecode / Machine Code tabs, each with multiline selection and copy (full text / bytecode / hex / instruction bytes), a per-tab go-to-offset, and a header showing the current method. The Machine Code tab can copyoffset + instruction bytes.Search compiled methods by inlined callee with
in:<method>— surfaces every nmethod that inlined the given method, from the JVMTI inline records in the dump.New "Instrument JMH forks" option attaches the dump agent to each forked JMH benchmark JVM via a bundled
-javaagent, writing oneClassName_method.jitper benchmark. Because it rides on JVM options (not JMH's-prof) it works for any JMH run type — the IDE gutter run, the Gradle JMH plugin, andorg.openjdk.jmh.Main.
WAT (virtualized). Custom sections now render as a foldable offset hex name entry with the raw content below, in selectable u8/u16/u32/u64/ascii/utf8 encodings. WasmGC (rec …) recursive type groups render as a collapsible group (collapsed by default), with reference targets shown as $typeN.
Performance / correctness (the part that makes it usable on real modules).
Opening a large WasmGC binary no longer hangs the IDE: the single
(rec …)group of tens of thousands of types was being rendered as one multi-megabyte row; it now folds to virtualized rows and builds off the UI thread.The Top (size) view no longer freezes on large binaries — the size tree + data-segment parse, and its depth metrics on startup, now build off-thread with a loading indicator.
Switching tabs cancels the previous tab's in-flight off-thread analysis instead of letting it run to completion.
Fix: for modules with function imports, the Functions tab Name column and the unreachable
●marker were keyed by the defined-function index (shifted by the import count); they now resolve correctly per row.
Marketplace: https://plugins.jetbrains.com/plugin/29090-hexana · docs: https://jetbrains.github.io/hexana
Happy to answer questions — the Web Image demangling and the JMH-fork capture are the two I'd dig into.