Freeze Report 87427258
Metadata
| Field |
Value |
| Report ID |
87427258 |
| Duration |
30 seconds |
| Product |
IntelliJ IDEA 2026.1 (IU-261.22158.277) |
| OS |
Windows 11 x86_64 |
| Java |
25.0.2+1-b329.72 (JetBrains) |
| Report Date |
2026-04-09 |
| Channel |
release |
| Sampled Time |
23900ms |
| GC Time |
175ms (0%) |
| CPU Load |
20% |
| Attachments |
dump-2.txt |
Messages
- Freeze for 30 seconds
- Sampled time: 23900ms, sampling rate: 100ms, GC time: 175ms (0%), Class loading: 0%, CPU load: 20%
- The stack is from the thread that was blocking EDT
Analysis
Cause
The EDT is BLOCKED (Java monitor) on a VFS directory data lock (VfsData$DirectoryData) owned by a background
thread. The background thread holds the VFS directory lock while waiting for disk IO (
DiskQueryRelay.accessDiskWithCheckCanceled → ArchiveFileSystem.getAttributes). Both threads are executing
HProjectUtils.isClassAvailableInLibraries → VirtualDirectoryImpl.findChild.
Threads Participating
EDT (---------- EDT:):
- State:
BLOCKED — waiting on com.intellij.openapi.vfs.newvfs.impl.VfsData$DirectoryData@2a0f182a owned by
"DefaultDispatcher-worker-8"
- Executing:
JmixRunManagerListener.runConfigurationAdded → JmixUtils.isJmixProject →
HProjectUtils.isClassAvailableInLibraries → ReadAction.compute → VirtualDirectoryImpl.findChild →
VirtualDirectoryImpl.findInPersistence ← BLOCKED here
- Context: invoked via
ActionsKt.invokeLater on the EDT inside TransactionGuardImpl.runWithWritingAllowed
Blocking thread ("DefaultDispatcher-worker-8"):
- Same call path:
JmixAiToolWindowFactory.shouldBeAvailable → JmixUtils.checkJmixProject →
HProjectUtils.isClassAvailableInLibraries → ReadAction.compute → VirtualDirectoryImpl.findChild →
VirtualDirectoryImpl.findInPersistence
- Holds the VFS
DirectoryData lock while awaiting: PersistentFSImpl.findChildInfo →
ArchiveFileSystem.getAttributes → DiskQueryRelay.accessDiskWithCheckCanceled → FutureTask.get (waiting for disk
IO)
Root Cause Frame
HProjectUtils.isClassAvailableInLibraries (ReadAction.compute — non-cancellable)
→ LibraryUtil.isClassAvailableInLibrary → LibraryUtil.findInFile
→ VirtualDirectoryImpl.findChild → VirtualDirectoryImpl.findInPersistence ← EDT BLOCKED here
(background thread holds DirectoryData lock)
Background thread holds DirectoryData lock while:
PersistentFSImpl.findChildInfo → ArchiveFileSystem.getAttributes
→ DiskQueryRelay.accessDiskWithCheckCanceled → FutureTask.get ← waiting for disk IO
Problematic Plugin
Jmix Studio (io.jmix.studio / com.haulmont.jmixstudio)
HProjectUtils.isClassAvailableInLibraries is called both from JmixAiToolWindowFactory.shouldBeAvailable (background
coroutine at project open) and from JmixRunManagerListener.runConfigurationAdded (EDT via invokeLater). Both calls
use ReadAction.compute and access VirtualDirectoryImpl.findChild. When the background thread holds the VFS
DirectoryData lock while waiting for archive attribute IO, the EDT’s own findChild call blocks on the same Java
monitor — causing the freeze.
The presence of DiskQueryRelay in the background thread indicates the IO is already properly delegated, but the VFS
directory lock is still held during the async wait, which causes the EDT contention.
Fix
- Do not call
HProjectUtils.isClassAvailableInLibraries (or any VFS access) from the EDT; defer to a background thread
via ReadAction.nonBlocking()
-
JmixRunManagerListener.runConfigurationAdded should not invoke Jmix project checks synchronously on the EDT; use
AppUIExecutor.onUiThread().inSmartMode() or a coroutine-based approach
- The
DiskQueryRelay approach in ArchiveFileSystem is appropriate for background threads, but the outer VFS
directory lock must not be held during the IO wait — this requires fixing VFS internals or avoiding archive-backed
library lookups in findChild paths called from EDT