当前位置: 首页 > news >正文

JVM:SpringBoot TomcatEmbeddedWebappClassLoader

文章目录

  • 一、介绍
  • 二、SpringBoot中TomcatEmbeddedWebappClassLoader与LaunchedURLClassLoader的关系

一、介绍

TomcatEmbeddedWebappClassLoader 是 Spring Boot 在其内嵌 Tomcat 容器中使用的一个类加载器(ClassLoader)。在 Spring Boot 应用中,当你选择将应用打包成可执行的 JAR 或 WAR 文件,并希望以内嵌的 Tomcat 服务器来运行这个应用时,TomcatEmbeddedWebappClassLoader 就扮演了关键角色。

角色与功能

  • 隔离性:TomcatEmbeddedWebappClassLoader 提供了类加载的隔离性,这意味着不同的 Spring Boot 应用(或应用的不同部分)可以在同一个 JVM 中运行,而不会相互干扰对方的类加载过程。这对于防止类版本冲突等问题非常有用。
  • 动态性:在内嵌 Tomcat 环境中,应用可以动态地加载和卸载类,这在开发过程中特别有用,因为开发者可以实时看到代码更改的效果,而无需重启整个服务器。
  • 优化:这个类加载器还进行了优化,以最小化启动时间和运行时内存占用,这对于生产环境中的高性能应用至关重要。

与 Spring Boot 的关系
在 Spring Boot 的自动配置(Auto-configuration)机制中,当检测到应用应该以内嵌 Tomcat 的形式运行时,Spring Boot 会自动配置 Tomcat 服务器,并选择合适的类加载器(如 TomcatEmbeddedWebappClassLoader)来加载应用的类和资源。

替代方案
虽然 TomcatEmbeddedWebappClassLoader 是 Spring Boot 内嵌 Tomcat 环境的默认选择,但 Spring Boot 也支持其他内嵌服务器,如 Jetty 和 Undertow。每种服务器都有其自己的类加载器实现,以适应不同的需求和环境。

注意事项
在使用 Spring Boot 的内嵌 Tomcat 时,通常不需要直接与 TomcatEmbeddedWebappClassLoader 交互,因为 Spring Boot 的自动配置会为你处理这些细节。
如果你遇到与类加载相关的问题(如类找不到、类版本冲突等),可能需要检查你的项目依赖、Spring Boot 的配置或应用的结构。在某些情况下,你可能需要自定义类加载器来满足特定的需求。这通常涉及到高级配置和可能的代码更改,需要谨慎处理。

总之,TomcatEmbeddedWebappClassLoader 是 Spring Boot 内嵌 Tomcat 环境中一个重要的类加载器,它提供了类加载的隔离性、动态性和优化,以支持高性能的 Spring Boot 应用。

二、SpringBoot中TomcatEmbeddedWebappClassLoader与LaunchedURLClassLoader的关系

org.springframework.boot.loader.LaunchedURLClassLoader是TomcatEmbeddedWebappClassLoader的父类加载器

在这里插入图片描述
sun.misc.Launcher$AppClassLoaderorg.springframework.boot.loader.LaunchedURLClassLoader的父类加载器。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习-4-PyTorch中的数据加载器Dataset和DataLoader
  • Paddle 打包部署
  • Vue 3中使用 Lottie 动画
  • python自动化之validator验证数据【代码示例】
  • STM32智能停车场管理系统教程
  • 如何在SpringCloud中使用Kafka Streams实现实时数据处理
  • Vue3单文件jsx输出多组件示例遇到的坑
  • 树形结构的一种便捷实现方案
  • Go语言--传输文件
  • ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库
  • 修BUG:程序包javax.servlet.http不存在
  • 算法学习day12(动态规划)
  • LabVIEW前面板占满整个屏幕(转)
  • 【操作系统】文件管理——文件管理基础、文件的逻辑结构和目录结构(个人笔记)
  • 高级Puppet manifest编写和模块化管理:构建高效可靠的自动化运维平台
  • es6(二):字符串的扩展
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Fabric架构演变之路
  • Git初体验
  • HashMap ConcurrentHashMap
  • input实现文字超出省略号功能
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java应用性能调优
  • opencv python Meanshift 和 Camshift
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SwizzleMethod 黑魔法
  • vue.js框架原理浅析
  • Vue2 SSR 的优化之旅
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 巧用 TypeScript (一)
  • 区块链共识机制优缺点对比都是什么
  • 写代码的正确姿势
  • 以太坊客户端Geth命令参数详解
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 移动端高清、多屏适配方案
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #ifdef 的技巧用法
  • (1)STL算法之遍历容器
  • (7)STL算法之交换赋值
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)PySpark3:SparkSQL编程
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (理论篇)httpmoudle和httphandler一览
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Standard 的管理策略
  • .NET 的程序集加载上下文
  • .NET 给NuGet包添加Readme
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net环境下的缓存技术介绍