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

简介: 类加载及执行子系统的案例与实战 一、概述 在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里面加载器之间的关系不再是双亲委派模型的树形结构,而是更为复杂的运行时才能确定的网状结构。

相关文章
|
7月前
|
存储 监控 安全
JVM工作原理与实战(五):类的生命周期-加载阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的加载阶段等内容。
87 5
|
7月前
|
监控 安全 Java
JVM工作原理与实战(七):类的生命周期-初始化阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的初始化阶段等内容。
61 5
|
7月前
|
存储 安全 Java
JVM工作原理与实战(六):类的生命周期-连接阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的连接阶段等内容。
66 4
|
存储 Java
【面试题精讲】JVM*类的生命周期*加载阶段
【面试题精讲】JVM*类的生命周期*加载阶段
|
安全 前端开发 Java
JVM概述和类加载子系统
我记得当年学java的时候,就很好奇,为什么我在IDEA上写一些代码(其实就是一堆我们人能知道的英文单词的组合加一些运算符),为什么就可以在windows上运行后执行我们的指令,而且还可以打成jar包去linux系统跑起来,为什么一份代码可以在不同平台运行呢?类是如何加载的?对象如何创建的以及都有哪些信息?我创建的对象被分配到哪个内存去了?java是怎么和我们操作系统打交道的又是怎么调用CPU为我们计算的?创建了对象分配了内存,为什么可以不用手动回收就可以自动清理内存等等等,相信你也同样有过这些困惑。
84 0
|
存储 安全 前端开发
JVM- 第二章-类加载子系统
JVM- 第二章-类加载子系统
79 0
|
存储 Java
【JVM原理探索】带你梳理分析虚拟机栈映射源代码的流程
【JVM原理探索】带你梳理分析虚拟机栈映射源代码的流程
142 0
【JVM原理探索】带你梳理分析虚拟机栈映射源代码的流程
java线程的三种创建方式详细分析(全)
目录前言1. 继承Thread类2. 实现Runnable 接口3. 通过Callable和Future创建线程4. 总结 前言 关于线程这部分内容讲的比较多,可看我之前的文章 【操作系统】线程与进程的深入剖析(全) 【操作系统】守护线程和守护进程的区别 对于线程Thread的分析 也可看我之前的文章 java之Thread类详细分析(全) java之Thread类实战模板(全) 多线程中run()和start()的异同详细分析(全) 对于创建方式的汇总以及方式 可看我这篇文章的总结对比 1. 继承
105 0
java线程的三种创建方式详细分析(全)
|
PHP 开发者
类的加载(概念和步骤)|学习笔记
快速学习类的加载(概念和步骤)