support yourkit 2017 thread dump format

This commit is contained in:
peter
2017-06-08 17:12:35 +02:00
parent a183a1f91e
commit 31ddfe6122
2 changed files with 60 additions and 6 deletions
@@ -31,6 +31,7 @@ import java.util.regex.Pattern;
public class ThreadDumpParser {
private static final Pattern ourThreadStartPattern = Pattern.compile("^\\s*\"(.+)\".+(prio=\\d+ (?:os_prio=[^\\s]+ )?tid=[^\\s]+ nid=[^\\s]+|[Ii][Dd]=\\d+) ([^\\[]+)");
private static final Pattern ourYourkitThreadStartPattern = Pattern.compile("(.+) \\[([^\\[]*)]");
private static final Pattern ourYourkitThreadStartPattern2 = Pattern.compile("(.+) State: (.+) CPU usage on sample: .+");
private static final Pattern ourThreadStatePattern = Pattern.compile("java\\.lang\\.Thread\\.State: (.+) \\((.+)\\)");
private static final Pattern ourThreadStatePattern2 = Pattern.compile("java\\.lang\\.Thread\\.State: (.+)");
private static final Pattern ourWaitingForLockPattern = Pattern.compile("- waiting (on|to lock) <(.+)>");
@@ -188,7 +189,7 @@ public class ThreadDumpParser {
}
@Nullable
private static ThreadState tryParseThreadStart(final String line) {
private static ThreadState tryParseThreadStart(String line) {
Matcher m = ourThreadStartPattern.matcher(line);
if (m.find()) {
final ThreadState state = new ThreadState(m.group(1), m.group(3));
@@ -197,14 +198,17 @@ public class ThreadDumpParser {
}
return state;
}
boolean daemon = line.contains(" [DAEMON]");
if (daemon) {
line = StringUtil.replace(line, " [DAEMON]", "");
}
String noDaemon = StringUtil.trimEnd(line, " [DAEMON]");
m = ourYourkitThreadStartPattern.matcher(noDaemon);
m = ourYourkitThreadStartPattern.matcher(line);
if (!m.matches()) m = ourYourkitThreadStartPattern2.matcher(line);
if (m.matches()) {
ThreadState state = new ThreadState(m.group(1), m.group(2));
if (noDaemon.length() < line.length()) {
state.setDaemon(true);
}
state.setDaemon(daemon);
return state;
}
return null;