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

 

附图:线程阻塞图

 

   线程状态图:

线程实时状态图:

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ruby gem bundle install 很慢的解决方案

http://ruby.taobao.org/ 1.BUNDLE INSTALL  修改Gemfile source  2.Gem 参照淘宝源提示

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

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

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

一、预备知识:          1)web应用的类加载器          web容器像JBoss、Tomcat的...

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

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

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

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

利用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的应用系统,外...

Linux suse x86_64 环境上部署Hadoop启动失败原因分析

一、问题症状: 在安装hadoop的时候报类似如下的错误: # A fatal error has beendetected by the Java Runtime Environment: ...
  • dmcpxy
  • dmcpxy
  • 2013-10-12 17:37
  • 2129

OSGi介绍(五)两个bundle

(四)中提到的直接型改造法实际上和一个传统的java应用程序没有区别。因此客户的需求发生变化,通常是牵一发而动全身。那么我们现在就看看如果在osgi framework中,用多个bundle来实现的效...
  • immcss
  • immcss
  • 2011-03-24 12:33
  • 2406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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