From 22c6568748707643da72b5ad1f73d6437e6ac839 Mon Sep 17 00:00:00 2001 From: Chris Newland Date: Wed, 26 Aug 2015 23:30:24 +0100 Subject: [PATCH] JIT timeline shows all compile events per method including recompiles --- .../jitwatch/core/HotSpotLogParser.java | 19 +- .../jitwatch/core/JITWatchConstants.java | 2 + .../jitwatch/model/IMetaMember.java | 17 +- .../jitwatch/model/JITDataModel.java | 4 +- .../adoptopenjdk/jitwatch/model/JITEvent.java | 5 +- .../adoptopenjdk/jitwatch/model/JITStats.java | 2 +- .../adoptopenjdk/jitwatch/model/Journal.java | 25 +- .../InliningFailReasonTopListVisitable.java | 5 +- .../jitwatch/ui/AttributeTableRow.java | 2 +- .../jitwatch/ui/JournalViewerStage.java | 2 +- .../ui/graphing/AbstractGraphStage.java | 62 +++- .../jitwatch/ui/graphing/CodeCacheStage.java | 4 +- .../jitwatch/ui/graphing/HistoStage.java | 9 +- .../jitwatch/ui/graphing/TimeLineStage.java | 320 ++++++++++++------ .../jitwatch/ui/sandbox/SandboxStage.java | 1 + .../jitwatch/ui/toplist/TopListStage.java | 6 + .../adoptopenjdk/jitwatch/util/ParseUtil.java | 44 ++- src/main/resources/examples/DeoptTest.java | 49 +++ 18 files changed, 417 insertions(+), 161 deletions(-) create mode 100644 src/main/resources/examples/DeoptTest.java diff --git a/src/main/java/org/adoptopenjdk/jitwatch/core/HotSpotLogParser.java b/src/main/java/org/adoptopenjdk/jitwatch/core/HotSpotLogParser.java index 219bf594..b17d5e89 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/core/HotSpotLogParser.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/core/HotSpotLogParser.java @@ -10,6 +10,7 @@ import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_METHOD; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_NAME; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_STAMP; +import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_STAMP_COMPLETED; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C1; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C2; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C2N; @@ -662,9 +663,22 @@ private void handleTagQueued(Tag tag) handleMethodLine(tag, EventType.QUEUE); } + private void renameCompilationCompletedTimestamp(Tag tag) + { + String compilationCompletedStamp = tag.getAttribute(ATTR_STAMP); + + if (compilationCompletedStamp != null) + { + tag.getAttrs().remove(ATTR_STAMP); + tag.getAttrs().put(ATTR_STAMP_COMPLETED, compilationCompletedStamp); + } + } + private void handleTagNMethod(Tag tag) { String attrCompiler = tag.getAttribute(ATTR_COMPILER); + + renameCompilationCompletedTimestamp(tag); if (attrCompiler != null) { @@ -742,9 +756,8 @@ private void handleMethodLine(Tag tag, EventType eventType) private IMetaMember handleMember(String signature, Map attrs, EventType type) { IMetaMember metaMember = findMemberWithSignature(signature); - - String stampAttr = attrs.get(ATTR_STAMP); - long stampTime = ParseUtil.parseStamp(stampAttr); + + long stampTime = ParseUtil.getStamp(attrs); if (metaMember != null) { diff --git a/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java b/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java index 3e91e449..d0955b33 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java @@ -106,10 +106,12 @@ private JITWatchConstants() public static final String ATTR_COMPILE_ID = "compile_id"; public static final String ATTR_COMPILE_KIND = "compile_kind"; public static final String ATTR_STAMP = "stamp"; + public static final String ATTR_STAMP_COMPLETED = "stamp_completed"; public static final String ATTR_NAME = "name"; public static final String ATTR_BCI = "bci"; public static final String ATTR_CODE = "code"; public static final String ATTR_COMPILER = "compiler"; + public static final String ATTR_LEVEL = "level"; public static final String ATTR_FREE_CODE_CACHE = "free_code_cache"; public static final String ATTR_NMSIZE = "nmsize"; public static final String ATTR_BYTES = "bytes"; diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/IMetaMember.java b/src/main/java/org/adoptopenjdk/jitwatch/model/IMetaMember.java index 64effae9..b92b19f5 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/IMetaMember.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/IMetaMember.java @@ -14,8 +14,6 @@ public interface IMetaMember { - List getQueuedAttributes(); - MetaClass getMetaClass(); MemberBytecode getMemberBytecode(); @@ -26,21 +24,16 @@ public interface IMetaMember Journal getJournal(); String getQueuedAttribute(String key); - - List getCompiledAttributes(); - - String getCompiledAttribute(String key); - - void addCompiledAttribute(String key, String value); - + List getQueuedAttributes(); void setQueuedAttributes(Map queuedAttributes); - boolean isQueued(); + //TODO split task and nmethod attrs? void setCompiledAttributes(Map compiledAttributes); - void addCompiledAttributes(Map additionalAttrs); - + String getCompiledAttribute(String key); + List getCompiledAttributes(); + void addCompiledAttribute(String key, String value); boolean isCompiled(); String toStringUnqualifiedMethodName(boolean fqParamTypes); diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/JITDataModel.java b/src/main/java/org/adoptopenjdk/jitwatch/model/JITDataModel.java index 3298576e..5974100a 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/JITDataModel.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/JITDataModel.java @@ -98,7 +98,7 @@ public JITStats getJITStats() // ugly but better than using COWAL with so many writes public void addEvent(JITEvent event) - { + { synchronized (jitEvents) { jitEvents.add(event); @@ -106,7 +106,7 @@ public void addEvent(JITEvent event) } @Override - public synchronized List getEventListCopy() + public List getEventListCopy() { synchronized (jitEvents) { diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/JITEvent.java b/src/main/java/org/adoptopenjdk/jitwatch/model/JITEvent.java index cb6e8901..e3e3c4b7 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/JITEvent.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/JITEvent.java @@ -5,9 +5,10 @@ */ package org.adoptopenjdk.jitwatch.model; -import org.adoptopenjdk.jitwatch.util.StringUtil; +import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_COLON; +import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_SPACE; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*; +import org.adoptopenjdk.jitwatch.util.StringUtil; public class JITEvent { diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/JITStats.java b/src/main/java/org/adoptopenjdk/jitwatch/model/JITStats.java index cfad9c08..e01c85b9 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/JITStats.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/JITStats.java @@ -258,7 +258,7 @@ public long getTotalCompileTime() public long getTotalCompiledMethods() { - return countC1 + countC2 + countC2N + countOSR; + return countC1 + countC2 + countC2N; } public long getNativeBytes() diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/Journal.java b/src/main/java/org/adoptopenjdk/jitwatch/model/Journal.java index 57ee13d0..ea020869 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/Journal.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/Journal.java @@ -5,10 +5,14 @@ */ package org.adoptopenjdk.jitwatch.model; +import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_NEWLINE; + import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; -import org.adoptopenjdk.jitwatch.core.JITWatchConstants; +import org.adoptopenjdk.jitwatch.util.ParseUtil; public class Journal { @@ -34,6 +38,18 @@ public List getEntryList() { List copy = new ArrayList<>(entryList); + Collections.sort(copy, new Comparator() + { + @Override + public int compare(Tag tag1, Tag tag2) + { + long ts1 = ParseUtil.getStamp(tag1.getAttrs()); + long ts2 = ParseUtil.getStamp(tag2.getAttrs()); + + return Long.compare(ts1, ts2); + } + }); + return copy; } } @@ -43,12 +59,9 @@ public String toString() { StringBuilder builder = new StringBuilder(); - synchronized (entryList) + for (Tag tag : getEntryList()) { - for (Tag tag : entryList) - { - builder.append(tag.toString(true)).append(JITWatchConstants.C_NEWLINE); - } + builder.append(tag.toString(true)).append(C_NEWLINE); } return builder.toString(); diff --git a/src/main/java/org/adoptopenjdk/jitwatch/toplist/InliningFailReasonTopListVisitable.java b/src/main/java/org/adoptopenjdk/jitwatch/toplist/InliningFailReasonTopListVisitable.java index 20080697..48852d49 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/toplist/InliningFailReasonTopListVisitable.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/toplist/InliningFailReasonTopListVisitable.java @@ -32,7 +32,7 @@ public InliningFailReasonTopListVisitable(IReadOnlyJITDataModel model, boolean s @Override public void visit(IMetaMember metaMember) - { + { if (metaMember != null && metaMember.isCompiled()) { try @@ -52,6 +52,9 @@ private void processParseTag(Tag parseTag) { String tagName = child.getName(); Map attrs = child.getAttrs(); + + logger.info("processParseTag {}", child.toString(false)); + switch (tagName) { diff --git a/src/main/java/org/adoptopenjdk/jitwatch/ui/AttributeTableRow.java b/src/main/java/org/adoptopenjdk/jitwatch/ui/AttributeTableRow.java index 1f58dbe1..9097dbaa 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/ui/AttributeTableRow.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/ui/AttributeTableRow.java @@ -17,7 +17,7 @@ public AttributeTableRow(String type, String name, String value) { this.type = type; this.name = name; - this.value = StringUtil.formatThousands(value); + this.value = StringUtil.replaceXMLEntities(value); } public String getType() diff --git a/src/main/java/org/adoptopenjdk/jitwatch/ui/JournalViewerStage.java b/src/main/java/org/adoptopenjdk/jitwatch/ui/JournalViewerStage.java index 494ec8c8..1345dfb3 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/ui/JournalViewerStage.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/ui/JournalViewerStage.java @@ -50,7 +50,7 @@ public void handle(WindowEvent arg0) int maxLineLength = 0; List