Classloader support matching classloader by class name. (#1428)

This commit is contained in:
Hollow Man
2020-08-14 13:55:44 +08:00
committed by GitHub
parent 92dd9a2fb0
commit 3dc3f36b9d
5 changed files with 81 additions and 0 deletions
@@ -13,6 +13,7 @@ import com.taobao.arthas.core.shell.command.AnnotatedCommand;
import com.taobao.arthas.core.shell.command.CommandProcess;
import com.taobao.arthas.core.shell.handlers.Handler;
import com.taobao.arthas.core.util.ClassUtils;
import com.taobao.arthas.core.util.ClassLoaderUtils;
import com.taobao.arthas.core.util.ResultUtils;
import com.taobao.arthas.core.util.affect.RowAffect;
import com.taobao.middleware.cli.annotations.Description;
@@ -56,6 +57,7 @@ public class ClassLoaderCommand extends AnnotatedCommand {
private Logger logger = LoggerFactory.getLogger(ClassLoaderCommand.class);
private boolean isTree = false;
private String hashCode;
private String classLoaderClass;
private boolean all = false;
private String resource;
private boolean includeReflectionClassLoader = true;
@@ -70,6 +72,12 @@ public class ClassLoaderCommand extends AnnotatedCommand {
public void setTree(boolean tree) {
isTree = tree;
}
@Option(longName = "classLoaderClass")
@Description("The class name of the special class's classLoader.")
public void setClassLoaderClass(String classLoaderClass) {
this.classLoaderClass = classLoaderClass;
}
@Option(shortName = "c", longName = "classloader")
@Description("The hash code of the special ClassLoader")
@@ -113,6 +121,25 @@ public class ClassLoaderCommand extends AnnotatedCommand {
process.interruptHandler(new ClassLoaderInterruptHandler(this));
Instrumentation inst = process.session().getInstrumentation();
if (!all && hashCode == null && classLoaderClass != null) {
List<ClassLoader> matchedClassLoaders = ClassLoaderUtils.getClassLoaderByClassName(inst, classLoaderClass);
if (matchedClassLoaders.size() == 1) {
hashCode = "" + Integer.toHexString(matchedClassLoaders.get(0).hashCode());
} else if (matchedClassLoaders.size() > 1) {
Collection<ClassLoaderVO> classLoaderVOList = ClassUtils.createClassLoaderVOList(matchedClassLoaders);
ClassLoaderModel classloaderModel = new ClassLoaderModel()
.setClassLoaderClass(classLoaderClass)
.setMatchedClassLoaders(classLoaderVOList);
process.appendResult(classloaderModel);
process.end(-1, "Found more than one classloader by class name, please specify classloader with '-c <classloader hash>'");
return;
} else {
process.end(-1, "Can not find classloader by class name: " + classLoaderClass + ".");
return;
}
}
if (all) {
processAllClasses(process, inst);
} else if (hashCode != null && resource != null) {
@@ -4,6 +4,7 @@ import com.taobao.arthas.core.command.klass100.ClassLoaderCommand.ClassLoaderSta
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* @author gongdewei 2020/4/21
@@ -20,6 +21,9 @@ public class ClassLoaderModel extends ResultModel {
private Map<String, ClassLoaderStat> classLoaderStats;
private Collection<ClassLoaderVO> matchedClassLoaders;
private String classLoaderClass;
public ClassLoaderModel() {
}
@@ -90,4 +94,22 @@ public class ClassLoaderModel extends ResultModel {
this.classLoaderStats = classLoaderStats;
return this;
}
public String getClassLoaderClass() {
return classLoaderClass;
}
public ClassLoaderModel setClassLoaderClass(String classLoaderClass) {
this.classLoaderClass = classLoaderClass;
return this;
}
public Collection<ClassLoaderVO> getMatchedClassLoaders() {
return matchedClassLoaders;
}
public ClassLoaderModel setMatchedClassLoaders(Collection<ClassLoaderVO> matchedClassLoaders) {
this.matchedClassLoaders = matchedClassLoaders;
return this;
}
}
@@ -22,6 +22,12 @@ public class ClassLoaderView extends ResultView<ClassLoaderModel> {
@Override
public void draw(CommandProcess process, ClassLoaderModel result) {
if (result.getMatchedClassLoaders() != null) {
process.write("Matched classloaders: \n");
drawClassLoaders(process, result.getMatchedClassLoaders(), false);
process.write("\n");
return;
}
if (result.getClassSet() != null) {
drawAllClasses(process, result.getClassSet());
}