OSGi类加载流程】的更多相关文章

思路 OSGi每个模块都有自己独立的classpath.如何实现这一点呢?是因为OSGi采取了不同的类加载机制: OSGi为每个bundle提供一个类加载器,该加载器能够看到bundle Jar文件内部的类和资源: 为了让bundle能互相协作,可以基于依赖关系,从一个bundle类加载器委托到另一个bundle类加载器.   Java和J2EE的类加载模型都是层次化的,只能委托给上一层类加载器: 而OSGi类加载模型则是网络图状的,可以在bundle间互相委托.——这样更合理,因为bundle…
项目中遇到的JVM难点 ——启动OSGi容器时,出现永久代内存不够.内存泄露 ——OSGi找不到类路径问题. ——线程死锁问题.   问题一:OSGi类内存问题         其次,从内存用量来看,OSGi允许不同版本的Package同时存在,这是个优点,但是客观上会占用更多内存.例如,一个库可能需要 ASM 3.0,而同一应用程序使用的另一个库可能需要ASM 2.0,要解决这种问题,通常需要更改代码,而在OSGi中只需要付出一点Java方法区的内存即可解决.           不过,如果对…
首先一个思维导图来看下Tomcat的类加载机制和JVM类加载机制的过程 类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载不同的类.当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用. 因此使用哪种类加载器.在什么位置加载类都是JVM中重要的知识. JVM类加载 JVM类加载采用 双亲委派机制,如下图所示: JVM中包括集中类加载器: 1 BootStrapClass…
这回来分析一下OSGI的类加载机制. 先说一下OSGI能解决什么问题吧. 记得在上家公司的时候,经常参与上线.上线一般都是增加了一些功能或者修改了一些功能,然后将所有的代码重新部署.过程中要将之前的服务关掉,而且不能让客户访问.虽然没回的夜宵都不错,但还是感觉这个过程很麻烦,很别扭. 为什么明明只修改了一部分代码,却都要重新来一遍. OSGI架构里面,很重要的一个理念就是分模块(bundle).如果你只是修改了一个模块,就可以只热替换这个模块,不影响其它模块.想想就很有吸引力.要实现这种功能,类…
背景 由于前前前阵子写了个壳,得去了解类的加载流程,当时记了一些潦草的笔记.这几天把这些东西简单梳理了一下,本文分析的代码基于Android8.1.0源码. 流程分析 从loadClass开始,我们来看下Android中类加载的流程 /libcore/ojluni/src/main/java/java/lang/ClassLoader.java::loadClass loadClass流程如下: protected Class<?> loadClass(String name, boolean…
1.加载 a.装载类的第一个阶段 b.取得类的二进制流 c.转为方法区数据结构 d.在Java堆中生成对应的java.lang.Class对象 2.链接 a.验证(保证Class流的格式是正确的) 文件格式的验证 是否以0xCAFEBABE开头 版本号是否合理 元数据验证 是否有父类 继承了final类? 非抽象类实现了所有的抽象方法 字节码验证 (很复杂) 运行检查 栈数据类型和操作码数据参数吻合 跳转指令指定到合理的位置 符号引用验证 常量池中描述类是否存在 访问的方法或字段是否存在且有足够…
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的呢?中间经过了哪些步骤?常说的双亲委派模式又是怎么回事?本文主要搞清楚这些问题. 类装载流程 1.加载 加载是类装载的第一步,首先通过class文件的路径读取到二进制流,并解析二进制流将里面的元数据(类型.常量等)载入到方法区,在java堆中生成对应的java.lang.Class对象. 2.连接…
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的呢?中间经过了哪些步骤?常说的双亲委派模式又是怎么回事?本文主要搞清楚这些问题. 类装载流程 1.加载 加载是类装载的第一步,首先通过class文件的路径读取到二进制流,并解析二进制流将里面的元数据(类型.常量等)载入到方法区,在java堆中生成对应的java.lang.Class对象. 2.连接…
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的呢?中间经过了哪些步骤?常说的双亲委派模式又是怎么回事?本文主要搞清楚这些问题. 一.类装载流程 1.加载 加载是类装载的第一步,首先通过class文件的路径读取到二进制流,并解析二进制流将里面的元数据(类型.常量等)载入到方法区,在java堆中生成对应的java.lang.Class对象. 2.连…
深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体来看类加载的过程: 类的生命周期 类从被加载到内存中开始,到卸载出内存,经历了加载.连接.初始化.使用四个阶段,其中连接又包含了验证.准备.解析三个步骤.这些步骤总体上是按照图中顺序进行的,但是Java语言本身支持运行时绑定,所以解析阶段也可以是在初始化之后进行的.以上顺序都只是说开始的顺序,实际过…
Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序.本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式(双亲委派模式),然后介绍了几种常见的类加载器及其适用场景,最后则一个例子展示了如何自定义类加载器.本文很多地方参考了java官方文档关于虚拟机加载的教程,点此直达官方参考文档 基本概念 基本文件类型和概念 常见概念介绍: java源文件(.java):.java是Java的源文件后缀,里面存放程序员…
一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日后查阅.若有纰漏请大家指正,谢谢. 注意:以下内容基于JDK7和HotSpot VM. 二.类加载器种类及其关系 从上图可知Java主要有4种类加载器 1. Bootstrap ClassLoader(引导类加载器):作为JVM的一部分无法在应用程序中直接引用,由C/C++实现(其他JVM可能通过Java来实…
MODULE 1 Java的编译和运行----------------------------编译:javac -d bin src\HelloWorld.java -d:指定编译后的class 文件的存放路径 若在此 .java文件的类中,调用了另一个文件的类,则需先编译被调用的类,然后输入 javac -d bin -cp bin src\HelloWorld.java 或者编译所有 .java文件 javac -d bin src\*.java 运行:java -cp bin com.br…
出自 深度理解 osgi equinox 原理 1.2.1 OSGi 能让软件开发变得更容易吗 不可否认,OSGi 的入门门槛在 Java 众多技术中算是比较高的,相对陡峭的学习曲线会 为第一次使用 OSGi 开发系统的开发人员带来额外的复杂度. OSGi 规范由数十个子规范组成,包含了上千个不同用途的 API 接口.OSGi 规范显得这 样庞杂的主要原因是实现“模块化”本身需要解决的问题就非常多.模块化并不仅仅是把系 统拆分成不同的块而已— 这是 JAR 包就能做的事情,真正的模块化必须考虑到…
这段时间跟类加载机制是干上了. 这一篇来分析一下jdbc工作过程中涉及到的类加载流程,重点是想看看在双亲委派模型不适用的时候,如何解决. 第一步,加载数据库的驱动 Class.forName("oracle.jdbc.driver.OracleDriver") Class.forName("com.mysql.jdbc.Driver") Class.forName 方法会根据类的全路径名称去加载对应的class文件,生成类型,并初始化类型.也就是说static语句块…
背景:听说ClassLoader类加载机制是进入BAT的必经之路. ClassLoader总述: 普通的Java开发其实用到ClassLoader的地方并不多,但是理解透彻ClassLoader类的加载机制,无论是对我们编写更高效的代码还是进BAT都大有裨益:而从“黄埔军校”出来的我对ClassLoader的理解都是借鉴了很多书籍和博客,站在了各大博主的肩膀上,感谢你们!上菜,Classloader最主要的作用就是将Java字节码文件(后缀为.class)加载到JVM中,JVM在启动时不会一次性…
osgi最明显的缺陷 bundle尽管可以为隔离的服务建立独立生命周期管理的热部署方式,以及明确的服务导出和导入依赖能力,但是其最终基于jvm,无法对bundle对应的服务实现计算资源的隔离,一个服务的故障依然会导致整个jvm crush,这使得在一个运行时的osgi上部署模块级服务只获得了模块部署和启停隔离,服务明确依赖的好处,但是没办法实现计算节点的线性扩展,在当前分布式,微服务,网络计算的趋势下,使得osgi只适合构建单一服务节点的内部应用,但是其分离的bundle的部署负担对于微服务架构…
内容来源:https://www.ibm.com/developerworks/cn/java/j-springboot-application-integrated-osgi-framework-development/index.html Springboot Application 集成 OSGI 框架开发 张 莹莹2018 年 4 月 02 日发布 WeiboGoogle+用电子邮件发送本页面 0 Java 类加载器 启动类加载器 (Bootstrap ClassLoader) 是 Ja…
简介 Java可能是近20年来最成功的开发技术,因其具备通用性.高效性.平台移植性和安全性而成为不同硬件平台理想的开发工具.从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java技术无处不在. Java能够让程序员使用同一种语言为服务器.智能卡.移动电话和嵌入式设备开发程序,极大地提升了软件的研发效率.不过,仅靠统一的语言还不足以让软件业迅速提升至成熟的工业化阶段.不同软件系统.不同硬件设备下的程序都经常会有相同的业务需求和设备间交互通信的需求,例如很多设备都需要互联网接…
说明:了解ClassLoader前,先了解 第四章 类加载机制 1.ClassLoader作用 类加载流程的"加载"阶段是由类加载器完成的. 2.类加载器结构 结构:BootstrapClassLoader(祖父)-->ExtClassLoader(爷爷)-->AppClassLoader(也称为SystemClassLoader)(爸爸)-->自定义类加载器(儿子) 关系:看括号中的排位:彼此相邻的两个为父子关系,前为父,后为子 2.1.BootstrapClass…
在关于类加载器中已经介绍了Jvm的类加载机制,然而对于运行在Java EE容器中的Web应用来说,类加载器的实现方式与一般的Java应用有所不同.不同的Web容器的实现方式也会有所不同. Tomcat中的类加载机制 在Apache Tomcat 中,为了提高系统的灵活性,引入了commonLoader.sharedLoader.catalinaLoader:为了支持和分隔多个web应用,使用了WebappClassLoader.下面以Tomcat7.0的类加载器结构图总体来看大致如下: Boot…
[正文]Java类加载器(  CLassLoader ) 死磕3:  揭秘 ClassLoader抽象基类 本小节目录 3.1. 类的加载分类:隐式加载和显示加载 3.2. 加载一个类的五步工作 3.3. 如何获取类的加载器 3.4 解刨加载器--ClassLoader抽象基类揭秘 3.5. loadClass 关键源代码分析 3.1. 揭秘ClassLoader抽象基类 3.1.1. 类的加载分类:隐式加载和显示加载 java中类是动态加载的,jvm启动的时候,并不会一次性加载所有的class…
1.ClassLoader作用 类加载流程的"加载"阶段是由类加载器完成的. 2.类加载器结构 结构:BootstrapClassLoader(祖父)-->ExtClassLoader(爷爷)-->AppClassLoader(也称为SystemClassLoader)(爸爸)-->自定义类加载器(儿子) 关系:看括号中的排位:彼此相邻的两个为父子关系,前为父,后为子 2.1.BootstrapClassLoader 下边简称为boot C++编写 为ExtClass…
一.JVM类加载机制 首先需要了解一下类加载器(ClassLoader): ClassLoader是Java的一个核心组件,它主要作用是从系统外部获得Class二进制数据流,然后将数据流装载到系统,交给JVM进行连接,初始化等操作,所有的Class都是有ClassLoader进行加载的. 点开ClassLoader类,如下图所示: 类加载器种类: 启动类加载器(BootStrapClassLoader):它用来加载 Java 的核心类,如java.xxx. 扩展类加载器(ExtensionsCl…
类加载概述 在java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的 类型:class.interface(object本身).类型可在运行期间生成,如动态代理.一种runting概念 加载:最常见的方式是将已经存在的类的字节码文件(.class文件)从磁盘上加载到内存中: 连接:将类与类之间的关系确立下来,对于字节码的一些相关处理.校验在连接阶段完成 初始化:对于一些静态的变量进行复制 过程不是一定按照上述顺序,按照规范即可 提供了更大的灵活性,增加了更多的可能性 本身是静态类型…
Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运行,无需任何调整,大家都知道这是JVM的功劳,但具体是JVM的哪个模块或者什么机制实现这一功能呢? JVM(Java Virtual Machine, Java虚拟机)作为运行java程序的运行时引擎,也是JRE(Java Runtime Environment, Java运行时环境)的一部分. 说…
Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运行,无需任何调整,大家都知道这是JVM的功劳,但具体是JVM的哪个模块或者什么机制实现这一功能呢? JVM(Java Virtual Machine, Java虚拟机)作为运行java程序的运行时引擎,也是JRE(Java Runtime Environment, Java运行时环境)的一部分. 说…
android的安装包是个apk文件,其中包含dex.资源及签名文件.其中dex是包含程序运行的类代码,而android是运行在dalvik(5.0之前)上的.本篇我们就来看下dalvik是如何把dex载入并运行的. 先看整体脉络(重点照顾解析步骤,优化自行查找资料): android在安装apk时会验证dex文件是否符合规范,并优化dex生成odex:接着会将odex文件解析成易于被dalvik加载和执行的dexFile结构体.下面我们就跟随源码看下dex的心路历程吧. apk的安装在java…
1.概述-什么是类加载? 将Class文件从其他地方(外存.字节流甚至是网络流中)载入内存, 并对其中数据进行校验.转换解析和初始化,最终从其中提取出能够被虚拟机使用的Java类型. 用图纸造模子,该模子能够用于生产对象. 运行时再进行类型的加载.链接和初始化虽然带来了一些性能上的影响, 但是也使得Java可以动态扩展.这也是反射等特性的支撑. 类的生命周期:(宏观上的,具体可能会相互交叉嵌套) 1.加载(载入内存,真正被虚拟机看见) 2.验证(格式.内容逻辑) 3.准备 4.解析 5.初始化…
运行环境: 下面说明一下我的运行环境.我是在mac上操作的. 先找到mac的java地址. 从~/.bash_profile中可以看到 java的home目录是: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home 一. 类加载的过程 1.1 类加载器初始化的过程 假如现在有一个java类 com.lxl.jvm.Math类, 里面有一个main方法 package com.lxl.jvm; public class…