这个问题比我上一个问题更进一步:
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,文件系统上的位置)。
答案 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()
方法中定义)