From 832573e1a9943433e710393908a6da7b38f3d90f Mon Sep 17 00:00:00 2001 From: gongdewei Date: Fri, 16 Oct 2020 17:29:49 +0800 Subject: [PATCH] Reduce small objects generated by dashboard commands (#1533) #1542 --- .../command/monitor200/DashboardCommand.java | 4 +-- .../command/monitor200/ThreadCommand.java | 12 ++++---- .../core/command/view/ViewRenderUtil.java | 30 +++++++++++++++++-- .../taobao/arthas/core/util/StringUtils.java | 6 +++- .../taobao/arthas/core/util/ThreadUtil.java | 17 ++++------- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java index f8be83e1e..ff2b3dd71 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java @@ -306,8 +306,8 @@ public class DashboardCommand extends AnnotatedCommand { DashboardModel dashboardModel = new DashboardModel(); //thread sample - Map threads = ThreadUtil.getThreads(); - dashboardModel.setThreads(threadSampler.sample(threads.values())); + List threads = ThreadUtil.getThreads(); + dashboardModel.setThreads(threadSampler.sample(threads)); //memory addMemoryInfo(dashboardModel); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java index 21321ecde..04c66fbf5 100755 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java @@ -129,7 +129,7 @@ public class ThreadCommand extends AnnotatedCommand { } private ExitStatus processAllThreads(CommandProcess process) { - Map threads = ThreadUtil.getThreads(); + List threads = ThreadUtil.getThreads(); // 统计各种线程状态 Map stateCountMap = new LinkedHashMap(); @@ -137,7 +137,7 @@ public class ThreadCommand extends AnnotatedCommand { stateCountMap.put(s, 0); } - for (ThreadVO thread : threads.values()) { + for (ThreadVO thread : threads) { State threadState = thread.getState(); Integer count = stateCountMap.get(threadState); stateCountMap.put(threadState, count + 1); @@ -149,7 +149,7 @@ public class ThreadCommand extends AnnotatedCommand { this.state = this.state.toUpperCase(); if (states.contains(this.state)) { includeInternalThreads = false; - for (ThreadVO thread : threads.values()) { + for (ThreadVO thread : threads) { if (thread.getState() != null && state.equals(thread.getState().name())) { resultThreads.add(thread); } @@ -158,7 +158,7 @@ public class ThreadCommand extends AnnotatedCommand { return ExitStatus.failure(1, "Illegal argument, state should be one of " + states); } } else { - resultThreads = threads.values(); + resultThreads = threads; } //thread stats @@ -183,9 +183,9 @@ public class ThreadCommand extends AnnotatedCommand { private ExitStatus processTopBusyThreads(CommandProcess process) { ThreadSampler threadSampler = new ThreadSampler(); - threadSampler.sample(ThreadUtil.getThreads().values()); + threadSampler.sample(ThreadUtil.getThreads()); threadSampler.pause(sampleInterval); - List threadStats = threadSampler.sample(ThreadUtil.getThreads().values()); + List threadStats = threadSampler.sample(ThreadUtil.getThreads()); int limit = Math.min(threadStats.size(), topNBusy); List topNThreads = threadStats.subList(0, limit); diff --git a/core/src/main/java/com/taobao/arthas/core/command/view/ViewRenderUtil.java b/core/src/main/java/com/taobao/arthas/core/command/view/ViewRenderUtil.java index 55e5b9743..a7799c1ac 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/view/ViewRenderUtil.java +++ b/core/src/main/java/com/taobao/arthas/core/command/view/ViewRenderUtil.java @@ -123,6 +123,7 @@ public class ViewRenderUtil { ) ); + int count = 0; for (ThreadVO thread : threads) { Color color = colorMapping.get(thread.getState()); String time = formatTimeMills(thread.getTime()); @@ -151,6 +152,9 @@ public class ViewRenderUtil { new LabelElement(thread.isInterrupted()), daemonLabel ); + if (++count >= height) { + break; + } } return RenderUtil.render(table, width, height); } @@ -159,13 +163,33 @@ public class ViewRenderUtil { long seconds = timeMills / 1000; long mills = timeMills % 1000; long min = seconds / 60; - //return min + ":" + (seconds % 60); - return String.format("%d:%d.%03d", min, seconds, mills); + seconds = seconds % 60; + + //return String.format("%d:%d.%03d", min, seconds, mills); + String str; + if (mills >= 100) { + str = min + ":" + seconds + "." + mills; + } else if (mills >= 10) { + str = min + ":" + seconds + ".0" + mills; + } else { + str = min + ":" + seconds + ".00" + mills; + } + return str; } private static String formatTimeMillsToSeconds(long timeMills) { long seconds = timeMills / 1000; long mills = timeMills % 1000; - return String.format("%d.%03d", seconds, mills); + + //return String.format("%d.%03d", seconds, mills); + String str; + if (mills >= 100) { + str = seconds + "." + mills; + } else if (mills >= 10) { + str = seconds + ".0" + mills; + } else { + str = seconds + ".00" + mills; + } + return str; } } diff --git a/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java b/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java index 54c7974c2..e12fbb1e9 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java +++ b/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java @@ -449,10 +449,14 @@ public abstract class StringUtils { public static String replace(String inString, String oldPattern, String newPattern) { if(hasLength(inString) && hasLength(oldPattern) && newPattern != null) { - StringBuilder sb = new StringBuilder(); int pos = 0; int index = inString.indexOf(oldPattern); + if (index < 0) { + //no need to replace + return inString; + } + StringBuilder sb = new StringBuilder(); for(int patLen = oldPattern.length(); index >= 0; index = inString.indexOf(oldPattern, pos)) { sb.append(inString.substring(pos, index)); sb.append(newPattern); diff --git a/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java b/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java index 1556516ff..67e7fc448 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java +++ b/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java @@ -36,29 +36,22 @@ abstract public class ThreadUtil { } /** - * 获取所有线程Map,以线程Name-ID为key - * - * @return + * 获取所有线程 */ - public static Map getThreads() { + public static List getThreads() { ThreadGroup root = getRoot(); Thread[] threads = new Thread[root.activeCount()]; while (root.enumerate(threads, true) == threads.length) { threads = new Thread[threads.length * 2]; } - SortedMap map = new TreeMap(new Comparator() { - @Override - public int compare(String o1, String o2) { - return o1.compareTo(o2); - } - }); + List list = new ArrayList(threads.length); for (Thread thread : threads) { if (thread != null) { ThreadVO threadVO = createThreadVO(thread); - map.put(thread.getName() + "-" + thread.getId(), threadVO); + list.add(threadVO); } } - return map; + return list; } private static ThreadVO createThreadVO(Thread thread) {