龙空技术网

如何列出所有已经加载到Java虚拟机中的类

码世界 69

前言:

而今同学们对“类路径引用的项目java不存在”大约比较着重,大家都想要知道一些“类路径引用的项目java不存在”的相关内容。那么小编在网络上网罗了一些对于“类路径引用的项目java不存在””的相关知识,希望朋友们能喜欢,兄弟们快快来了解一下吧!

这篇文章中,我们将会用不同的方式来列出所有已经加载到JVM中的类。比如,我们可以通过JVM的Heap Dump(堆转存)方式或者通过外部工具连接正在运行的应用并将类加载到工具中。当然,也有各种各样的库可以通过编程方式实现这一点。

下面让我们来探讨下非编程方式和编程方式分别是如何实现的。

非编程方式

使用JVM参数

最简单的方式就是将所有被加载的类输出到控制台或者一个文件中。具体命令如下:

java  --verbose:class <main_class>
// 部分加载行展示[Opened C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Object from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.io.Serializable from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Comparable from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.CharSequence from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.String from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.reflect.AnnotatedElement from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.reflect.GenericDeclaration from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.reflect.Type from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Class from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Cloneable from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.ClassLoader from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.System from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Throwable from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Error from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.ThreadDeath from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.Exception from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.RuntimeException from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.lang.SecurityManager from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar][Loaded java.security.ProtectionDomain from C:\Program Files (x86)\java-se-8u43-ri\jre\lib\rt.jar]....................................................................................

Java9及以上,我们需要使用JVM的-Xlog参数,然后把加载的类输出到一个文件中:

java -Xlog:class+load=info:classloaded.txt <main_class>

具体类加载信息如下图:

classloaded文本文件

使用Heap Dump

我们可以使用不同的工具来从JVM堆转储中提取类加载信息。首先我们先通过命令生成一个Heap Dump:

jmap -dump:format=b,file=/opt/tmp/heapdump.bin <app_pid>

上述命令生成的dump可以用各种工具获取不同的指标。

在eclipse中,我们可以通过Eclipse Memory Analyzer插件来打开分析如下:

同样,我们也可以在Java VisualVM中打开:

使用JProfiler

JProfiler是一个高级的Java分析器之一,它集成了丰富的特性去查课不同的指标。

下面我们用JProfiler打开上面生成的HeapDump.bin文件:

除此之外,JProfiler还提供了实时加载和监控正在运行的Java程序,然后可以进行线程,CPU等等多方面的分析,需要详细了解的同学可以去:。

编程方式

Instrumentation接口

Java提供了Instrumentation接口用来在应用程序上获取有价值的指标。首先,我们必须要创建和加载一个Java Agent,以便将Instrumentation接口的一个实例添加到应用程序中。Java Agent其实就是一个运行在JVM上面的检测工具。

然后我们需要调用Instrumentation的getInitiatedClasses方法来获取指定的一个Class Loader类型的所有的类。

谷歌Guava

谷歌的Guava库也可以基于当前的Class Loader来获取所有的已经加载的类。

通过Maven pom引入依赖:

<dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>31.0.1-jre</version></dependency>

示例代码:

ClassPath classPath = ClassPath.from(ListLoadedClass.class.getClassLoader());Set<ClassInfo> classes = classPath.getAllClasses();

Reflections接口

我们也可以使用Reflections库来扫描当前的类路径并且允行我们在运行中查看。

通过Maven pom引入依赖:

<dependency>    <groupId>org.reflections</groupId>    <artifactId>reflections</artifactId>    <version>0.10.2</version></dependency>

示例代码:

Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));Set<Class> classes = reflections.getSubTypesOf(Object.class)  .stream()  .collect(Collectors.toSet());

好了,有兴趣的同学可以根据以上方式去每个调试下。工具可以给你提供比较方便的实时调试,编程方式可以集成到你的程序之中并且可以根据自己的需求做一些定制需求。

标签: #类路径引用的项目java不存在 #正在载入java