首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tomcat 加载机制

,才会真正建立 Catalina ClassLoader 和 Shared ClassLoader 实例,否则在用到这两个加载地方都会用 Common ClassLoader 实例代替,而默认配置文件是没有设置这两个...loader 项 (4)WebApp ClassLoader:Tomcat 可以存在多个 WebApp ClassLoader 实例,每个应⽤程序都会有⼀个独⼀⽆⼆ WebApp ClassLoader...有没有加载过这个 (2)如果 Tomcat 没有加载过这个,则从系统加载 cache 缓存查找是否加载过 (3)如果没有,则使用 ExtClassLoader 加载加载,重点来了,Tomcat...当然还有其他原因,: (1)保证 Web 容器自身安全不受部署 Web 应用程序影响,所以 Tomcat 使用库要与部署应用库相互独立 (2)保证部分基础不会被同时加载,有些Tomcat...与部署应用可以共享,比如说 servlet-api (3)保证部署在同一个 Web 容器应用之间库可以共享,这听起来好像主要原因相互矛盾,但其实这很合理,加载加载到虚拟机后,会存放在方法区永久代

65710

JVM学习.03 加载机制

初始化过程: 如果类还没有被加载和连接,那就先进行加载和连接 如果类存在,并且父没有初始化,那就先初始化直接父果类存在初始语句,顺序执行初始化语句 初始化阶段是执行构造器方法clinit...通常,我们会描述两个类比较是否相等,这个比较前提是只有这两个同一加载加载才有意义,否则就算这两个是来源同一个class文件,被同一个JVM加载,只要加载器不同,那就必定不相等(这里相等包括...加载\lib\ext目录,或被java.ext.dirs系统变量所指定路径库。 允许用户库放置在ext目录以扩展JavaSE功能。...1、修改加载方法,tomcat多个war工程可以独立运行;保证了各个warjar不会冲突。 2、防止源码泄露,对class字节码进行编码加密,再在laod过程对其解密。 .........在这之前,如果类路径确实了运行时依赖类型,那就只能等程序运行到发生该类型加载,连接时才会报运行异常。

10210
您找到你想要的搜索结果了吗?
是的
没有找到

今天我们来聊聊JVM加载机制

,也就是说jvm自带加载器所加载,在虚拟机还没有退出时,始终不会被卸载,当然也有特例 :我们自己定义加载是可以被卸载....两个来源于同一个 Class 文件,被同一个虚拟机加载,但是加载它们加载器不同,那这两个也不相等 那有的小伙伴就有疑惑了,还有很多加载器吗? emm..那加载顺序呢?会不会重复加载了?...CLASSPATH环境变量所指定jar路径。...tomcat之所以造了一堆自己classloader,大致是出于下面三个原因: 对于各个 webapp class和 lib,需要相互隔离,不能出现一个应用中加载库会影响另一个应用情况,而对于许多应用...相信大家一定为 tomcat修改文件不用重启就自动重新装载库而惊叹吧。 破坏双亲委派方式 双亲委派机制原则在loadclass方法。只需要绕开loadclass方法即可。

41620

Java加载机制与Tomcat加载器架构

这句话可以表达得更通俗一些:比较两个是否“相等”,只有在这两个是由同一加载加载前提下才有意义。...否则,即使这两个来源于同一个Class文件,被同一个虚拟机加载,只要加载它们加载器不同,那这两个就必定不相等。...1)启动加载器(Bootstrap ClassLoader):前面已经介绍过,这个加载器负责存放在<JAVA_HOME>\lib目录,或者被-Xbootclasspath参数所指定路径,...这是最基本需求,两个不同应用程序可能会依赖同一个第三方不同版本,不能要求一个库在一个服务器只有一份,服务器应当保证两个应用程序库可以互相独立使用。...和Shared ClassLoader实例,否则在用到这两个加载地方都会用Common ClassLoader实例代替,而默认配置文件没有设置这两个loader项,所以Tomcat 6.x

35830

tomcat加载机制了解一下

因此判断是否完全相同,需要以下两个条件即:路径名是否相同、加载加载器是否为同一个,这两个条件决定是否完全相同。...因此当自己在代码内部编写恶意java代码时,比如HashMap文件,如果路径名相同,则会委派给父Bootstrap ClassLoader进行加载,发现在Bootstrap加载lib目录下存在HashMap...所以打破了双亲委派机制,并且在tomcat加载存在打破双亲委派机制情况。...当tomcat存在多个war并同时使用了相同版本jar时,为了减少资源浪费,可以使用该加载器,抽出这些相同版本jar,使用Shared ClassLoader加载一次被共享jar即可,来代替每个...(4)委派tomcatCommonClassLoader是否加载过该类。 (5)当前WebAppClassLoader自己加载该类。 (6)如果类仍然没有加载成功,则抛出异常。

2.2K30

这个面试题有点意思

Java.lang.String 等核心处于同一名下,那么此类就具有访问这些核心 package 方法权限,此外如果用户自定义一个 java.lang.String ,如果类加载加载了这个...Test 加载前也看到了这些核心加载原因 加载都要遵循双亲委派机制吗 不是的,一个典型应用场景就是 Tomcat 加载,由于 Tomcat 可能会加载多个 web 应用,而多个应用很有可能出现名...绿色部分是 java 项目在打 war 时候, tomcat 自动生成加载器, 也就是说 , 每一个项目打成一个war, tomcat都会自动生成一个加载器, 专门用来加载这个 war...,当加载 war 时,首先由 webappClassLoader 加载,而不是首先委托给上一级加载加载,这样的话由于加载每一个 war webappClassLoader 都不一样,...那么这个是在字节码是以符号引用形式存在,所以就要确保真正用到此类时候能找到此类,如果找不到就会报错,举个简单例子,假设有以下两个,显然编译时都能通过,但在编译后如果我把 B.class 删掉

38730

一步之差进入大厂,下定决心钻透java所有面试题,顺利通过!

等 ▪ 扩展加载器:负责加载支撑JVM运行位于JRElib目录下ext扩展目录JAR ▪ 应用程序加载器:负责加载ClassPath路径,主要就是加载你自己写那 些 ▪...我们思考一下:Tomcat是个web容器, 那么它要解决什么问题: 一个web容器可能需要部署两个应用程序,不同应用程序可能会依赖同一个第三方不同版本,不能要求同一库在同一个服务器只有一份,...; ▪ catalinaLoader:Tomcat容器私有的加载器,加载路径class对于Webapp不可见; ▪ sharedLoader:各个Webapp共享加载器,加载路径class...对于所有Webapp可见,但是对于Tomcat容器不可见; ▪ WebappClassLoader:各个Webapp私有的加载器,加载路径class只对当前Webapp可见,比如加载war里相关...模拟实现TomcatwebappClassLoader加载自己war应用内不同版本类实现相互共存与隔离 注意:同一个JVM内,两个相同名和对象可以共存,因为他们加载器可以不一 样,所以看两个对象是否是同一

31300

Java jar ,天天见,可是你知道它运行机制吗?

使用 java.lang.reflect 方法对进行反射调用时候,如果类没有进行过初始化,则需要先触发其初始化。...这样做是确保只会被加载一次。通常我们加载器只识别 classpath (这里 classpath 指项目根路径,也就是 jar 位置)下 .class 文件。...tomcat 加载器: Common 加载器:负责加载 /common 目录库,这儿存放库可被 tomcat 以及所有的应用使用。...我们一堆 jar 放到 tomcat 项目文件夹下, tomcat 运行时候能加载到这些 jar class 就是因为这些加载器对读取到二进制数据进行处理解析从中拿到了需要 SpringBoot...这样就实现了加载 jar jar 这个功能否则正常加载器是无法加载 jar jar class ,只会根据 MAINFEST.MF 来加载 jar 外部 jar 来读取里面的

2.6K20

Tomcat如何打破双亲委派机制实现隔离Web应用

Tomcat负责加载我们Servlet加载Servlet所依赖JARTomcat本身也是个Java程序,因此它需要加载自己和依赖JAR。...所以Web应用之间需要隔离 若两个Web应用都依赖同一三方jar,比如Spring,则Spring jar被加载到内存后,Tomcat要保证这两个Web应用能共享之,即Spring jar只被加载一次...SharedClassLoader 两个Web应用之间怎么共享库,并且不能重复加载相同? 双亲委派机制各子加载器都能通过父加载器去加载,于是考虑把需共享放到父加载加载路径。...CatalinaClassLoader 如何隔离Tomcat本身和Web应用? 兄弟关系:两个加载器是平行,它们可能拥有同一加载器,但两个兄弟加载加载是隔离。...线程上下文加载器 于是有了线程上下文加载器,一种加载器传递机制。因为该类加载器保存在线程私有数据里,只要是同一个线程,一旦设置了线程上下文加载器,在线程后续执行过程中就能把这个加载器取出来用。

1.6K10

JVM-加载子系统

一、加载: 通过一个全限定名获取定义此类二进制字节流 这个字节流所代表静态存储结构转化成方法区运行时数据结构 在内存中生成一个代表这个java.lang.Class对象,作为方法区这个各种数据访问入口...,因为final在编译时候会分配,准备阶段会显式初始化 这里不会为实例变量分配初始化,变量会分配在方法区,而实例变量是会随着对象一起分配到Java堆 解析 常量池内符号引用转换为直接引用过程...如果类加载器还存在其父加载器,则进一步向上委托,依次递归请求最终到达顶层启动加载器 如果父加载器可以完成,就成功返回,如果类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制...优势: 避免重复加载 保护程序安全,防止核心API被随意修改 在JVM中标识两个class对象是否为同一存在两个必要条件: 完整名必须一直,包括加载这个ClassLoader...(指ClassLoader实例对象)必须相同 在JVM,即使两个对象来源同一个Class文件,被同一个虚拟机加载,但只要加载他们ClassLoader实例对象不同,那么这两个对象也是不相等

21230

Tomcat如何打破双亲委派机制实现隔离Web应用

Tomcat负责加载我们Servlet加载Servlet所依赖JARTomcat本身也是个Java程序,因此它需要加载自己和依赖JAR。...所以Web应用之间需要隔离 若两个Web应用都依赖同一三方jar,比如Spring,则Spring jar被加载到内存后,Tomcat要保证这两个Web应用能共享之,即Spring jar只被加载一次...SharedClassLoader 两个Web应用之间怎么共享库,并且不能重复加载相同? 双亲委派机制各子加载器都能通过父加载器去加载,于是考虑把需共享放到父加载加载路径。...CatalinaClassLoader 如何隔离Tomcat本身和Web应用? 兄弟关系:两个加载器是平行,它们可能拥有同一加载器,但两个兄弟加载加载是隔离。...线程上下文加载器 于是有了线程上下文加载器,一种加载器传递机制。因为该类加载器保存在线程私有数据里,只要是同一个线程,一旦设置了线程上下文加载器,在线程后续执行过程中就能把这个加载器取出来用。

1.1K20

Tomcat - 都说Tomcat违背了双亲委派机制,到底对不对?

JVM 运行实例中会存在多个 ClassLoader,不同 ClassLoader 会从不同地方加载字节码文件。...---- AppClassLoader AppClassLoader才是直接面向我们用户加载器,它会加载 Classpath 环境变量里定义路径 jar 和目录。...我们知道Tomcat可以部署多个应用,不同应用程序可能会依赖同一个第三方不同版本,不能要求同一库在同一个服务器只有一份,因此要保证每个应用程序库都是独立,保证相互隔离 ....部署在同一个web容器相同库相同版本可以共享, 比如jdk核心jar,否则,如果服务器有n个应用程序,那么要有n份相同加载进虚拟机。...---- 常见错误 NoClassDefFoundError NoClassDefFoundError : 由于JVM或者加载实例尝试加载类型定义,但是该定义却没有找到,影响了执行路径

90430

正统加载Tomcat

主流Java Web服务器,Tomcat、Jetty、WebLogic、WebSphere或其他笔者没有列举服务器, 都实现了自己定义加载器,而且一般还都不止一个。...因为一个功能健全Web服务器,都要解决 如下这些问题: 部署在同一个服务器上两个Web应用程序所使用Java库可以实现相互隔离。...(WebApp加载器) 部署在同一个服务器上两个Web应用程序所使用Java库可以互相共享。(Shared加载器) 服务器需要尽可能地保证自身安全不受部署Web应用程序影响。...被放置到不同路径库,具备不同访问范围和服务对象,通常每一个目录都会有一个相应自定义加载器去加载放置在里面的Java库。...和share.loader项后才会 真正建立Catalina加载器和Shared加载实例,否则会用到这两个加载地方都会用 Common加载实例代替,而默认配置文件并没有设置这两个

34430

Java Class冲突定位思路

却只有getXX(A) 4、在数据在运算神秘失踪,方法A jar中有方法void A(B b),C调用A方法传入对象 b和AjarB加载是有冲突B。...部署在同一tomcat项目使用基础jar要尽量统一,从制度和规范上解决这个问题。最好能一个公司统一依赖库,maven是个不错管理方式,公司按照统一步调处理依赖项。...5、对于不能移除可以通过控制jar加载顺序 6、确认不需要jar是否已经真从相关路径移除。...个人就曾遇到从项目的依赖项把jar去掉了,但是lib路径下仍存在这个jar导致仍然被打到里去了,活活郁闷两天。...这种加载机制也能给我带来便利性一面。 比如我们要修改jar AB实现,而我们又没有源代码,此时这种加载机制就很有用了。 我们只需要在项目的src按照B名搭建即可。

76920

深度分析:Java加载机制和加载

如果在数组初始化时没有对数组各元素赋值,那么其中元素根据对应数据类型而被赋予默认零值 如果类字段字段属性表存在ConstantValue属性,即同时被final和static修饰,那么在准备阶段变量...一旦一个加载JVM同一就不会被再次载入了。正如一个对象有一个唯一标识一样,一个载入JVM也有一个唯一标识。...例如,如果在pg中有一个名为Person,被加载器ClassLoader实例kl负责加载,则该Person对应Class对象在JVM中表示为(Person.pg.kl)。...安装目录,下同)下,或被-Xbootclasspath参数指定路径,并且能被虚拟机识别的库(rt.jar,所有的java....自定义加载器 Custom ClassLoader:通过继承java.lang.ClassLoader根据自身需要自定义ClassLoader,tomcat、jboss都会根据j2ee规范自行实现ClassLoader

65520

《深入理解 Java 虚拟机》学习 -- 加载机制

方法对进行反射调用时,如果类没有进行过初始化,则需要先触发其初始化 当初始化一个时候,如果发现其父还没有进行过初始化,则需要先触发其父初始化 当虚拟机启动时,用户需要指定一个要执行...举个例子: // 变量 value 在准备阶段过后初始值为 0 而不是 123 public static int value = 123; 特殊情况:如果类字段字段属性表存在 ConstantValue...直接引用是与虚拟机实现地内存布局相关同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。如果有了直接引用,那引用目标必定已经在内存存在。...比较两个是否 "相等" 只有在这两个是由同一加载加载前提之下才有意义,否则,即使这两个是来源于同一个 Class 文件,只要它们加载器不同,那这两个就必定不相等。...不同加载器(Java 开发人员角度) 启动加载器:与上述一致 负责存放在 \lib 目录,或者被 -Xbootclasspath 参数所指定路径,并且是虚拟机识别的加载到虚拟机内存

30450

我真不信,这年头还有人能懂SpringBootClassLoader加载机制

如果使用JDK默认双亲委派模式,Tomcat加载器可以加载吗?我们思考一下Tomcat作为一个Web容器使用场景。 在Web容器,可能同时需要部署两个以上应用程序。...一个典型场景是不同应用程序会依赖同一个第三方不同版本,不能要求同一库在同一个服务器只有一份,因此要保证每个应用程序库都是独立,保证相互隔离。...Tomcat如果使用默认加载器,是无法加载两个相同类库不同版本。...其中: ● Common ClassLoader:Tomcat最基本加载器,加载路径Class可以被Tomcat容器本身及各个WebApp访问。...● Catalina ClassLoader:Tomcat容器私有的加载器,加载路径Class对于WebApp不可见。

3.5K20

java加载器挖坑记

加载器分类Java虚拟机定义了三个主要加载器:启动加载器(Bootstrap Class Loader)负责存放在\lib等目录,或者被-Xbootclasspath参数所指定路径...,并且是虚拟机识别的(仅按照文件名,rt.jar)加载到虚拟机内存。...其他笔记同一尽量不要通过不同加载加载,因为多个加载器间可能时相互隔离,如果类存在变量或者线程变量在使用时可能由于加载器不一致导致数据异常。...运行过程如果需要动态加载多个,需要注意按需卸载避免内存溢出。Tomcat实现自定义加载器在不同webapp之间会创建不同加载实例,他们加载应用是隔离,不完全遵循双亲委派模型。...比如:通过javaagent对Serverlet进行拦截,那这个对同一Tomcat下所有webapp都生效

34040

05 Java 和对象

命名空间进行有效划分,同一不能有两个同名. Java 系统提供库也成为Java API, 是系统提供已实现标准集合。...建立 创建就是在指定目录路径下创建一个子文件夹,这个中所有字节码文件存放在该文件夹下。...编译后将在当前目录自动创建 test 子目录 引用 同一个包下之间互相引用是不需要,可以直接使用。但如果类不在同一内,则必须要知道其所在。...例: import java.util.Date; 然后在程序可以直接通过名创建对象, :new Date(); 用 import 语句加载整个, 用*号代替名位置。...总结来说,import 是编译时概念,用于确定完全限定名,在运行时,只根据完全限定名寻找并加载,编译和运行时都依赖路径路径 jar 文件会被解压缩用于寻找和加载

60510

Tomcat源码篇】自定义加载器那点儿事儿

Tomcat进阶篇 一、聊聊ClassLoader那些事儿   我们要分析清楚Tomcat加载器相关内容之前我们还是需要把JVM加载器给大家理清楚。...在Web容器我们应该要满足如下特性: 隔离性:   部署在同一个Web容器上两个Web应用程序所使用Java库可以实现相互隔离。...如果采用一个加载器,之间依赖是杂乱复杂,无法完全移出某个应用。 性能:   性能也是一个比较重要点。部署在同一个Web容器上两个Web应用程序所使用Java库可以互相共享。.../catalina.properties配置,具体介绍下: Common:以应用加载器为父,是tomcat顶层公用加载器,其路径由conf/catalina.propertiescommon.loader...首先,Common加载器复杂加载Tomcat应用服务器内部和Web应用均可见Servlet规范相关和一些通用工具

67210
领券