osgi多bundle环境启动慢原因之一分析

原创 2013年12月04日 10:10:09

 

                                       

使用环境

系统:windows XP

内存:4G

CPU:英特尔 双核 2.66

应用容器:tomcat

数据库:mysql

使用工具:jprofiler,eclipse

 

目标:寻求影响Gboat2平台启动慢的 最重要 原因,次要的暂不考虑

 

以下是此次工作内容原因分析及解决过程,并列出解决前后之对比数据

 

问题原因:

 

线程阻塞:借助经jprofiler工具 可以看出,大量的线程发生了阻塞。

 

被阻塞线程所做的工作:spring-dm会为bundle创建application context.

 

推测结论:大量的线程被阻塞,断定可能有性能瓶颈点;

 

具体原因分析如下

系统存在性能瓶颈点:借助jprofiler(参见附图,最后)和eclipse可以断定:spiring-dm在创建application context.

的过程中存在性能瓶颈点,为:URLHandlersBundleStreamHandler.getHostAddress,即创建application context的线程 在此被阻塞。(附图可以清晰的看出)

 

 

深层次原因:

 

Spring 在创建application context的时候,需要加载一些资源 比如xml,spring 借助OsgiBundleResourcePatternResolver创建 大量的UrlContextResource,并这些对象放到集合中去。就是在往集合中放时产生的问题。

因为:UrlContextResource  这个对象 有自己的hashcode方法,实现具体调用 URL中的hashcode方法,URL中的hashcode方法如下图:

 里面的handler在平台环境中即为:URLHandlersBundleStreamHandler,这个类的handlers的hashcode方法为(在其父类URLStreamHandler中):

请看划线部分的方法:这个方法是我们的性能瓶颈点(通过jprofiler和eclipse debug窗口分析出)。

此方法的内容如下:

解决思路:felix官方网站最高版本的此类和目前此类做了对比,发现不同,分析不同后,找到解决我们这个问题方法。

解决问题:在类URLHandlersBundleStreamHandler中复写方法getHostAddress 把同步去掉

返回Null即可。(参照felix 4.0.2)

涉及到此问题的jar包:org.apache.felix.framework-1.4.1.jar,已经对此修改,目前未上传。

 

解决前后启动前后对比:A,修改前折线;B,修改后折线

       图形分析:分界点250个bundles,250个bundle 由图形可以看出,基本差别不大,但超过250个bundle后,可以看出巨大的性能差异。

同样的环境:

300个bundle前后差六倍左右

350个bundle前后差七倍左右

400个bundle前后差八倍左右

450个bundle前后差十一倍左右

500个bundle前后差十四倍左右

。。

。。

。。

具体参照饼状图

折线图:秒/bundles数量

柱状图:解决前测试到500个bundles,解决后测试到1000个bundle

 

附图:线程阻塞图

 

   线程状态图:

线程实时状态图:

 

session 为什么不见了?谈 IIS 应用程序池的两个重要设置

经常听到程序员会说,明明设置了很长的超时时间,为什么没有生效呢?session 很快就被清空了。 asp.net 默认的 session state 模式是 in proc(进程内),数据是在网...

解决bundle install 和 bundle update特别慢的状况

更新下你的bundle就好了。执行这个命令 gem install bundler –pre 。 另外顺便讲讲bundle install 和 update的区别 应该是bundle ...

JBPM5服务端Bundle在OSGI平台上问题的分析和处理

前提知识:JPA,是J2EE的一个规范,JVM提供了接口,Hibernater等ORM框架提供了具体的实现,这个类似于JDBC和JMS的情况。在JBPM5中使用Hibernate作为持久JPA的实现。...

OSGI Bundle和Web容器加载类冲突问题的分析和解决

一、预备知识:          1)web应用的类加载器          web容器像JBoss、Tomcat的类加载器是用户自定义的类加载器,这个类加载器会默认加载WEB-INF下的clas...

利用maven创建spring-osgi powered 多bundle工程

如何利用maven 创建多工成参见《多工成Maven工程的创建》这里仅作扩充 1、创建总控pom文件添加如下内容 xsi:schemaLocation="http://maven.ap...

Windows 下使用adt-bundle-windows 启动SDK Manager 时出错闪退的原因和解决办法

昨天在Windows7下搭建Android开发环境,在启动SDK Manager的时候遇到了出错闪退的问题,后来查询尝试了很多方法均未得到解决。今天,仔细看了下启动用到的两个bat文件,终于找到了问题...

websphere OSGi应用环境下服务调用saaj包加载问题分析报告

1.    故障情况说明 系统简称 基于osgi业务应用系统 故障名称 系统在客户生产环境:websphere7.0,基于osgi的应用系统,外...

OSGi 体系结构及Bundle简介

1、OSGi 的体系架构是基于插件式的软件结构,包括一个 OSGi 框架和一系列插件,在 OSGi中,插件称为 Bundle,其中,OSGi 框架规范是 OSGi 规范的核心部分,它提供了一个通用的、...
  • immcss
  • immcss
  • 2011年03月14日 14:43
  • 601

来自 Adobe 的用户体验专家 AEM 之:构建并部署 OSGi bundle

CQ 的构建基于 OSGi 容器,所以自定义的代码和功能能够通过 OSGi 提供的 feature 添加到 CQ。要将自定义的代码部署到 OSGi 容器,开发者必须将他们的代码作为一个 bundle ...
  • defonds
  • defonds
  • 2017年07月06日 10:49
  • 4265

如何在eclipse中基于maven创建osgi的bundle

一、环境准备 1、下载并解压eclipse   2、下载安装jdk,并配置环境变量 打开系统属性面板(桌面上右键单击“我的电脑”→“属性”),点击高级系统设置,再点击环境变量,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:osgi多bundle环境启动慢原因之一分析
举报原因:
原因补充:

(最多只允许输入30个字)