我也有一个问题一直困扰着我,就是单个应用下的所有jar文件里的class是否在应用启动时,全部装载了?我实验过,在应用启动后,如resin,web-inf/lib下的所有jar文件都不能被删除,我觉得应该是全部加载了,但又觉得不太合理,因为应用下的jar文件以及其下的class文件太多了,如果一一枚举加载,势必会影响效率,(在应用启动后,classpath中的jar文件也都不能删除,是否每个类也都已经加载到系统类装载器中了?)望给予指点迷津,谢谢
调试欢乐多
比如一个类A里面要用类B,那么类A先去找parent classloader, parent classloader如果找到了B,好办,如果没找到,parent classloader再去找parent parent classloader直到system classloader. 至于String这种比较特殊,是bootstrap classloader加载的,启动时就加载了。
至于不能删除,我觉得是:因为JAVA语言不需要程序员自己去链接编译好的各个CLASS文件,假如你学过操作系统应该知道系统运行程序,并不是将整个程序读入内存,而只是将可能执行的程序读进来。当发现需要运行的程序还每有装入内存的话,就再次装入那部分程序。操作系统为了要做到这一点。会将一个运行中的可执行程序的硬盘空间映射到代码的虚拟内存中,所以,运行中的程序不能:更名、删除、更改内容,它的任何一级父目录也不能进行此类操作,至于JAVA里面的加载器我想就是这样工作的
JVM只是把lib和class文件和所在的目录锁定,这样在需要的时候就可以找到。类似于Windows中的虚拟内存。