site/docs/en/doc/classloader.md
::: tip View hierarchy, urls and classes-loading info for the class-loaders. :::
classloader can search and print out the URLs for a specified resource from one particular classloader. It is quite handy when analyzing ResourceNotFoundException.
| Name | Specification |
|---|---|
| [l] | list all classloader instances |
| [t] | print classloader's hierarchy |
| [a] | list all the classes loaded by all the classloaders (use it with great caution since the output can be huge) |
| [c:] | print classloader's hashcode |
[classLoaderClass:] | The class name of the ClassLoader that executes the expression. |
[c: r:] | using ClassLoader to search resource |
[c: load:] | using ClassLoader to load class |
--url-classes options| Name | Specification |
|---|---|
--url-classes | Show relationship between loaded classes and codeSource(URL/jar) in a specific ClassLoader |
-d, --details | Details mode: list class names for each URL/jar (use -n/--limit to control output) |
--jar <kw> | Filter jar(URL) by keyword (contains match by default) |
--class <kw> | Filter classes by keyword/package (contains match by default) |
-E, --regex | Treat --jar/--class as regular expression (keyword match by default) |
-n, --limit <N> | In details mode, show at most N classes per URL/jar (100 by default) |
$ 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.
$ 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 -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.
$ classloader -c 3d4eac69
file:/private/tmp/math-game.jar
file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
Affect(row-cnt:9) cost in 3 ms.
Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader.
For ClassLoader with only unique instance, it can be specified by class name, which is more convenient to use:
$ classloader --classLoaderClass sun.misc.Launcher$AppClassLoader
file:/private/tmp/math-game.jar
file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
Affect(row-cnt:9) cost in 3 ms.
$ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF
jar:file:/private/tmp/math-game.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF
Use the classloader to load .class resource
$ 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 -c 3d4eac69 --load demo.MathGame
load class success.
class-info demo.MathGame
code-source /private/tmp/math-game.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
::: warning
Note that statistics are based on all classes currently loaded by the JVM. Does not mean that Unused URLs can be removed from the application. Because it may be necessary to load classes from Unused URLs in the future, or to load resources.
:::
$ classloader --url-stat
com.taobao.arthas.agent.ArthasClassloader@3c41660, hash:3c41660
Used URLs:
file:/Users/admin/.arthas/lib/3.5.6/arthas/arthas-core.jar
Unused URLs:
sun.misc.Launcher$AppClassLoader@75b84c92, hash:75b84c92
Used URLs:
file:/Users/admin/code/java/arthas/math-game/target/math-game.jar
file:/Users/admin/.arthas/lib/3.5.6/arthas/arthas-agent.jar
Unused URLs:
sun.misc.Launcher$ExtClassLoader@7f31245a, hash:7f31245a
Used URLs:
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/sunec.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/sunjce_provider.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/localedata.jar
Unused URLs:
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/nashorn.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/cldrdata.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/legacy8ujsse.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/jfxrt.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/dnsns.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/openjsse.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/sunpkcs11.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/jaccess.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/zipfs.jar
--url-classes shows which jar(URL) the classes come from, and how many classes are loaded for each jar(URL) in the specified ClassLoader.
$ classloader -c 3d4eac69 --url-classes
sun.misc.Launcher$AppClassLoader@3d4eac69, hash:3d4eac69
url loadedClassCount
file:/private/tmp/math-game.jar 42
file:/Users/hengyunabc/.arthas/lib/arthas-agent.jar 15
Affect(row-cnt:2) cost in 3 ms.
Filter by jar name keyword and show details (list class names):
$ classloader -c 3d4eac69 --url-classes -d --jar math-game
Filter further by package/keyword (will also output matchedClassCount for statistics):
$ classloader -c 3d4eac69 --url-classes --jar spring-core --class org.springframework