领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!
作者 Michael Hunger 译者 宋玮 发布于 2010年5月12日
JRebel 3.0于不久前发布,我们采访了Zeroturnaround的CTO Jevgeni Kabanov以详细了解JRebel的一些内部工作原理、适用性以及集成问题,并了解Java开发者能从这一技术中获得什么益处。
Jevgeni最近发表的一系列文章,详细讲解了JVM类加载和运行时类替换的相关内容。本文中的部分内容是从他这一系列文章中提取出来的,另一部分则是我们交流的内容。
开发过程中重新部署或重起Java应用都引入了不必要的时延,降低了生产效率。JRebel旨在通过给JVM增加一个处理运行时类替换的特殊javaagent启动参数来显著缩短开发周期。
为了对生产效率的相关讨论提供支持,Zeroturnaround收集了来自超过1100个Java开发者的统计数据。这些数据是公开的,用来计算平均小时等候时间。在平均小时等候时间中:有6分钟用来构建的;而大约有10分半是用来重新部署应用的。
除了直接等待时间外,还有其他隐性时间损耗。在软件开发这样的复杂任务环境中上下文切换也是个问题。有关开发流程的大量信息是保存在短期记忆中的,如果注意力被分散,要想恢复到原来的状态就得花大量的时间。诸如电话、email及个人需求等工作中断所导致的上下文切换成本在现有文献中已有所讨论。不过前面所说的由基础设施所引起的上下文切换也适用于此。
由于工作期间的成绩更少,低工作效率也会导致开发者积极性降低。
有几种方法可以做到在不重新启动应用的情况下更新类,但每种方法都有其问题:
或许有人会说JVM Hotswapping可以就地替换字节码,而且已经出现一段时间了(始于2002年,JDK 1.4)。但它有严格限制:它只能工作在Debug模式下,而且只能处理方法体内的变化。它不允许结构的变化或增/删类成员。Hotswap对classloader也是一无所知,它只是通过类名来识别类,并且只能处理已存在的类。
从Java 5开始,hotswapping可通过instrumentation API来使用。JRebel也使用了该API,但仅仅用于底层类及类加载器,并没有在实际的重加载处理中运用。
JVM的复杂性(尤其是垃圾回收、内存布局及Hotspot)使得提供一个通用的透明类字节码替换方案比较困难。
其中一个问题是对象实例的状态必须不受影响,否则相关实例必须全部替换,对他们的所有引用也都要更新(包括级联变化)
大多数servlet容器、应用服务器和OSGi的重部署特性实现思路都类似。
用专用类加载器(classloader)加载一个应用服务器(或其部分),如果你删除了对所有已加载类以及classloader的引用,你就能彻底卸载该应用并用一个新的classloader重新加载它。但是通常情况下,从JVM中彻底删除对所有实例、类或classlodar的引用是不可能的。
这样的话老应用仍部分存在,只是不再使用罢了。于是类加载器泄漏(classloader leaks)就会被引入,导致在连续重部署后内存消耗增加。
热部署可以有效地重启应用。为了恢复应用的状态,这些状态必须提前被保存并被重新应用或加载到“新”的应用或模块中。
当前基于组件的框架如Grails或RIFE都自己负责处理组件状态。这就是为什么用新classloader重新装载的组件在这些框架中不存在问题的原因。新组件的状态在框架中已经存在。组件的颗粒性也可以让很小的bundle被瞬时重新加载。
不过这种方式重新加载类存在一个普遍问题,即类的新老版本可能同时存在,框架必须小心处理这一问题。
JRebel原先叫JavaRebel,自2007就有,它采取了一种不同的方式。当一个类被仪表化的(instrumented)类加载器加载时,在线创建了一个间接产物(indirection),其能够在重新加载时保持所有实例的身份和状态。该间接产物基于“高级编译技术(类似抽象字节码)”,会产生一个主类和几个匿名类、以及一些启用JIT的支持类。JRebel让方法调用尽可能完整,以减少对性能的影响。基于同样的原因,它避免将JDK仪表化(instrumenting JDK)。为了给重加载类提供反射API支持,该API调用的结果也相应地被修改。
创建额外的类会导致多分配20%到40%的空间。按照Jevgeni的说法,较小的类及深层继承都会占用更多的内存。但是这是由内部实现引起的,你不应该依赖于它。
为了在一个打包的部署中重新加载类,JRebel允许开发者将打包文件结构映射(通过rebel.xml 配置文件)回开发空间(development workplace),以便让修改过的类以及所有其他资源得以重新加载。
由于JRebel对重载/刷新资源进行了全面综合考虑,因此也能够更新各种框架和容器的配置及元信息。为了能给不同框架都提供恰当的刷新设施,JRebel提供了一个开源API用以开发JRebel plugins。现有可用开源plugin中包含支持以下框架的plugin:Guice、Spring、Tapestry 4、Struts 2、Wicked、Stripes、WebObjects。这些都是随发行包一起发行的。
上述三种不同类重加载方法的区别在zeroturnaround网站上有相应的比较矩阵加以说明。
JRebel 3.0 版于4月16日发布,包含了不少重要改进。
按照Jevgeni的说法,最后一个问题比较棘手。当给类添加方法时,字节码框架的调用句柄接所收到了他们预期之外的合成方法调用。因此我们用一个redefineClass()方法对JRebel API进行了扩展,该方法还允许重定义字节码代理。使用该API,可以重写部分代理实现以允许动态类更新。现在有两个plugins专门支持这些框架。
还有一个遗留问题是JDK动态代理,由于他们对代理接口的限制因此很少需要集成。
JRebel的目标是具备更多兼容性,以能够与任何基于Java的底层架构无缝集成。其中重要的一步是改进了与EJB的集成。
为了获得更好企业集成特性,Zeroturnaround还针对老技术(Java 1.4、老的应用服务器版本、EJB 1.x/2.x)和集中许可证管理提供了JRebel Enterprise Add-On。该附加组件是作为免费更新提供给当前所有用户的。
JRebel可在个人许可(USD 59)或商业许可(USD 149)下使用。你还可以免费试用30天并有30天的退款保证。
Zeroturnaround对开源社区也提供支持,为开源开发者和Scala开发者提供了免费许可。
查看英文原文:JRebel 3.0 Release - Hotswap Reloaded
译者 宋玮 有多年软件开发经验,长期担任技术管理和项目管理工作,一直关心开源软件的发展动态以及软件过程和敏捷开发的实践探索。
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
论道WP第三篇专栏,以应用程序栏的使用为中心,包括了软键盘带来的问题、应用程序栏介绍、如何绑定应用程序栏的属性等几个方面的具体话题,为开发者顺利使用应用程序栏开发提供了具体指导。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
5 条回复
关注此讨论 回复