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();