Giter VIP home page Giter VIP logo

ideajol's Introduction

Java Object Layout (JOL) plugin for IntelliJ Idea

JOL (Java Object Layout) is the tool to analyze object layout schemes in JVMs. For example, in HotSpot VM on 64x processor an empty string takes 40 bytes i.e. 24 bytes for String object itself + 16 bytes for an internal empty char array.

The plugin is a GUI for JOL and allows you to make an estimate how much memory the object takes.

Set a cursor into a class name and then press Code / Show Object Layout and you'll see a right panel with layout info.

screenshot.png

Thus, you can perform simplest but most efficient performance improvements. Just check your DTOs if they fit into 64 bytes of processor's cache line.

Only HotSpot VM is supported by JOL itself. The plugin supports only basic estimate of class layout in different VM modes i.e. the same as jol-cli estimates command. For more precise estimate use JOL library and estimate in run time on the real objects with GraphLayout:

import org.openjdk.jol.info.GraphLayout;
import java.util.HashMap;

public class JolTest {

    public static void main(String[] args) {
        HashMap<Object, Object> hashMap = new HashMap<>();
        hashMap.put("key", "value");
        System.out.println(GraphLayout.parseInstance(hashMap).toFootprint());
    }
}

Output will be like:

java.util.HashMap@7a79be86d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         2        24        48   [B
         1        80        80   [Ljava.util.HashMap$Node;
         2        24        48   java.lang.String
         1        48        48   java.util.HashMap
         1        32        32   java.util.HashMap$Node
         7                 256   (total)

So you can see the full size including inner objects.

NOTE: Your app most likely will use the HotSpot with 64-bit VM, compressed references mode.

Installation

  • Using IDE built-in plugin system:

    Settings/Preferences > Plugins > Marketplace > Search for "JOL" > Install Plugin

  • Manually:

    Download the latest release and install it manually using Settings/Preferences > Plugins > โš™๏ธ > Install plugin from disk...

Inspection

The plugin provides an inspection to see most big classes. It's enabled by default. You can find the inspection by path Java | Memory | JOL: Class has too big memory footprint to configure or disable it.

Please rank the Plugin to make it more searchable.

Related projects

Heap dump *.hprof files analysers:

ideajol's People

Contributors

alllex avatar maxmedvedev avatar stokito avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ideajol's Issues

Select a class by search

It would be nice to put a button "Find a class" and on click show class search and after selecting show a layout for the class. This allows to make a quick lookup of interesting class without navigating to it in source code editor

StackOverflowError caused by non-compiling superclass recursion in source code

StackOverflowError occurs when typing source code and a "superclass recursion" is typed, see example below.

class Buffer extends Buffer {

}

Of course very rare to actually happen, but you may want to create an (optionally inner) class Buffer and have it extend my.project.Buffer by first typing Buffer and then autocompleting the fully qualified name, in that short moment before autocompleting the IDE complains about the Plugin crashing. It's just reporting that the plugin crashed and you experience a short lag spike but otherwise does not disrupt your work much if at all.

Thought I'd still report it even if the impact is very little :) Like your plugin!

java.lang.StackOverflowError
	at com.intellij.psi.impl.source.PsiFileImpl.getStubTree(PsiFileImpl.java:618)
	at com.intellij.psi.impl.source.PsiFileImpl.getGreenStubTree(PsiFileImpl.java:952)
	at com.intellij.psi.impl.source.SpineRef.getGreenStub(SpineRef.java:39)
	at com.intellij.extapi.psi.StubBasedPsiElementBase.getGreenStub(StubBasedPsiElementBase.java:352)
	at com.intellij.psi.impl.source.PsiClassImpl.isAnnotationType(PsiClassImpl.java:426)
	at com.intellij.psi.impl.PsiClassImplUtil.getExtendsListTypes(PsiClassImplUtil.java:937)
	at com.intellij.psi.impl.source.PsiClassImpl.getExtendsListTypes(PsiClassImpl.java:185)
	at com.intellij.psi.impl.PsiClassImplUtil.getSuperClass(PsiClassImplUtil.java:711)
	at com.intellij.psi.impl.source.PsiClassImpl.getSuperClass(PsiClassImpl.java:200)
	at org.jetbrains.uast.UClass$DefaultImpls.getSuperClass(UClass.kt:36)
	at org.jetbrains.uast.java.AbstractJavaUClass.getSuperClass(JavaUClass.kt:9)
	at org.jetbrains.uast.java.JavaUClass.getSuperClass(JavaUClass.kt:51)
	at org.jetbrains.uast.java.JavaUClass.getSuperClass(JavaUClass.kt:46)
	at com.github.stokito.IdeaJol.PsiClassAdapter.createClassDataFromPsiClass(PsiClassAdapter.java:19)
	at com.github.stokito.IdeaJol.PsiClassAdapter.createClassDataFromPsiClass(PsiClassAdapter.java:20)
	at com.github.stokito.IdeaJol.PsiClassAdapter.createClassDataFromPsiClass(PsiClassAdapter.java:20)
	at com.github.stokito.IdeaJol.PsiClassAdapter.createClassDataFromPsiClass(PsiClassAdapter.java:20)
	[...]

Support for other JVM languages

As mentioned #16 we can try to parse raw bytecode of already compiled class but also we can use other's language Psi tree to investigate. Also it might be interesting because other JMV lang can add it's own footprint (Groovy, Closure, Scala, JRuby).

Use different colors in a table

We can show gaps as red row, long fields as yellow, show cache line limit or something like that - to make it more visualizable.

Explanation For Hotspot Options

image

There are a lot of options, and I couldn't find an answer on what some of it means on the internet.

What is >= 8 or >= 15 I would guess that this would be the Java version but that is not clear since there is no J or Java (Could be entirely wrong).

What is COOPS and CCPS and 16-byte align?

And for Lilliput I could find an answer online and it is remarkably interesting and makes me excited for the future of Java.

Hope you can help me, it would be interesting to add a link to your answer in the plugin somewhere even.

NPE

java.lang.NullPointerException
	at org.openjdk.jol.info.ClassData.fieldsFor(ClassData.java:256)
	at org.openjdk.jol.info.ClassData.ownFields(ClassData.java:221)
	at org.openjdk.jol.layouters.HotSpotLayouter.layout(HotSpotLayouter.java:138)
	at com.github.stokito.IdeaJol.inspection.JolInspection.checkClass(JolInspection.java:50)
	at com.intellij.codeInspection.AbstractBaseUastLocalInspectionTool$1.visitClass(AbstractBaseUastLocalInspectionTool.java:75)
	at org.jetbrains.uast.UClass$DefaultImpls.accept(UClass.kt:71)
	at org.jetbrains.uast.java.AbstractJavaUClass.accept(JavaUClass.kt:23)
	at com.intellij.uast.UastHintedVisitorAdapter.visitElement(UastHintedVisitorAdapter.kt:21)
	at com.intellij.psi.impl.source.PsiClassImpl.accept(PsiClassImpl.java:472)
	at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:75)

IDE freeze with invalid source code causing superclass recursion

Complete IDE freeze when typing source code and a "superclass recursion" is typed (see example below) and one would right-click -> Show Object Layout. Happened while testing for #29. However as it is invalid source code and noone would actually do this action in normal use feel free to just ignore :)

class Buffer extends Buffer {

}

Thread dump (filtered):

"AWT-EventQueue-0" #30 prio=6 os_prio=0 cpu=42602.66ms elapsed=173.77s tid=0x00007fe06c11a000 nid=0x8c45 runnable  [0x00007fe02c7c0000]
   java.lang.Thread.State: RUNNABLE
        at com.intellij.reference.SoftReference.deref(SoftReference.java:56)
        at com.intellij.psi.impl.source.FileTrees.derefTreeElement(FileTrees.java:71)
        at com.intellij.psi.impl.source.PsiFileImpl.derefTreeElement(PsiFileImpl.java:115)
        at com.intellij.psi.impl.source.PsiFileImpl.getTreeElement(PsiFileImpl.java:104)
        at com.intellij.psi.impl.source.PsiFileImpl.getStubTree(PsiFileImpl.java:618)
        at com.intellij.psi.impl.source.PsiFileImpl.getGreenStubTree(PsiFileImpl.java:952)
        at com.intellij.psi.impl.source.SpineRef.getGreenStub(SpineRef.java:39)
        at com.intellij.extapi.psi.StubBasedPsiElementBase.getGreenStub(StubBasedPsiElementBase.java:352)
        at com.intellij.psi.impl.source.PsiClassImpl.isInterface(PsiClassImpl.java:415)
        at com.intellij.psi.impl.PsiClassImplUtil.getSuperClass(PsiClassImplUtil.java:692)
        at com.intellij.psi.impl.source.PsiClassImpl.getSuperClass(PsiClassImpl.java:200)
        at com.github.stokito.IdeaJol.PsiClassAdapter.addClassFields(PsiClassAdapter.java:41)
        at com.github.stokito.IdeaJol.PsiClassAdapter.createClassDataFromPsiClass(PsiClassAdapter.java:23)
        at com.github.stokito.IdeaJol.toolwindow.JolView.calcClassLayout(JolView.java:242)
        at com.github.stokito.IdeaJol.toolwindow.JolView.showLayoutForSelectedClass(JolView.java:93)
        at com.github.stokito.IdeaJol.toolwindow.JolView.showLayoutForClass(JolView.java:79)
        at com.github.stokito.IdeaJol.toolwindow.JolView.showJolToolWindow(JolView.java:253)
        at com.github.stokito.IdeaJol.ShowObjectLayoutAction.actionPerformed(ShowObjectLayoutAction.java:33)
        at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAware$5(ActionUtil.java:273)
        at com.intellij.openapi.actionSystem.ex.ActionUtil$$Lambda$3019/0x0000000102141040.run(Unknown Source)
        at com.intellij.util.SlowOperations.lambda$allowSlowOperations$0(SlowOperations.java:77)
        at com.intellij.util.SlowOperations$$Lambda$1508/0x00000001015f7840.compute(Unknown Source)
        at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:64)
        at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:76)
        at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:273)
        at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:310)
        at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter$$Lambda$5464/0x00000001030c6440.run(Unknown Source)
        at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:286)
        at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
        at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:299)
        at javax.swing.AbstractButton.fireActionPerformed(java.desktop@11.0.11/AbstractButton.java:1967)
        at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:110)
        at com.intellij.openapi.actionSystem.impl.ActionMenuItem$$Lambda$5461/0x00000001030c7840.run(Unknown Source)
        at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:95)
        at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:110)
        at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:515)
        at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:545)
        at java.awt.Component.processMouseEvent(java.desktop@11.0.11/Component.java:6652)
        at javax.swing.JComponent.processMouseEvent(java.desktop@11.0.11/JComponent.java:3345)
        at java.awt.Component.processEvent(java.desktop@11.0.11/Component.java:6417)
        at java.awt.Container.processEvent(java.desktop@11.0.11/Container.java:2263)
        at java.awt.Component.dispatchEventImpl(java.desktop@11.0.11/Component.java:5027)
        at java.awt.Container.dispatchEventImpl(java.desktop@11.0.11/Container.java:2321)
        at java.awt.Component.dispatchEvent(java.desktop@11.0.11/Component.java:4859)
        at java.awt.LightweightDispatcher.retargetMouseEvent(java.desktop@11.0.11/Container.java:4918)
        at java.awt.LightweightDispatcher.processMouseEvent(java.desktop@11.0.11/Container.java:4547)
        at java.awt.LightweightDispatcher.dispatchEvent(java.desktop@11.0.11/Container.java:4488)
        at java.awt.Container.dispatchEventImpl(java.desktop@11.0.11/Container.java:2307)
        at java.awt.Window.dispatchEventImpl(java.desktop@11.0.11/Window.java:2784)
        at java.awt.Component.dispatchEvent(java.desktop@11.0.11/Component.java:4859)
        at java.awt.EventQueue.dispatchEventImpl(java.desktop@11.0.11/EventQueue.java:778)
        at java.awt.EventQueue$4.run(java.desktop@11.0.11/EventQueue.java:727)
        at java.awt.EventQueue$4.run(java.desktop@11.0.11/EventQueue.java:721)
        at java.security.AccessController.doPrivileged(java.base@11.0.11/Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@11.0.11/ProtectionDomain.java:85)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@11.0.11/ProtectionDomain.java:95)
        at java.awt.EventQueue$5.run(java.desktop@11.0.11/EventQueue.java:751)
        at java.awt.EventQueue$5.run(java.desktop@11.0.11/EventQueue.java:749)
        at java.security.AccessController.doPrivileged(java.base@11.0.11/Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@11.0.11/ProtectionDomain.java:85)
        at java.awt.EventQueue.dispatchEvent(java.desktop@11.0.11/EventQueue.java:748)
        at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)
        at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:906)
        at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:836)
        at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)
        at com.intellij.ide.IdeEventQueue$$Lambda$417/0x00000001006b3c40.compute(Unknown Source)
        at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
        at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
        at com.intellij.ide.IdeEventQueue$$Lambda$416/0x00000001006b4c40.run(Unknown Source)
        at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
        at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop@11.0.11/EventDispatchThread.java:203)
        at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop@11.0.11/EventDispatchThread.java:124)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop@11.0.11/EventDispatchThread.java:113)
        at java.awt.EventDispatchThread.pumpEvents(java.desktop@11.0.11/EventDispatchThread.java:109)
        at java.awt.EventDispatchThread.pumpEvents(java.desktop@11.0.11/EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.run(java.desktop@11.0.11/EventDispatchThread.java:90)

   Locked ownable synchronizers:
        - None

"JobScheduler FJ pool 4/7" #67 daemon prio=4 os_prio=0 cpu=1838.61ms elapsed=161.61s tid=0x00007fdfe4004000 nid=0x8ca3 runnable  [0x00007fdf76da4000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.11/Native Method)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.11/LockSupport.java:357)
        at com.intellij.openapi.progress.impl.CoreProgressManager.sleepIfNeededToGivePriorityToAnotherThread(CoreProgressManager.java:862)
        at com.intellij.openapi.progress.impl.ProgressManagerImpl.lambda$new$0(ProgressManagerImpl.java:32)
        at com.intellij.openapi.progress.impl.ProgressManagerImpl$$Lambda$361/0x0000000100645440.runHook(Unknown Source)
        at com.intellij.openapi.progress.impl.CoreProgressManager.runCheckCanceledHooks(CoreProgressManager.java:122)
        at com.intellij.openapi.progress.impl.CoreProgressManager.doCheckCanceled(CoreProgressManager.java:137)
        at com.intellij.openapi.progress.ProgressManager.checkCanceled(ProgressManager.java:230)
        at com.intellij.openapi.progress.ProgressIndicatorProvider.checkCanceled(ProgressIndicatorProvider.java:39)
        at com.intellij.extapi.psi.StubBasedPsiElementBase.getGreenStub(StubBasedPsiElementBase.java:350)
        at com.intellij.psi.impl.source.PsiClassImpl.isEnum(PsiClassImpl.java:436)
        at com.intellij.psi.impl.PsiClassImplUtil.getExtendsListTypes(PsiClassImplUtil.java:925)
        at com.intellij.psi.impl.source.PsiClassImpl.getExtendsListTypes(PsiClassImpl.java:185)
        at com.intellij.psi.impl.PsiClassImplUtil.getSuperClass(PsiClassImplUtil.java:711)
        at com.intellij.psi.impl.source.PsiClassImpl.getSuperClass(PsiClassImpl.java:200)
        at org.jetbrains.uast.UClass$DefaultImpls.getSuperClass(UClass.kt:36)
        at org.jetbrains.uast.java.AbstractJavaUClass.getSuperClass(JavaUClass.kt:9)
        at org.jetbrains.uast.java.JavaUClass.getSuperClass(JavaUClass.kt:51)
        at org.jetbrains.uast.java.JavaUClass.getSuperClass(JavaUClass.kt:46)
        at com.github.stokito.IdeaJol.PsiClassAdapter.addClassFields(PsiClassAdapter.java:41)
        at com.github.stokito.IdeaJol.PsiClassAdapter.createClassDataFromPsiClass(PsiClassAdapter.java:23)
        at com.github.stokito.IdeaJol.inspection.JolInspection.checkClass(JolInspection.java:72)
        at com.intellij.codeInspection.AbstractBaseUastLocalInspectionTool$1.visitClass(AbstractBaseUastLocalInspectionTool.java:72)
        at org.jetbrains.uast.UClass$DefaultImpls.accept(UClass.kt:84)
        at org.jetbrains.uast.java.AbstractJavaUClass.accept(JavaUClass.kt:9)
        at com.intellij.uast.UastHintedVisitorAdapter.visitElement(UastHintedVisitorAdapter.kt:21)
        at com.intellij.psi.impl.source.PsiClassImpl.accept(PsiClassImpl.java:462)
        at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:65)
        at com.intellij.codeInspection.InspectionEngine.createVisitorAndAcceptElements(InspectionEngine.java:56)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.runToolOnElements(LocalInspectionsPass.java:320)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitPriorityElementsAndInit$4(LocalInspectionsPass.java:279)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$4471/0x000000010291a040.compute(Unknown Source)
        at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:161)
        at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:153)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitPriorityElementsAndInit$5(LocalInspectionsPass.java:277)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$4466/0x00000001028f1040.compute(Unknown Source)
        at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:132)
        at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:121)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitPriorityElementsAndInit$6(LocalInspectionsPass.java:277)
        at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$4464/0x00000001028f3440.process(Unknown Source)
        at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:136)
        at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:149)
        at com.intellij.concurrency.ApplierCompleter$$Lambda$3943/0x0000000102626840.run(Unknown Source)
        at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1096)
        at com.intellij.concurrency.ApplierCompleter.lambda$wrapInReadActionAndIndicator$1(ApplierCompleter.java:92)
        at com.intellij.concurrency.ApplierCompleter$$Lambda$3879/0x00000001025a8c40.run(Unknown Source)
        at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:688)
        at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:634)
        at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:64)
        at com.intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:104)
        at com.intellij.concurrency.ApplierCompleter.lambda$compute$0(ApplierCompleter.java:83)
        at com.intellij.concurrency.ApplierCompleter$$Lambda$3942/0x0000000102627440.run(Unknown Source)
        at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:167)
        at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:178)
        at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:83)
        at java.util.concurrent.CountedCompleter.exec(java.base@11.0.11/CountedCompleter.java:746)
        at java.util.concurrent.ForkJoinTask.doExec(java.base@11.0.11/ForkJoinTask.java:290)
        at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(java.base@11.0.11/ForkJoinPool.java:1020)
        at java.util.concurrent.ForkJoinPool.scan(java.base@11.0.11/ForkJoinPool.java:1656)
        at java.util.concurrent.ForkJoinPool.runWorker(java.base@11.0.11/ForkJoinPool.java:1594)
        at java.util.concurrent.ForkJoinWorkerThread.run(java.base@11.0.11/ForkJoinWorkerThread.java:183)

   Locked ownable synchronizers:
        - None

Kotlin support works, but not as described

The General Usage Instructions state:

Set a cursor into a class name and then press Code / Show Object Layout and you'll see a right panel with layout info.

This does not work with a Kotlin class. When placing the cursor into a class name, the menu Code / Show Object Layout is greyed out.

This works:

  1. Place the cursor into a class name.
  2. Select Navigate / Type Hierarchy (shortcut: Ctrl+H).
  3. Select Code / Show Object Layout.

MOAR LAYOUTS!!11

JOL supports three layouts: Raw, HotSpot and Current. Current is very useful in run-time but for static analyze we can't use use it. But it will be interesting to see the layout for those VM, especially for OpenJ9 and JamVM.
I asked about OpenJ9 layout on SO but it looks like I should investigate this myself

Backport for older IntelliJ

v1.3.0 of the plugin supported ancient IntelliJ but v1.5.0 supports only build 182 because I din't make any test on previous IntelliJ version.
To support more users we need to test the plugin on previous IntelliJ versions.

"Navigate to Source" button

ATM when you click on class name label you'll be navigated to the class in editor. This is unclear and we need for another button with the same icon as in project view.

Show object layout of live object in debug window

This plugin is useless because it shows a layout of class itself while real size of object may vary because of inner objects.
So we need a support of GraphLayout.parseIncance() and since we can't create an object the easiest way will be to parse it from a debug window. Also this allows users to see a layout of real life object in running application.

support for lombok

when I use lombok , this plugin not show anything. 'Code | show Object layout' is disabled.

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

Analyze raw bytecode of class file

This is exactly how JOL works but currently plugin uses PsiTree instead. Analyzing a bytecode can allow to investigate classes compiled by other JVM languages. But actually IntelliJ can parse them for us and give a Psi so it worth to invertigate

'com.github.stokito.IdeaJol.ShowObjectLayoutAction' must override `getActionUpdateThread` and chose EDT or BGT. BGT is prefferable

com.intellij.diagnostic.PluginException: `ActionUpdateThread.OLD_EDT` is deprecated and going to be removed soon. 'com.github.stokito.IdeaJol.ShowObjectLayoutAction' must override `getActionUpdateThread` and chose EDT or BGT. See ActionUpdateThread javadoc. [Plugin: JOL]
	at com.intellij.diagnostic.PluginProblemReporterImpl.createPluginExceptionByClass(PluginProblemReporterImpl.java:23)
	at com.intellij.diagnostic.PluginException.createByClass(PluginException.java:90)
	at com.intellij.diagnostic.PluginException.reportDeprecatedUsage(PluginException.java:125)
	at com.intellij.openapi.actionSystem.ActionUpdateThreadAware.getActionUpdateThread(ActionUpdateThreadAware.java:21)
	at com.intellij.openapi.actionSystem.AnAction.getActionUpdateThread(AnAction.java:198)

Regression: Inspection "Class has too big memory footprint" ignored suffixes are not editable

The Inspection "Class has too big memory footprint" has a List of ignored suffixes which can no longer be removed or new ones added. The +/- buttons don't do anything, no error displayed. Probably broke with the latest update, I remember using this feature a month ago or so successfully.

IntelliJ IDEA 2021.1.2 (Ultimate Edition)
Build #IU-211.7442.40, built on June 1, 2021
Runtime version: 11.0.11+9-b1341.57 amd64
VM: Dynamic Code Evolution 64-Bit Server VM by JetBrains s.r.o.
Linux 5.11.0-18-generic
GC: ParNew, ConcurrentMarkSweep
Memory: 1981M
Cores: 8
Registry: documentation.show.toolbar=true, external.system.auto.import.disabled=true
Non-Bundled Plugins: GLSL (1.19), com.intellij.nativeDebug (211.7442.9), mobi.hsz.idea.gitignore (4.1.0), org.toml.lang (0.2.147.3871-211), ASM Bytecode Viewer (7.2), JOL (1.9.1), jclasslib (5.7), Pythonid (211.7442.45), org.rust.lang (0.4.147.3871-211)
Kotlin: 211-1.4.32-release-IJ7442.2
Current Desktop: KDE

Inspections

The plugin can provide some inspections but I'm not sure which one.
I have the only one idea: to inspect object which layout is bigger than a cache line i.e. 64 bytes.
But here occurs a problem with configuration:

  1. Which layout should be used? This should be configurable somehow.
  2. Should we inspect all classes or a simplest DTO's? For example it's ok to have a big object for a Controller class because anyway it's a singleton.
  3. Should we inspect platform and dependencies classes or only app code? It's a good thing to notify a user that it uses a class from library which have a big footprint.

I should ask in JOL dev list which inspections are possible.

Support for other languages: Go and C

Minimize size of jol-core

We use only few classes from jol-core so probably we can strip unused classes.
This can be done on build or we can created more lightweight jol artifact.

Plugin broken with IntelliJ IDEA 2023.1 Beta

Trying to open the object layout with the current IntelliJ IDEA 2023.1 Beta (Ultimate Edition) leads to the following error. No layout will be shown.

Unable to generate layout

java.lang.NullPointerException: Cannot invoke "java.net.URL.toExternalForm()" because "location" is null
	at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:234)
	at com.github.stokito.IdeaJol.toolwindow.JolForm.$$$setupUI$$$(JolForm.java)
	at com.github.stokito.IdeaJol.toolwindow.JolForm.<init>(JolForm.java:9)
	at com.github.stokito.IdeaJol.toolwindow.JolView.<init>(JolView.java:51)
	at com.github.stokito.IdeaJol.toolwindow.JolToolWindowFactory.createToolWindowContent(JolToolWindowFactory.java:13)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.createContentIfNeeded(ToolWindowImpl.kt:548)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.getContentManager(ToolWindowImpl.kt:421)
	at com.github.stokito.IdeaJol.toolwindow.JolView.showJolToolWindow(JolView.java:256)
	at com.github.stokito.IdeaJol.ShowObjectLayoutAction.actionPerformed(ShowObjectLayoutAction.java:37)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.doPerformActionOrShowPopup(ActionUtil.java:333)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAwareWithCallbacks$4(ActionUtil.java:307)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareWithCallbacks(ActionUtil.java:356)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAwareWithCallbacks(ActionUtil.java:307)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$performAction$5(ActionMenuItem.java:299)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:225)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.performAction(ActionMenuItem.java:292)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$new$0(ActionMenuItem.java:67)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$4(ActionMenuItem.java:114)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:105)
	at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:114)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:526)
	at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:558)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6656)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3385)
	at java.desktop/java.awt.Component.processEvent(Component.java:6421)
	at java.desktop/java.awt.Container.processEvent(Container.java:2266)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4854)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2804)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4854)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:790)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:731)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:763)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:761)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:760)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:666)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.kt:614)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:569)
	at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:68)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:348)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:787)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:348)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:343)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:994)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:113)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:994)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$4(IdeEventQueue.kt:343)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:385)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Exception when apply a fix

WARN - #com.github.stokito.IdeaJol.toolwindow.JolView - Unable to generate layout
com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments: EventQueue.isDispatchThread()=false
Current thread: Thread[ApplicationImpl pooled thread,main]
SystemEventQueueThread: Thread[AWT-EventQueue-0,main]
	at com.intellij.openapi.application.impl.ApplicationImpl.throwThreadAccessException(ApplicationImpl.java:1042)
	at com.intellij.openapi.application.impl.ApplicationImpl.assertIsDispatchThread(ApplicationImpl.java:1025)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.activateToolWindow(ToolWindowManagerImpl.kt:617)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.activateToolWindow$default(ToolWindowManagerImpl.kt:616)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.activate(ToolWindowImpl.kt:253)
	at com.intellij.openapi.wm.ToolWindow.activate(ToolWindow.java:43)
	at com.github.stokito.IdeaJol.toolwindow.JolView.showJolToolWindow(JolView.java:262)
	at com.github.stokito.IdeaJol.inspection.ShowJolQuickFix.applyFix(ShowJolQuickFix.java:24)
	at com.github.stokito.IdeaJol.inspection.ShowJolQuickFix.applyFix(ShowJolQuickFix.java:11)
	at com.intellij.codeInspection.LocalQuickFix.generatePreview(LocalQuickFix.java:99)
	at com.intellij.codeInspection.ex.QuickFixWrapper.generatePreview(QuickFixWrapper.java:135)

I have no idea how to fix it

PSI element adapter to JOL's CalssData

Currently to perform an analyze the plugin creates a new ClassData from the PsiClass and this operation can be time consuming. Maybe we can just create a light adapter which hold the PsiClass but implement interface of ClassData.

java.lang.NullPointerException

on a simple class

  public static class ListNode {
    int val;
    ListNode next;

    ListNode(int x) { val = x; }
  }

exception occured

java.lang.NullPointerException
	at org.openjdk.jol.info.ClassData.fieldsFor(ClassData.java:252)
	at org.openjdk.jol.info.ClassData.ownFields(ClassData.java:222)
	at org.openjdk.jol.layouters.HotSpotLayouter.layout(HotSpotLayouter.java:138)
	at com.github.stokito.IdeaJol.JolInspection.checkClass(JolInspection.java:42)
	at com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool$1.visitClass(AbstractBaseJavaLocalInspectionTool.java:60)
	at com.intellij.psi.impl.source.PsiClassImpl.accept(PsiClassImpl.java:469)
	at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:75)
	at com.intellij.codeInspection.InspectionEngine.createVisitorAndAcceptElements(InspectionEngine.java:63)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.runToolOnElements(LocalInspectionsPass.java:295)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$5(LocalInspectionsPass.java:263)
	at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:156)
	at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:148)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$6(LocalInspectionsPass.java:260)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:127)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:116)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitPriorityElementsAndInit$7(LocalInspectionsPass.java:260)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:133)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1166)
	at com.intellij.concurrency.ApplierCompleter.lambda$wrapInReadActionAndIndicator$1(ApplierCompleter.java:105)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:586)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:532)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:86)
	at com.intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:116)
	at com.intellij.concurrency.ApplierCompleter.lambda$compute$0(ApplierCompleter.java:96)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:164)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:218)
	at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:96)
	at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
``

Assertion failed: Write access is allowed inside write-action only

When generating it shows the following error in log:

java.lang.Throwable: Assertion failed: Write access is allowed inside write-action only (see com.intellij.openapi.application.Application.runWriteAction())
	at com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:163)
	at com.intellij.openapi.application.impl.ApplicationImpl.assertWriteAccessAllowed(ApplicationImpl.java:1329)
	at com.intellij.openapi.editor.impl.DocumentImpl.assertWriteAccess(DocumentImpl.java:664)
	at com.intellij.openapi.editor.impl.DocumentImpl.replaceString(DocumentImpl.java:596)
	at com.intellij.openapi.editor.impl.DocumentImpl.lambda$setText$3(DocumentImpl.java:1051)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:139)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:97)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:87)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:73)
	at com.intellij.openapi.editor.impl.DocumentImpl.setText(DocumentImpl.java:1056)
	at com.github.stokito.IdeaJol.JolView.setOutput(JolView.java:66)
	at com.github.stokito.IdeaJol.ShowObjectLayoutAction.actionPerformed(ShowObjectLayoutAction.java:51)
	at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:220)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:237)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:304)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:307)
	at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:106)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:294)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:114)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:88)
	at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:111)
	at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:120)
	at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:122)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:114)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:529)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:49)
	at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:549)
	at java.awt.Component.processMouseEvent(Component.java:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:781)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:718)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

I'll not fix that because is scope of #1 we'll get rid off the document

JOL plugin keeps reporting this error

I'm not sure but I believe this is related to editing a kotlin file.

java.lang.AssertionError
	at org.openjdk.jol.info.ClassData.fieldsFor(ClassData.java:249)
	at org.openjdk.jol.info.ClassData.ownFields(ClassData.java:221)
	at org.openjdk.jol.layouters.HotSpotLayouter.layout(HotSpotLayouter.java:138)
	at com.github.stokito.IdeaJol.inspection.JolInspection.checkClass(JolInspection.java:50)
	at com.intellij.codeInspection.AbstractBaseUastLocalInspectionTool$1.visitClass(AbstractBaseUastLocalInspectionTool.java:75)
	at org.jetbrains.uast.UClass$DefaultImpls.accept(UClass.kt:71)
	at org.jetbrains.uast.java.AbstractJavaUClass.accept(JavaUClass.kt:23)
	at com.intellij.uast.UastHintedVisitorAdapter.visitElement(UastHintedVisitorAdapter.kt:21)
	at com.intellij.psi.impl.source.tree.java.PsiTypeParameterImpl.accept(PsiTypeParameterImpl.java:350)
	at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:75)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$8(LocalInspectionsPass.java:321)
	at com.intellij.util.AstLoadingFilter.lambda$toComputable$2(AstLoadingFilter.java:169)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:127)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:116)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:111)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitRestElementsAndCleanup$9(LocalInspectionsPass.java:320)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:133)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:231)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:159)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1105)
	at com.intellij.concurrency.ApplierCompleter.lambda$wrapInReadActionAndIndicator$1(ApplierCompleter.java:105)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
	at com.intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:116)
	at com.intellij.concurrency.ApplierCompleter.lambda$compute$0(ApplierCompleter.java:96)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:164)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:204)
	at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:96)
	at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)

Structural output

Show the output of JOL in the same manner as Structure view: each field is clickable

Patch JOL to return fully calculated ClassLayout

The method JolView.collectObjectLayouts() is ugly because it is simplified version of ClassLayout.toPrintable() - it tries to calculate a real size of object by iterating on field layouts.
It's unacceptable to make any calculation directly in the plugin and JOL should return already calculated data.

com.intellij.diagnostic.PluginException: Inspection #jol has no description [Plugin: JOL]

com.intellij.diagnostic.PluginException: Inspection #jol has no description [Plugin: JOL]
	at com.intellij.codeInspection.ui.InspectionNodeInfo.<init>(InspectionNodeInfo.java:75)
	at com.intellij.codeInspection.ui.InspectionResultsView.createBaseRightComponentFor(InspectionResultsView.java:464)
	at com.intellij.codeInspection.ui.InspectionResultsView.showInRightPanel(InspectionResultsView.java:392)
	at com.intellij.codeInspection.ui.InspectionResultsView.syncRightPanel(InspectionResultsView.java:331)
	at com.intellij.codeInspection.ui.InspectionTree.lambda$new$0(InspectionTree.java:83)
	at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:635)
	at com.intellij.ui.treeStructure.Tree$MySelectionModel.fireValueChanged(Tree.java:648)
	at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1093)
	at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:294)
	at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:188)
	at javax.swing.JTree.setSelectionPath(JTree.java:1641)
	at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2393)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3609)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3548)
	at com.intellij.util.ui.MouseEventAdapter.mousePressed(MouseEventAdapter.java:33)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)
	at java.awt.Component.processMouseEvent(Component.java:6547)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3325)
	at com.intellij.ui.treeStructure.Tree.processMouseEvent(Tree.java:398)
	at java.awt.Component.processEvent(Component.java:6315)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4899)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4721)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4532)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4721)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:766)
	at java.awt.EventQueue.access$500(EventQueue.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:715)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:739)
	at java.awt.EventQueue$4.run(EventQueue.java:737)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:736)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:742)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:687)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:386)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Table columns widthes: fit to content

ATM the Size and Offset columns has fixed width. The Class name takes to much and maybe it worth to make it last column because it's not necessary to show in most cases or even show the class name as a row.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.