`

JVM学习笔记三 之 ClassLoader

    博客分类:
  • jvm
阅读更多

一、ClassLoader

负责装载class文件;这个文件来源可能是压缩包、网络、运行时编译出的或者自动生成的class文件,jvm spec没有规定必须从什么地方加载。

jvm中默认提供了三种系统类加载器:

1)、启动类加载器Bootstrap ClassLoader,负责加载%JAVA_HOME%\jre\lib目录下的包,

2)、扩展类加载器Ext ClassLoader,负责加载%JAVA_HOME%\jre\lib\ext目录下的包,或者在java.ext.dirs系统变量锁指定的路径中的所有类库

3)、应用程序类加载器App ClassLoader,负责加载用户classpath中的包

用户也可以自定义自己的classloader,来根据自己的需求装载类文件

ClassLoader是双亲委派模型,除了Bootstrap ClassLoader外每个classloader都有自己的父加载器,每个加载器在加载某个类之前,先委托父加载器在其相关的目录加载,如果加载不到,则自己加载。

 

二、ClassLoader扩展的实例

1、Tomcat的类加载体系结构:

为了解决部署的web app与tomcat自身共享一份运行时代码实例、各个web app共享一份运行时代码实例、tomcat自身和各个web app私有的一份运行时代码实例,自定义了几个classloader,用来解决运行时类库的共享和隔离问题

 

其中Common CL是用来加载tomcat和web app共用的类库的;Catalina CL是加载Tomcat专用的类库的;Shared ClassLoader是加载web app共用的;WebApp CL用来加载应用专用的类库的web app下WEB-INF\lib下的包的;Jasper CL用来加载jsp页面,一个页面一个classloader,用来实现热替换的。

在Tomcat v5.5的时候,%CATALINA_HOME%下的common、server、shared分别由Common CL、Catalina CL、Shared CL分别加载;在Tomcat v6,则通过%CATALINA_HOME%/conf/catalina.properties下的common.loader、server.loader、shared.loader分别设置需要相关classloader加载的jar包

2、OSGi的类加载体系结构

OSGi的Bundle之间相互引用,需要Export、Import的,一个Bundle Export出去的类才能被外部的Bundle Import到,外部的包对Import的类的加载也需要Export出该类的Bundle的ClassLoader来完成。每个Bundle一个ClassLoader。

 

3、如果做一个大型CS系统,jar包太多,比如说大于1G甚至更多;然后eclipse里把这些包作为project的library,但是启动client的时候,发现出错了

 

Exception occurred executing command line.   
Cannot run program "D:\Program Files\Java\jdk1.6.0_18\bin\javaw.exe" (in directory "E:\workspace\myproject"): CreateProcess error=87  , ²ÎÊý²»

  搜索发现是因为classpath太长了导致的,启动不了jvm,当然也可以通过虚拟盘,缩短classpath的方式解决该问题,而且是一种不错的办法,但是有没有其他的办法呢?classloader,对,既然classloader把一部分装载类的权利给了我们,我们就要充分利用,我们在启动的时候加上我们自己的classloader,设置上我们自己的classpath,这个path只填写目录名,我们在classloader中扫描目录名,然后把jar文件一个个的放入到classpath中就解决问题了

此处,设置cloassloader的命令行是哪个?设置classpath的命令行是哪个?

 

 

4、系统里边很多jar包,当系统需要加载某个类的时候,需要扫描所有的jar包,找到这个class在不在这个jar文件里头。如果系统里jar包很多,比如说有1g甚至更多,此时这样扫描效率就很低。如果有一种方式知道我某个类就在那个某个包里,一步就定位到了那个包,然后加载,效率岂不是很高?就此问题,我们可以先在应用部署的时候,或者服务器启动的时候,扫描一下所有的jar包,然后在一个文件里写入package路径对应哪个jar文件,比如com.xyz.sis.app = abc.jar。然后自定义一个ClassLoader,classloader在加载的时候缓存上边这个映射结果,直接根据要加载的类的全限定名来定位到相应的jar包,然后加载相关的类,速度不是很快?

jvm的app classloader有没有在扫描完一次所有的jar后,缓存下哪个package对应到那个包,或者是哪个类对应到哪个包?缓存的成本。

 

 

 

 

 

 

分享到:
评论

相关推荐

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    jVM学习笔记.ppt

    JVM的学习可以从其基本结构、代码编译和执行过程,以及内存管理和垃圾回收机制三个方面进行深入探讨。 首先,JVM的基本结构分为逻辑结构和物理结构。逻辑结构主要包括Java源码编译器、JVM执行引擎、类加载器等组件...

    狂神说JVM探究.rar

    这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键知识点的详细解析: 1. **JVM概述**: - JVM是Java平台的核心组成部分,它是一个运行Java字节...

    JVM学习笔记

    ### JVM学习笔记知识点详解 #### 一、JVM的基本结构 **JVM(Java Virtual Machine,Java虚拟机)**是一种可以执行Java字节码的虚拟机。它为Java提供了平台无关性,使得Java代码可以在任何安装了JVM的平台上运行。 ...

    jvm笔记

    JVM 笔记 今天,我们要讨论的是 JVM 的笔记,这个笔记包括了 JVM 的基本结构、类加载机制、类文件...在学习 JVM 的过程中,我们需要掌握这些知识点,并且需要了解 JVM 的内部机制,以便更好地理解 JVM 的工作原理。

    JVM性能学习笔记思维导图

    本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    Java,JVM相关笔记的代码知识

    这份JVM相关的笔记包含了深入理解JVM内部工作机制的关键代码资源,是学习和优化Java应用程序的重要参考资料。下面,我们将深入探讨Java与JVM的相关知识点。 1. **类加载机制**:JVM通过类加载器(ClassLoader)将...

    记录一些自己学习MySQL,JUC,JVM的学习笔记.zip

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储和管理数据。...通过这些笔记,你可以系统地学习和理解MySQL数据库、Java并发编程以及JVM的运作机制,为你的软件开发职业生涯打下坚实的基础。

    Java虚拟机JVM类加载学习笔记

    JVM的类加载器(ClassLoader)负责将编译后的`.class`文件加载到内存中,为程序执行做好准备。当类被加载时,JVM会在内存的运行时数据区的方法区内存储类的信息,并在堆中创建一个`java.lang.Class`对象来封装这些...

    ImagesForJVM-JVM笔记图片

    【描述】"ImagesForJVM——JVM笔记图片" 暗示这些图片可能是教学或学习笔记的一部分,旨在通过视觉化的方式解释JVM的关键概念,如内存模型、类加载机制、垃圾收集以及性能优化等方面。 【标签】"java" 明确了这些...

    JVM学习笔记(一)——类的加载机制

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是类加载机制。类加载机制负责将Java源代码编译成的.class文件转换为内存中的数据结构,以便程序可以执行。本篇将深入探讨类加载机制的原理和过程。 ...

    java学习笔记整理

    【Java学习笔记整理】 Java是一种广泛使用的编程语言,它不仅是一种语言,还是一个软件开发平台和运行环境。Java分为三个主要版本:Java标准版(JSE)、Java缩微版(JME)和Java企业版(JEE)。JSE主要用于桌面应用...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍  《java jdk 7学习笔记》是作者多年来教学实践经验的总结...

    阿里P8 架构师整理Java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 一、JVM与内存管理 **1.1 JVM基本概念** - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程...

    java 学习笔记(经典)

    根据提供的文件信息,这里将对Java学习笔记中的关键知识点进行详细阐述,主要涉及Java语言的基础概念、面向对象编程思想的应用以及Java类加载器的工作原理等内容。 ### Java学习基础 Java是一种广泛使用的高级编程...

    java学习笔记JDK6课件之十六

    Java学习笔记JDK6课件第16章深入讲解了反射机制,这是Java语言中一个强大的特性,允许我们在运行时动态地获取类的信息并进行操作。反射的核心是`java.lang.Class`类,它代表了Java应用程序运行时加载的类或接口实例...

    Java学习笔记

    ### Java学习笔记 #### Java的优势 1. **跨平台(平台=OS)可移植性** - **字节码文件**:Java程序被编译成字节码文件(`.class`),这些文件不包含任何特定于操作系统的内存布局信息。这意味着它们与操作系统和...

    Java学习笔记_内存管理.rar

    这份"Java学习笔记_内存管理.pdf"很可能是详细解析了Java如何进行内存分配、垃圾回收以及内存泄漏等相关概念。下面,我们将深入探讨Java内存管理的一些核心知识点。 1. **Java内存模型**: - **堆内存(Heap)**:...

    J2EE-JDBC学习笔记

    ### J2EE-JDBC学习笔记知识点详述 #### JDBC驱动注册的三种方式 在Java开发中,使用JDBC(Java Database Connectivity)与数据库进行交互前,必须先注册对应的数据库驱动。J2EE环境下,通常有以下三种注册方式: ...

Global site tag (gtag.js) - Google Analytics