From 7120e02f433b1167202b6761b593f26fee5bb352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=9B=BD=E7=91=9E?= <18235787078@163.com> Date: Thu, 6 Jun 2024 08:54:48 +0800 Subject: [PATCH] optimize BuildTree of ClassLoader -t --- .../command/klass100/ClassLoaderCommand.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java index 6a79813610..a711d7a8ba 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassLoaderCommand.java @@ -449,31 +449,37 @@ private Map urlStats(Instrumentation inst) { // 以树状列出ClassLoader的继承结构 private static List processClassLoaderTree(List classLoaders) { - List rootClassLoaders = new ArrayList(); - List parentNotNullClassLoaders = new ArrayList(); + List rootClassLoaders = new ArrayList<>(); + Map> childMap = new HashMap<>(); + + // 分离根节点和非根节点,并构建父子关系映射 for (ClassLoaderVO classLoaderVO : classLoaders) { if (classLoaderVO.getParent() == null) { rootClassLoaders.add(classLoaderVO); } else { - parentNotNullClassLoaders.add(classLoaderVO); + childMap.computeIfAbsent(classLoaderVO.getParent(), k -> new ArrayList<>()).add(classLoaderVO); } } - for (ClassLoaderVO classLoaderVO : rootClassLoaders) { - buildTree(classLoaderVO, parentNotNullClassLoaders); + // 构建树 + for (ClassLoaderVO root : rootClassLoaders) { + buildTree(root, childMap); } + return rootClassLoaders; } - private static void buildTree(ClassLoaderVO parent, List parentNotNullClassLoaders) { - for (ClassLoaderVO classLoaderVO : parentNotNullClassLoaders) { - if (parent.getName().equals(classLoaderVO.getParent())){ - parent.addChild(classLoaderVO); - buildTree(classLoaderVO, parentNotNullClassLoaders); + private static void buildTree(ClassLoaderVO parent, Map> childMap) { + List children = childMap.get(parent.getName()); + if (children != null) { + for (ClassLoaderVO child : children) { + parent.addChild(child); + buildTree(child, childMap); } } } + private static Set getAllClassLoaders(Instrumentation inst, Filter... filters) { Set classLoaderSet = new HashSet();