JVM如何开始寻找类?

Tar*_*ngh 10 java jvm classloader

  • 我很好奇JVM查找执行程序的所有位置?我更感兴趣的是了解JVM查找类文件的顺序和位置,比如查看java库,扩展库,类路径等任何目录,比如调用java的当前目录?我对JVM行为更感兴趣,而不是类加载器加载类的方式,我知道它有直到root的父委托机制.

  • 如果从编译类保存在文件系统上的目录以及同一目录中的jar文件中执行类,那么JVM是加载两个还是只加载一个?

  • 假设你有一个不安全的线程Vector,如果我们比较它的性能ArrayList,哪一个会更好,为什么?

Raj*_*n T 7

如何找到课程.答案在这里:

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.html

第2点的答案:查找课程的顺序如下:

  1. 当前目录中的类或包.
  2. 从CLASSPATH环境变量中找到的类.[覆盖1]
  3. 从-classpath命令行选项中找到的类.[覆盖1,2]
  4. 通过-jar命令行选项指定的jar存档中找到的类[覆盖1,2,3]

因此,如果在运行时使用-jar选项,则类来自jarfile.

但是只加载了一个类.


gpe*_*che 7

不使用任何其他类加载器:

  • JVM的搜索顺序:
    1. 运行时类(基本上,rt.jar$JRE_HOME/lib`中)
    2. 扩展类($JRE_HOME/lib/ext`中的一些JAR )
    3. 类路径,按顺序.指定类路径有四种可能性:
      1. 如果-jar已指定,那么该JAR位于类路径中.无论什么类路径被声明为classpath in META-INF/MANIFEST.MF,也要考虑.
      2. 否则,如果-cp已指定,那就是类路径.
      3. 否则,如果$CLASSPATH设置,那就是类路径.
      4. 否则,java已启动的当前目录是类路径.
      所以,如果我指定-cp src/A.jar:src/B.jar,那么A.jar将首先搜索,然后B.jar
  • 根据在类路径中声明目录/ JAR的顺序,JVM仅加载首先找到的类.如果您使用-cp或,这很重要$CLASSPATH.
  • 在单线程场景和最近的JVM中,Vector并且ArrayList应该具有相似的性能(ArrayList应该执行稍微好一些synchronized,但是当没有争用时锁定速度很快,因此差异应该很小).无论如何,Vector已经过时了:不要在新代码中使用它.