大家好,今天给各位分享Tomcat 加载 Java 类的机制的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
说到本篇Tomcat类加载机制,就不得不说说翻译学习Tomcat的初衷。
之前实习的时候研究过JavaMelody的源码,但是它是一个Maven项目,和我们自己的Web项目集成后不能直接断点调试。
[[285026]]
现在我们了解了Tomcat的类加载机制,原来一切就是这么简单。
一、类加载在JVM中,所有文件并不是一次性加载的,而是根据需要逐步加载的。
例如,当JVM启动时,会通过不同的类加载器来加载不同的类。当用户自己的代码中需要一些额外的类时,通过加载机制将其加载到JVM中,并存储一段时间以供频繁使用。
因此,使用哪个类加载器以及在哪里加载类是JVM中的重要知识。
二、JVM类加载JVM类加载采用:父类委托机制,如下图所示:
JVM 中包含一个集中式类加载器:
BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用程序类加载器CustomClassLoader 用户自定义类加载器上面也解释了它们的区别。需要注意的是,不同的类加载器加载不同的类,因此如果一个类被用户加载器1加载,其他用户将无法使用它。
当JVM运行时,用户需要加载某些类时,会遵循以下步骤(父类委托机制):
用户自己的类加载器将加载请求传递给父加载器,父加载器又将其传递给其父加载器,一直到加载器树的顶部。顶层类加载器首先加载其具体位置,如果无法加载,则传递给子类。如果直到底层类加载完毕才加载底层类,则会抛出异常ClassNotFoundException。因此,根据这个过程,可以想象,如果CLASSPATH指定的目录和自己的工作目录中存放的是同一个类,那么会先加载CLASSPATH目录下的文件。
三、Tomcat类加载Tomcat中类的加载略有不同,如下图:
Tomcat启动时,会创建几个类加载器:
1、Bootstrap 引导类加载器加载JVM启动所需的类和标准扩展类(位于jre/lib/ext下)
2、System 系统类加载器加载由Tomcat启动的类,例如bootstrap.jar,通常在catalina.bat或catalina.sh中指定。位于CATALINA_HOME/bin 下。
3、Common 通用类加载器加载Tomcat 使用的一些应用程序常用的类,位于CATALINA_HOME/lib 下,例如servlet-api.jar
4、webapp 应用类加载器每个应用程序部署后,都会创建一个唯一的类加载器。类加载器将加载位于WEB-INF/lib 下的jar 文件和WEB-INF/classes 下的类文件中的类。 Tomcat的Server文件配置详解!我推荐大家阅读这篇文章。
当应用程序需要某个类时,该类将按照以下顺序加载:
使用引导类加载器来加载。使用系统类加载器来加载。使用应用程序类加载器加载到WEB-INF/classes 中。使用应用程序类加载器加载到WEB-INF/lib中。使用通用类加载器加载到CATALINA_HOME/lib中。加载四、问题扩展通过上面对Tomcat类加载机制的了解,我们不难理解为什么在Eclipse中放在src文件夹下的Java文件会优先考虑jar包中的类呢?
这是因为Tomcat启动时,Eclipse中src文件夹中的Java文件和webContent中的JSP会被编译成class文件并放置在WEB-INF/class中。
Eclipse外部引用的jar包相当于放在WEB-INF/lib下。
因此,必须首先加载从Java文件或JSP文件编译的类。
这样,我们就可以简单地将Java文件放在src文件夹中。通过修改和调试Java文件,我们可以轻松得知有源代码Java文件但未打包成xxx-source的jar包。
此外,开发者还可能因粗心而犯以下错误。
CATALINA_HOME/lib和WEB-INF/lib中放置了不同版本的jar包,某些情况下会出现类无法加载的错误。
另外,如果多个应用程序使用同一个jar包文件并且放置了多个副本,则可能会导致多个应用程序之间的类加载错误。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7861.html
用户评论
终于找到关于 Java 类加载机制的文章了,一直想了解下tomcat是怎么完成这个工作的
有18位网友表示赞同!
Tomcat 这么个高手的应用服务器,它的内部逻辑肯定很让人期待!
有10位网友表示赞同!
这篇文章能解释 Tomcat 为什么有自己的类加载方式吗?
有9位网友表示赞同!
看了标题就知道这篇文一定会让我对 Java 类加载机制有个更深入的理解!
有14位网友表示赞同!
学习Java 开发就少不离了解类的加载过程啊,这样才能更高效地编写代码
有19位网友表示赞同!
我正准备学习 Tomcat,这篇文章能给我提供一个很好的入门点!
有11位网友表示赞同!
Java 类加载机制确实很复杂,希望这篇文章能解释得通俗易懂
有13位网友表示赞同!
Tomcat 和Spring Boot的区别很大吗?听说它们在类加载方面也有差异。
有5位网友表示赞同!
学习 Java 就需要知道这些底层的原理才能运用得更灵活.
有15位网友表示赞同!
我已经接触过一些 Servlet 开发了,关于 Tomcat 的理解还是不够全面
有20位网友表示赞同!
看来这篇文章会提到 ClassLoader 的角色和工作流程吧?
有16位网友表示赞同!
Java 中各种虚拟机的类加载机制有什么区别?
有15位网友表示赞同!
这篇文章也能讲讲不同 Java 版本的类加载机制变化吗?
有17位网友表示赞同!
我正在开发一个基于 Tomcat 的 WEB 项目,这篇文能帮我解决一些技术难题!
有17位网友表示赞同!
理解类的加载机制有助于我们更好地调试和优化 Java 应用啊!
有8位网友表示赞同!
学习到这些原理不仅对开发有帮助,也能提高我对计算机的认知水平。
有10位网友表示赞同!
期待这篇文章能让我从零基础入门 Java 类加载机制!
有12位网友表示赞同!
感谢作者分享这篇 informative 的文章!
有13位网友表示赞同!
希望这篇文章不仅讲理论,还能提供一些实践示例!
有14位网友表示赞同!