classloader === > 查看classloader的继承树,urls,类加载信息 `classloader` 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls等。 可以让指定的classloader去getResources,打印出所有查找到的resources的url。对于`ResourceNotFoundException`比较有用。 ### 参数说明 |参数名称|参数说明| |---:|:---| |[l]|按类加载实例进行统计| |[t]|打印所有ClassLoader的继承树| |[a]|列出所有ClassLoader加载的类,请谨慎使用| |`[c:]`|ClassLoader的hashcode| |`[c: r:]`|用ClassLoader去查找resource| |`[c: load:]`|用ClassLoader去加载指定的类| ### 使用参考 #### 按类加载类型查看统计信息 ```bash $ classloader name numberOfInstances loadedCountTotal com.taobao.arthas.agent.ArthasClassloader 1 2115 BootstrapClassLoader 1 1861 sun.reflect.DelegatingClassLoader 5 5 sun.misc.Launcher$AppClassLoader 1 4 sun.misc.Launcher$ExtClassLoader 1 1 Affect(row-cnt:5) cost in 3 ms. ``` #### 按类加载实例查看统计信息 ```bash $ classloader -l name loadedCount hash parent BootstrapClassLoader 1861 null null com.taobao.arthas.agent.ArthasClassloader@68b31f0a 2115 68b31f0a sun.misc.Launcher$ExtClassLoader@66350f69 sun.misc.Launcher$AppClassLoader@3d4eac69 4 3d4eac69 sun.misc.Launcher$ExtClassLoader@66350f69 sun.misc.Launcher$ExtClassLoader@66350f69 1 66350f69 null Affect(row-cnt:4) cost in 2 ms. ``` #### 查看ClassLoader的继承树 ```bash $ classloader -t +-BootstrapClassLoader +-sun.misc.Launcher$ExtClassLoader@66350f69 +-com.taobao.arthas.agent.ArthasClassloader@68b31f0a +-sun.misc.Launcher$AppClassLoader@3d4eac69 Affect(row-cnt:4) cost in 3 ms. ``` #### 查看URLClassLoader实际的urls ```bash $ classloader -c 3d4eac69 file:/private/tmp/arthas-demo.jar file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar Affect(row-cnt:9) cost in 3 ms. ``` #### 使用ClassLoader去查找resource ```bash $ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF jar:file:/private/tmp/arthas-demo.jar!/META-INF/MANIFEST.MF jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF ``` 也可以尝试查找类的class文件: ```bash $ classloader -c 1b6d3586 -r java/lang/String.class jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class ``` #### 使用ClassLoader去加载类 ```bash $ classloader -c 3d4eac69 --load demo.MathGame load class success. class-info demo.MathGame code-source /private/tmp/arthas-demo.jar name demo.MathGame isInterface false isAnnotation false isEnum false isAnonymousClass false isArray false isLocalClass false isMemberClass false isPrimitive false isSynthetic false simple-name MathGame modifier public annotation interfaces super-class +-java.lang.Object class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69 +-sun.misc.Launcher$ExtClassLoader@66350f69 classLoaderHash 3d4eac69 ```