类加载及执行子系统的案例与实战

简介: 类加载及执行子系统的案例与实战 一、概述 在Class文件格式与执行引擎这部分中,Class文件以何种格式存储,类型何时加载、如何连接以及虚拟机如何执行字节码指令等都是由虚拟机直接控制行为,用户程序无法对其进行改变。

一、概述

在Class文件格式与执行引擎这部分中,Class文件以何种格式存储,类型何时加载、如何连接以及虚拟机如何执行字节码指令等都是由虚拟机
直接控制行为,用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成与类加载器这两部分。

二、案例分析

1、Tomcat:整体的类加载器架构

主流的java web服务器,如Tomcat、Jeety、WebLogic、WebSphere等都实现了自己定义的类加载器,因为他们需要解决一下问题:

  • 1、部署在同一个服务器上的两个Web应用程序所使用的Java类库可以实现隔离(如不用应用程序依赖不同版本的第三方库)
  • 2、部署在同一个服务器上的两个Web应用程序所使用的Java类库可以互相共享(如使用同一个Spring)
  • 3、服务器需要尽可能保证自身的安全不受部署Web应用程序影响。
  • 4、支持JSP应用的Web服务器大多需要支持HotSwap(热替换)功能,即JSP文件修改后无需重启

通过加装路径来解决上述问题

Tomcat目录结构中,有3组目录:/common/、/server/ 、/shared/ 可以存放Java类库,web应用程序自身的目录/WEB-INF/也可以;

  • /common目录中:类库可以被Tomcat和所有web应用程序共同使用
  • /server目录中:类库仅能被Tomcat使用
  • /shared目录中:可以被所有Web应用程序使用,Tomcat自身不可见
  • 放置在/WEBApp/WEB-INF目录中:仅可以被此Web应用程序使用

Tomcat 6.x以后/common、/server、/shared合并为/lib目录

2、OSGi:灵活的类加载器架构

OSGi:Open Service Gateway initiative 是由 OSGi联盟制订的一个基于Java语言的动态模块化规范

OSGi里,模块间的依赖关系从传统的上层模块依赖底层模块转变为平级模块之间的依赖,而且类库可见性控制精确,还可能实现模块级别热插拔。
上述功能都有因为OSGi可以灵活的类加载架构,OSGi 的模块类加载器之间只有规则,没有固定委派关系。
OSGi里面加载器之间的关系不再是双亲委派模型的树形结构,而是更为复杂的运行时才能确定的网状结构。

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
|
4月前
|
Android开发 内存技术
fastboot工具的常见命令及其用途
`fastboot boot <文件名>.img`:不将其flash到设备上,而是直接从给定的img文件启动。这是测试新的或修改后的boot镜像而不实际安装的好方法。
1997 18
|
2月前
|
安全 数据管理 关系型数据库
Dify on DMS,快速构建开箱即用的客服对话数据质检服务
本文介绍基于 Dify 与阿里云数据管理服务 DMS 的智能客服对话质检解决方案。该方案通过集成 Dify 的 AI 能力与 DMS 的数据管理能力,实现从数据获取到质检分析的全链路闭环,提升客服质检效率与准确性,助力企业数字化转型。
304 20
|
10月前
|
存储 缓存 Java
Java 线程池常见误区
线程池是Java中处理并发任务的重要机制,Doug Lea对其进行了封装,简化了使用。然而,若不理解其内部实现,容易在配置参数时产生误解。核心池内的线程会在提交任务时逐步创建至核心线程数,而非仅在运行时创建。BlockingQueue作为缓冲区,能应对突发流量,但配置不当会导致任务被拒绝。配置线程池时需考虑QPS、任务执行时间及GC影响,并留出冗余以确保稳定性。深入理解源码有助于灵活配置线程池,避免潜在问题。
151 7
Java 线程池常见误区
|
缓存 NoSQL 安全
Redis缓存雪崩、击穿、穿透解释及解决方法,缓存预热,布隆过滤器 ,互斥锁
Redis缓存雪崩、击穿、穿透解释及解决方法,缓存预热,布隆过滤器 ,互斥锁
852 5
|
缓存 网络协议 安全
DNS缓存中毒
【8月更文挑战第20天】
551 1
|
程序员 vr&ar C语言
C/C++静态库和动态库的制作、使用、优缺点
C/C++静态库和动态库的制作、使用、优缺点
408 0
|
测试技术
你真的知道什么是冒烟测试吗?
你真的知道什么是冒烟测试吗?
852 0
你真的知道什么是冒烟测试吗?
|
Java Python
如何设置代理ip服务器地址
如何设置代理ip服务器地址
521 0