我也有一个问题一直困扰着我,就是单个应用下的所有jar文件里的class是否在应用启动时,全部装载了?我实验过,在应用启动后,如resin,web-inf/lib下的所有jar文件都不能被删除,我觉得应该是全部加载了,但又觉得不太合理,因为应用下的jar文件以及其下的class文件太多了,如果一一枚举加载,势必会影响效率,(在应用启动后,classpath中的jar文件也都不能删除,是否每个类也都已经加载到系统类装载器中了?)望给予指点迷津,谢谢

解决方案 »

  1.   

    不是的,用到的时候才加载
    比如一个类A里面要用类B,那么类A先去找parent classloader, parent classloader如果找到了B,好办,如果没找到,parent classloader再去找parent parent classloader直到system classloader. 至于String这种比较特殊,是bootstrap classloader加载的,启动时就加载了。
      

  2.   

    肯定是动态加载的,要那样的话你的程序很大了,内存根本不够。
    至于不能删除,我觉得是:因为JAVA语言不需要程序员自己去链接编译好的各个CLASS文件,假如你学过操作系统应该知道系统运行程序,并不是将整个程序读入内存,而只是将可能执行的程序读进来。当发现需要运行的程序还每有装入内存的话,就再次装入那部分程序。操作系统为了要做到这一点。会将一个运行中的可执行程序的硬盘空间映射到代码的虚拟内存中,所以,运行中的程序不能:更名、删除、更改内容,它的任何一级父目录也不能进行此类操作,至于JAVA里面的加载器我想就是这样工作的
      

  3.   

    或者是WEB服务器自己保护LIB下的JAVA包吧
      

  4.   

    JVM只是打开了这个jar文件,但是里面的类并非全部加载的
      

  5.   

    不是全部加载的。
    JVM只是把lib和class文件和所在的目录锁定,这样在需要的时候就可以找到。类似于Windows中的虚拟内存。
      

  6.   

    如果不是全部加载的话,那每次使用时,就要查找此类,在几十个jar文件、成千个class中递归寻找此类,然后再加载,这个显然会影响效率,jvm或web服务器是否会这样做呢?是否会有一个只是记住文件名的操作,当需要加载时,先根据文件名查找此类的物理位置,再进行加载操作?