diff --git a/pom.xml b/pom.xml index 8be6c7c3..3b5a891f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,133 +1,134 @@ - - - - - 4.0.0 - - - org.gridkit.lab - grid-lab-pom - 2 - - - org.gridkit.jvmtool - jvmtool-umbrella-pom - 0.3.4-SNAPSHOT - ${project.groupId}::${project.artifactId} - JVM tools, parent project - pom - - - sjk-core - mxdump - gcflow - sjk - sjk-lite - sjk-plus - hprof-heap - ygc-bench - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - alexey.ragozin - Alexey Ragozin - alexey.ragozin@gmail.com - - - - - scm:git:https://github.com/aragozin/jvm-tools.git - scm:git:https://github.com/aragozin/jvm-tools.git - https://github.com/aragozin/jvm-tools - HEAD - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.0 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-release-plugin - 2.4 - - true - true - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.14 - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9 - - - attach-javadoc - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-source - - jar - - - - - - org.apache.maven.plugins - maven-resources-plugin - 2.6 - - UTF-8 - - - - - - + + + + + 4.0.0 + + + org.gridkit.lab + grid-lab-pom + 2 + + + org.gridkit.jvmtool + jvmtool-umbrella-pom + 0.3.4-SNAPSHOT + ${project.groupId}::${project.artifactId} + JVM tools, parent project + pom + + + sjk-stacktrace + sjk-core + mxdump + gcflow + sjk + sjk-lite + sjk-plus + hprof-heap + ygc-bench + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + alexey.ragozin + Alexey Ragozin + alexey.ragozin@gmail.com + + + + + scm:git:https://github.com/aragozin/jvm-tools.git + scm:git:https://github.com/aragozin/jvm-tools.git + https://github.com/aragozin/jvm-tools + HEAD + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-release-plugin + 2.4 + + true + true + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.14 + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + + attach-javadoc + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-source + + jar + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + UTF-8 + + + + + + diff --git a/sjk-core/pom.xml b/sjk-core/pom.xml index 6cc21bc0..ffd820cb 100644 --- a/sjk-core/pom.xml +++ b/sjk-core/pom.xml @@ -32,6 +32,11 @@ Core classes for Swiss Java Knife tool + + org.gridkit.jvmtool + sjk-stacktrace + ${project.version} + org.gridkit.lab jvm-attach-api diff --git a/sjk-stacktrace/pom.xml b/sjk-stacktrace/pom.xml new file mode 100644 index 00000000..f02466e8 --- /dev/null +++ b/sjk-stacktrace/pom.xml @@ -0,0 +1,61 @@ + + + + + 4.0.0 + + + org.gridkit.jvmtool + jvmtool-umbrella-pom + 0.3.4-SNAPSHOT + ../pom.xml + + + sjk-stacktrace + ${project.groupId}::${project.artifactId} + Thread dumps: capture and encoding + + + + junit + junit + 4.10 + test + + + com.carrotsearch + junit-benchmarks + 0.7.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java similarity index 100% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java similarity index 99% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java index 8e994881..3bc80165 100644 --- a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java +++ b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java @@ -162,7 +162,7 @@ else if (index == mn) { return fileName.charAt(index - mn); case NO_SOURCE: try { - return UNKNOWN_SOURCE.charAt(index - mn); + return UNKNOWN_SOURCE.charAt(index - mn); } catch ( StringIndexOutOfBoundsException e) { throw e; diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java similarity index 100% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java similarity index 100% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java similarity index 100% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java similarity index 100% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java similarity index 98% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java index 27b74493..45ad7af4 100644 --- a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java +++ b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java @@ -266,9 +266,9 @@ private static class GenericMBeanThreadCounter implements CounterCollector { public GenericMBeanThreadCounter(ThreadMXBean bean, CounterType counter) { this.slowBean = bean; try { - if (bean instanceof com.sun.management.ThreadMXBean) { - fastBean = (com.sun.management.ThreadMXBean) bean; - } + if (bean instanceof com.sun.management.ThreadMXBean) { + fastBean = (com.sun.management.ThreadMXBean) bean; + } } catch(NoClassDefFoundError e) { // ignore diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java similarity index 100% rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java diff --git a/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/GlobHelper.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/GlobHelper.java new file mode 100644 index 00000000..5d8d4f1e --- /dev/null +++ b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/GlobHelper.java @@ -0,0 +1,81 @@ +package org.gridkit.jvmtool.stacktrace; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Alexey Ragozin (alexey.ragozin@gmail.com) + */ +public class GlobHelper { + + /** + * GLOB pattern supports *, ** and ? wild cards. + * Leading and trailing ** have special meaning, consecutive separator become optional. + */ + public static Pattern translate(String pattern, String separator) { + StringBuffer sb = new StringBuffer(); + String es = escape(separator); + // special starter + Matcher ss = Pattern.compile("^([*][*][" + es + "]).*").matcher(pattern); + if (ss.matches()) { + pattern = pattern.substring(ss.group(1).length()); + // make leading sep optional + sb.append("(.*[" + es + "])?"); + } + // special trailer + Matcher st = Pattern.compile(".*([" + es + "][*][*])$").matcher(pattern); + boolean useSt = false; + if (st.matches()) { + pattern = pattern.substring(0, st.start(1)); + useSt = true; + } + + for(int i = 0; i != pattern.length(); ++i) { + char c = pattern.charAt(i); + if (c == '?') { + sb.append("[^" + es + "]"); + } + else if (c == '*') { + if (i + 1 < pattern.length() && pattern.charAt(i+1) == '*') { + i++; + // ** + sb.append(".*"); + } + else { + sb.append("[^" + es + "]*"); + } + } + else { + if (c == '$') { + sb.append("\\$"); + } + else if (Character.isJavaIdentifierPart(c) || Character.isWhitespace(c)) { + sb.append(c); + } + else { + sb.append('\\').append(c); + } + } + } + + if (useSt) { + sb.append("([" + es + "].*)?"); + } + + return Pattern.compile(sb.toString()); + } + + private static String escape(String separator) { + StringBuffer sb = new StringBuffer(); + for(int i = 0; i != separator.length(); ++i) { + char c = separator.charAt(i); + if ("\\[]&-".indexOf(c) >= 0){ + sb.append('\\').append(c); + } + else { + sb.append(c); + } + } + return sb.toString(); + } +} diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java similarity index 99% rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java index 7396f976..3befd3f8 100644 --- a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java +++ b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java @@ -9,13 +9,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.gridkit.jvmtool.GlobHelper; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import com.carrotsearch.junitbenchmarks.BenchmarkRule; +@Ignore("Benchmark") public class RegExMicrobenchmark { private static StackFrame[] FRAMES; diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java similarity index 100% rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java similarity index 100% rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java similarity index 100% rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java diff --git a/sjk-core/src/test/resources/dump_v1.std b/sjk-stacktrace/src/test/resources/dump_v1.std similarity index 100% rename from sjk-core/src/test/resources/dump_v1.std rename to sjk-stacktrace/src/test/resources/dump_v1.std diff --git a/sjk-core/src/test/resources/dump_v2.std b/sjk-stacktrace/src/test/resources/dump_v2.std similarity index 100% rename from sjk-core/src/test/resources/dump_v2.std rename to sjk-stacktrace/src/test/resources/dump_v2.std diff --git a/sjk-core/src/test/resources/stack-frame.txt b/sjk-stacktrace/src/test/resources/stack-frame.txt similarity index 100% rename from sjk-core/src/test/resources/stack-frame.txt rename to sjk-stacktrace/src/test/resources/stack-frame.txt