OSGI与Java模块化之路
所属分类 OSGI
浏览量 1202
OSGi Open Service Gateway Initiative
Java动态模块化规范
OSGi联盟 最新OSGi定义 The Dynamic Module System for Java
面向Java的动态模块化系统
OSGi规范的演进
OSGi Release 1 (R1) 2000年5月发布
OSGi Release 2 (R2) 2001年10月发布
OSGi Release 3 (R3) 2003年3月发布
OSGi R4 2005年10月发布的核心规范 2006年9月发布的移动设备规范
OSGi R4.1 2007年5月发布
OSGi R4.2 2009年9月
OSGi R4.3 2011年4月核心规范 2012年3月服务纲要规范
OSGi R5 2012年7月
Java模块化规范之争
OSGi 前三个版本 主要领域在移动和嵌入式设备上
OSGi R4开始 尝试进入Java SE/EE领域
2006年,Sun公司离开了当年它一手主导建立的OSGi联盟
Eclipse 3.0 M4版本开始,重构为完全基于OSGi架构
支持Eclipse运行的底层框架 Equinox 成为OSGi R4.x使用最广泛的实现框架
OSGi R4的迅速流行带来一个强烈的信号
Java SE/EE支持模块化已经成为一股不可逆转的潮流,支持模块化的呼声已经强大到令Sun公司不能再忽视的程度。
Sun公司期望能借助JCP的力量重新争夺Java模块化规范的控制权。
2006年10月,由Sun公司提交的JSR-277规范提案(Java Module System,Java模块化系统)发布了第一个早期预览版(Early Draft Review)
2007年年底,Sun带着JSR-277重新加入OSGi联盟
JSR-277是一个全静态的模块化规范
OSGi技术专家、OSGi联盟主席Peter Kriens在OSGi联盟的官方博客上发表文章批评
JSR-277的目标如同儿戏,只能相当于OSGi在8年前的技术水平
IBM将OSGi R4.1提交到JCP成为JSR-291(Dynamic Component Support for Java SE ,Java SE动态组件支持)与JSR-277对抗
sun JSR-277 PK IBM JSR-291 (OSGi R4.1)
JSR-291进行表决时,虽然Sun明确投了反对票,但是JSR-291仍然在JCP执委会最终投票中通过
OSGi终于确立了Java唯一的模块化规范的地位
Sun极为重视Java模块化,但它一定要把Java模块化的主导权抓在手中
Java SE 7的模块化
sun 提交的 JSR-294(Improved Modularity Support in the Java Programming Language,Java语言的模块化改进)
试图在Java语言和Java虚拟机层面上对模块化进行支持,直接修改JLS(Java语言规范)和JVMS(Java虚拟机规范),
加入module关键字和超级包(Super Package)等概念。
Sun在提交JSR-294的同时,在OpenJDK中启动了Jigsaw项目的孵化进程
Sun决定让Jigsaw项目采取“SunJDK专有的方式”来实现Java语言模块化
Jigsaw最终在Java 9中发布 , 2015年9月 (OSGi出现的16年之后)
系统要兼容 java8及之前的平台,OSGi是唯一的选择
为什么使用OSGi 为什么不使用OSGi?
这里说的都是缺点
OSGi能让软件开发变得更容易吗
OSGi入门门槛较高,相对陡峭的学习曲线
OSGi本身就具有较高的复杂度,引入OSGi并不能让软件开发变得更容易
OSGi能让系统变得更稳定吗
OSGi框架容易引起的问题
ClassNotFoundException
类加载器死锁
热部署 OutOfMemoryError
OSGi能让系统运行得更快吗
OSGi框架对系统性能的损耗
OSGi类加载层次比普通Java应用要深很多,这意味着需要经过更多次的类加载委派才能找到所需的类
在两个互相依赖的模块间发生调用时,可能会由于类加载器互相锁定而产生死锁
要避免死锁的出现,有时候不得不选用有性能损失的串行化的加载策略
OSGi允许不同版本的Package同时存在,会占用更多内存
对OSGi动态性使用不当,可能会因为不正确持有某个过期模块(被更新或卸载的模块)中一个类的实例,
导致该类的类加载器无法被回收,进而导致该类加载器下所有类都无法被GC回收掉
OSGI把Java类加载机制推到了一个不可驾驭的新高度
原文
https://www.cnblogs.com/garfieldcgf/p/6378443.html
上一篇
下一篇
java方法引用实例
Java8 Stream 及 常见坑点
java方法引用
Lambda表达式与匿名内部类的区别
Java方法调用的字节码指令
k8s面试题