首页 > 试题广场 >

下面有关 java 类加载器,说法正确的是?()

[不定项选择题]
下面有关 java 类加载器,说法正确的是?()
  • 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用C++来实现的
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
  • tomcat 为每个 App 创建一个 Loader,里面保存着此 WebApp 的 ClassLoader。需要加载 WebApp 下的类时,就取出 ClassLoader 来使用

类的加载是由类加载器完成的,类加载器包括:根加载器( BootStrap )、扩展加载器( Extension )、系统加载器( System )和用户自定义类加载器( java.lang.ClassLoader 的子类)。从 Java 2 JDK 1.2 )开始,类加载过程采取了父亲委托机制( PDM )。 PDM 更好的保证了 Java 平台的安全性,在该机制中, JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。 JVM 不会向 Java 程序提供对 Bootstrap 的引用。下面是关于几个类加载器的说明:

  • Bootstrap :一般用本地代码实现,负责加载 JVM 基础核心类库( rt.jar );
  • Extension :从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap
  • system class loader :又叫应用类加载器,其父类是 Extension 。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。
  • 用户自定义类加载器: java.lang.ClassLoader 的子类

    父类委托机制是可以修改的,有些服务器就是自定义类加载器优先的。
编辑于 2016-03-26 10:34:20 回复(16)

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。


发表于 2015-11-13 11:33:05 回复(2)
A的说法,只适于Hot Spot,像MRP、Max in e等虚拟机,整个虚拟机本身都是由Java编写的,Boot st rap  ClassL oader也是由Java语言而不是C++实现的
发表于 2020-06-22 19:52:35 回复(1)


编辑于 2019-10-21 16:52:09 回复(2)

1. 启动类加载器

负责将存放在 < JAVA_HOME > \lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib中也不会被加载)类库加载到虚拟机内存中。

2. 扩展类加载器

扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载< JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器

3. 应用程序类加载器 
应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$App-ClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(classPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认类加载器。

发表于 2016-11-04 21:18:15 回复(2)
《深入理解java虚拟机》上面说有一些bootstrapClassLoader不是用c++写的,比如全部使用java写的虚拟机如mrp等,就用java写的,所以A是有点问题的
发表于 2016-05-12 10:52:44 回复(2)
c***就c***。。非要说什么原生代码 搞得我以为是java原生代码选错了 服了
发表于 2018-09-14 00:55:51 回复(2)
发表于 2022-03-26 22:16:39 回复(1)
系统类加载器是什么鬼,不是应用程序类加载器吗,深入jvm里面写的
发表于 2016-03-09 23:17:56 回复(3)
1)Bootstrap ClassLoader
 
负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
 
2)Extension ClassLoader
 
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定
目录下的jar包
 
3)App ClassLoader
 
负责记载classpath中指定的jar包及目录中class
 
4)Custom ClassLoader
 属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
 加载过程中会先检查类是否被已加载,检查顺序是自底向上,
从Custom ClassLoader到BootStrap ClassLoader逐层检查,
只要某个classloader已加载就视为已加载此类,保证此类
只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

发表于 2015-12-14 12:52:27 回复(1)
1)Bootstrap ClassLoader 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包 3)App ClassLoader 负责记载classpath中指定的jar包及目录中class 4)Custom ClassLoader 属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
发表于 2019-03-04 23:44:31 回复(0)
类的加载是由类加载器完成的,类加载器包括:根加载器(   BootStrap   )、扩展加载器(   Extension   )、系统加载器(   System   )和用户自定义类加载器(   java.lang.ClassLoader   的子类)。从   Java 2     JDK 1.2   )开始,类加载过程采取了父亲委托机制( PDM   )。   PDM   更好的保证了   Java   平台的安全性,在该机制中,   JVM   自带的   Bootstrap   是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。   JVM   不会向   Java   程序提供对   Bootstrap   的引用。
1)Bootstrap ClassLoader
 
负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
 
2)Extension ClassLoader
 
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
 
3)App ClassLoader
 
负责记载classpath中指定的jar包及目录中class
 
4)Custom ClassLoader
 
属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
 
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,
只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,
也就是由上层来逐层尝试加载此类。

发表于 2016-06-23 23:10:44 回复(0)
一直觉得多选题有一大堆文字的选项肯定对😂
发表于 2020-03-07 20:50:18 回复(0)
记住!
发表于 2018-08-15 16:17:39 回复(0)
Bootstrap ClassLoader负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,所以cpp是原生代码?表述有问题
发表于 2018-05-16 22:10:55 回复(0)
tomcat 那块,我记得tomcat类加载是自上而下,而找不到后,就得从jvm父类委托了
发表于 2017-04-17 19:12:28 回复(0)
1)Bootstrap ClassLoader 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包 3)App ClassLoader 负责记载classpath中指定的jar包及目录中class 4)Custom ClassLoader 属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
发表于 2016-12-09 12:24:56 回复(0)
1)Bootstrap ClassLoader 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包 3)App ClassLoader 负责记载classpath中指定的jar包及目录中class 4)Custom ClassLoader 属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
发表于 2016-09-23 13:08:22 回复(0)
  1. 启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中的。
  2. 扩展类加载器(Extension ClassLoader): 它负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
  3. 应用程序类加载器(Application ClassLoader): 它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义自己的类加载器,一般情况下这个就是程序中默认的类加载器。
发表于 2016-07-14 20:13:07 回复(0)
A,引导类加载器加载核心库,用c++实现
发表于 2016-05-11 22:25:18 回复(0)