获取所有VM使用的所有Java类位置列表?

时间:2014-08-27 09:44:09

标签: java linux classloader

这个问题比我上一个问题更进一步:

Obtaining a list of all Java classes used from all JVM's?

现在我需要知道从哪里加载这些类的物理位置。我已经检查了其他命令的jcmd帮助,但它对我没用。我也无法在jvisualvm中找到它,但信息也不存在。有人可以帮我这个吗?

编辑: 这是我的情况:我的公司有不同的个人java项目(罐子),我们可以控制它是开始还是停止。我们可以在自己的自定义构建Web界面中控制它。每个进程在启动时都会获得进程ID(PID),然后在后台运行。

我的需求:我需要每个运行的PID java进程列出所有已加载的类。我已经有jcmd <pid> GC.class_histogram,但这只包含加载了哪些类的列表。我还想要实际加载类的信息(哪个jar,文件系统上的位置)。

1 个答案:

答案 0 :(得分:1)

这些类是从java.lang.ClassLoader's loadClass(String name)方法加载的,后者又调用 findClass(String name) 方法。通常,自定义ClassLoader会覆盖findClass使用特定协议和位置检索类定义的方法。可能是从数据库或从网络位置加载类,其位置可以动态生成。所以你永远不会知道所有Java类的位置最好的例子是 AppletClassLoader ,它从网络流或远程位置加载类。

Bootstrap ClassLoader - 核心库包,例如JRE lib文件夹中的rt.jar

Extension ClassLoader - 存储在ext文件夹中的jar文件或ext

的环境变量中指定的文件

System ClassLoader - 应用程序的类路径或在类路径的环境变量中指定,或通过JVM的-cp或-classpath的启动参数参数

CustomClassLader - 根据classLoader的类加载策略(主要在findClass()方法中定义)