Ⅰ 北大青鸟java培训:Tomcat的类加载器架构
主流的Web服务器(也就是Web容器),如Tomcat、Jetty、WebLogic、WebSphere或其他笔者没有列举的服务器,都实现了自己定义的类加载器(一般都不止一个)。
因为一个功能健全的Web容器,要解决如下几个问题:1)部署在同一个Web容器上的两个Web应用程序所使用的类库可以实现相互隔离。
这是最基本的需求,两个不同的应用程序可能会依赖同一个第三方类库的不同版本,不能要求一个类库在一个服务器中只有一份,服务器应当保证两个应用程序的类库可以互相独立使用。
2)部署在同一个Web容器上的两个Web应用程序所使用的类库可以互相共享。
这个需求也很常见,例如,用户可能有10个使用Spring组织的应用程序部署在同一台服务器上,如果把10份Spring分别存放在各个应用程序的隔离目录中,将会是很大的资源浪费——这主要倒不是浪费磁盘空间的问题,而是指类库在使用时都要被加载到Web容器的内存,如果类库不能共享,虚拟机的方法区就会很容易出现过度膨胀的风险。
3)Web容器需要尽可能地保证自身的安全不受部署的Web应用程序影响。
目前,有许多主流的Web容器自身也是使用语言来实现的。
因此,Web容器本身也有类库依赖的问题,一般来说,基于安全考虑,容器所使用的类库应该与应用程序的类库互相独立。
4)支持JSP应用的Web容器,大多数都需要支持HotSwap功能。
我们知道,JSP文件最终要编译成Class才能由虚拟机执行,但JSP文件由于其纯文本存储的特性,运行时修改的概率远远大于第三方类库或程序自身的Class文件。
而且ASP、PHP和JSP这些网页应用也把修改后无须重启作为一个很大的“优势”来看待,因此“主流”的Web容器都会支持JSP生成类的热替换,当然也有“非主流”的,如运行在生产模式(ProctionMode)下的WebLogic服务器默认就不会处理JSP文件的变化。
由于存在上述问题,在部署Web应用时,单独的一个ClassPath就无法满足需求了,所以各种Web容都“不约而同”地提供了好几个ClassPath路径供用户存放第三方类库,这些路径一般都以“lib”或“classes”命名。
被放置到不同路径中的类库,江西电脑培训http://www.kmbdqn.cn/认为具备不同的访问范围和服务对象,通常,每一个目录都会有一个相应的自定义类加载器去加载放置在里面的类库。
现在,就以Tomcat容器为例,看一看Tomcat具体是如何规划用户类库结构和类加载器的。
Ⅱ java的类加载器有哪些,它们的顺序是什么
类加载器有四种,分别是 bootstrapClassLoader (主要加载java核心api) , ExtClassLoaders是扩展类的类加载器,AppClassLoader 程序类加载器,还有一个是用户继承ClassLoader重写的类加载器。
Ⅲ Java有哪些类加载器
凤求凰凤求凰王安石诗作王安石诗作我国最早的诗体是四言的“诗经体”,接着出现了以屈原《离骚》为代表的“楚辞体”(也叫“骚体诗”),后者用连词“之”和语气助词“兮”将句式变长,如“帝高阳之苗裔兮”(《离骚》)、“操吴戈兮披犀甲”(《国殇》),这为后来的五、七言诗提供了先例。因此,《诗经》与《楚辞》成为中国诗歌之源。至汉代,出现了专门负责搜集各种诗歌、民歌的机构“乐府”,它所搜集的最有影响的是民间诗歌,这就是我们今天还能看到的“汉乐府民歌”。它最大的特点是现实性强,通俗明快,形式上以五言为主。如教材八年级(上)中的《长歌行》及高中课本中的《饮马长城窟行》《十五从军征》等,即是“正宗”的“汉乐府”。汉乐府民歌的内容体式影响了当时及后世的文人诗歌创作,至东汉末年,代表文人五言诗成熟的《古诗十九首》出现,其中吸收了乐府民歌的许多特点,这对古诗体式的发展起到了推动作用。尤其是在魏晋南北朝及唐代,汉乐府的发展衍变形成两种主要的形式。一种是文人以模拟为创作的“古题乐府”(也叫“旧题乐府”),它借用“汉乐府”的题目,写新的内容,犹如“旧瓶装新酒”,如曹操的《步出夏门行》((七上)、杨炯的《从军行》、李贺的《雁门太守行》(九下)、李白的《蜀道难》《将进酒》(高中)等。这些诗歌的特点是虽沿用了汉乐府的题目,但写的内容是新的,不过与原题有一定的联系,如“从军行”与军队军事有关,“雁门太守行”与边塞有关。文人模拟乐府在内容上从汉乐府的叙事为主转变为以抒情为主;在形式、手法上,则借鉴其通俗明快而又加以“雅化”,增添了文人色彩,提高了艺术品位。“古题乐府”有五言与七言两种形式。七言的古题乐府,今能见到最早的是三国时曹丕的《燕歌行》,至南朝齐梁时的鲍照始大力为之,写出了《拟行路难》(18首)等。乐府诗可以歌唱,而七言乐府体主要是以吟诵为主,在内容篇幅上,一般比较长,吟诵时如行云流水,一气而下。它可以自由转换韵脚来极尽内容多变、结构转折、气势壮阔、感情跌宕多姿之妙,这种诗体适宜于承载较大思想内容、抒发激越奔放之情,既有古乐府通俗明快的特点,又以文人抒情言志为主,形式以七言句式为主,间有杂言,文采飞扬,读来抑扬顿挫,所以人们又称之为“歌行体”。
Ⅳ 在java中,什么是类加载器子系统
java中的类要加载到jvm中才能使用,那么把java类加载到jvm中的工具,就是类加载器。
java内置3种类加载器,BootstrapClassLoader,ExtClassLoader,SystemClassLoader(可能名字不对),第一个是加载jvm启动时需要的类和一些基本java类库,它不是java写的;另外两个都是java写的,用来加载其它java类。
用户自己写的类一般用SystemClassLoader加载,因为它的加载路径是classpath,可以自己设定,一般都会把项目路径设进去
Ⅳ java里有多少个类加载器
系统的类加载器如下
AppClassLoader--------------->ExtClassLoader--------------->BootStrap
* CLASSPATH指定的所有jar或目录 JRE/lib/ext/*.jar JRE/lib/rt.jar
除此之外还可以自定义
Ⅵ java classloader 加载哪些类
BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等
Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar
App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件
Ⅶ 关于java 类的加载过程,下面哪些描述是正确的
关于Java 类的加载过程,下面哪些描述是正确的(A C )
A、在Java 中,有四种类型的类加载器:BootStrapClassLoader、ExtClassLoader、AppClassLoader 以及用户自定义的 ClassLoader。
B、使用 new 关键字创建类实例时,其实就显示地包含了类的加载过程
C、在Java 中,类的实例化流程分为两个部分:类的加载和类的实例化。类的加载又分
为显式加载和隐式加载。
D、Class.forName 来加载类时,是通过ExtClassLoader进行加载的。
Ⅷ 描述一下JVM加载class文件的原理
Java语言是一种具有动态性的解释型语言,类(class)只有被加载到JVM中后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程是由类加载器来完成的,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。
类的加载方式分为隐式加载与显式加载两种。隐式加载指的是程序在使用new等方法创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。显式加载指的是通过直接调用class.forName()方法来把所需要的类加载到JVM中。
任何一个工程项目都是由许多个类组成的,当程序启动时,只把需要加载的类加载到JVM中,其他类只有被使用到的时候才会被加载,采用这种方法,一方面可以加快加载速度,另外一方面可以节约程序运行过程中对内存的开销。此外,在Java语言中,每个类或接口都对应一个.class文件,这些文件可以被看成一个个可以被动态加载的单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加快了编译速度。
Ⅸ Java的ServiceLoader有多个类加载器
JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类。他们主要是分工不一样,各自负责不同的区域,另外也是为了实现委托模型。什么是委托模型呢,其实就是当类加载器有加载需求的时候,先请示他的父类使用父类的搜索路径来加入,如果没有找到的话,才使用自己的搜索路径来来搜索类。
当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。
下面的图形可以表示三者之间的关系:
BootstrapLoader <---(Extends)----AppClassLoader <---(Extends)----ExtClassLoader
这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类:
BootstrapLoader : sun.boot.class.path
ExtClassLoader: java.ext.dirs
AppClassLoader: java.class.path
这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。