免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1464 | 回复: 0
打印 上一主题 下一主题

加速Java应用开发速度2:加速项目调试启动 [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-03 09:38 |只看该作者 |倒序浏览
  
一篇Spring/Hibernate提升速度的文章《加速spring/hibernate应用调试时启动速度》,主要是通过一些技巧来提升启动速度,还是做不到如类的热部署/热替换。因此再写一篇关于热部署/热替换的文章。之前也有很多人介绍过这些知识,不过比较分散,我写此篇的目的是聚合它们。本文以HotSpot虚拟机为例。

首先让我们来看两个概念:热部署、热替换
热部署
即在容器运行过程中,重新加载类或重新加载整个项目。常见的解决方案就是使用自定义ClassLoader;
部分加载的示例:如JSP、Play框架;
重新加载整个项目的示例:如Tomcat、Jetty;默认都是定期检测class文件是否有修改,如果有,先卸载当前容器,再重新加载整个项目(reload)。

这种情况缺点很明显:只能重新装载整个类/整个项目,不能只替换类中的部分。

JSP热部署的介绍:http://www.linuxidc.com/Linux/2013-05/83816.htm
Tomcat热部署的介绍:http://www.94it.cn/a/jingxuanboke/2013/0501/4578.html
Play!框架:http://mingj.iteye.com/blog/307238

热替换
热替换相对于之前的热部署的优势就是可以替换如方法体、增删方法/字段等类内部局部替换,而不是整个类。常见的实现方式:HotSpot虚拟机的HotSwap、HotSwap补丁、

HotSwap
只能热替换方法体。只要在eclipse或idea等开发工具中开启debug模式即可使用。

HotSwap补丁 DCEVM
该补丁增强了HotSwap,可以增加、删除类字段、方法和改变类的父类。也必须在debug模式下调试。具体使用可以参考如下文章,在此就不重复了hotswap 用户手册DCE使用的问题及其解决方法

我测试时使用的是jdk1.6.0_25,没有问题,不支持jdk1.6.0_26,且我测试jdk7_13和jdk7_21没成功。官网介绍说其是基于JDK7-b102编译的。估计我下的这两个版本不对。

java agent + Instrumentation
1、Spring-Loaded
SpringSource官网发布的,用在Grails 2中,允许:添加/修改/删除 方法/字段/构造器。类型/方法/字段/构造器上的注解也允许修改,且也可以新增/删除/修改enum类型的值。

使用方式:
Java代码






-javaagent:/springloaded-{VERSION}.jar -noverify
-javaagent:/springloaded-{VERSION}.jar -noverify
如在执行tomcat/jetty时的VM参数中指定如上配置即可。无需在debug模式下执行。如果使用的是如idea可以按Ctrl+Shift+F9编译当前类/Ctrl+F9编译所有更改的类。

2、Fakereplace
类似于Spring-Loaded,具体可参考其官网:
https://github.com/fakereplace/fakereplace
https://github.com/fakereplace/fakereplace/wiki/How-It-Works

它的好处是,支持一些框架:


       
  • Seam 2
  • Weld (基本集成)
  • JSF
  • Metawidget
  • Hibernate (实际是如果实体修改了,重启整个EMF,也不是很快)
  • Resteasy

具体使用也是在VM参数中指定:
Java代码






   -javaagent:/path/to/fakereplace.jar
-javaagent:/path/to/fakereplace.jar
可以到如下地址下载jar包,或自己编译
http://repo.grails.org/grails/plugins-releases/org/fakereplace/fakereplace-dist/1.0.0.Alpha2/

其提供了一些配置,如:
Java代码






   -javaagent:/path/to/fakereplace.jar=packages=com.mycompany.myclasses,log=trace
-javaagent:/path/to/fakereplace.jar=packages=com.mycompany.myclasses,log=trace



       
  • packages 需要热替换的包
  • log 可选,支持trace,debug,info,error
  • index-file fakereplace索引为的路径。Fakereplace在第一次运行后存储这个文件以加速启动
  • dump-dir 当热替换时,Dump类到这个目录,仅当开发Fakereplace时有用
  • port Fakereplace监听的端口

它俩的实现很类似,Spring-Loaded使用了CGLIB来实现代理,FakeReplace使用了Javassist来实现的。

还有如Agent Smith,不过N久没维护了。 其实Play框架也是使用了Instrumentation,但是它是整个替换,所以没有归类过来。

以上的都有个缺点:如我在写spring项目时,无法动态加载如@RequestMapping配置,或动态加载配置文件。这些在强大的JRebel中都是支持的。

JRebel
JRebel是我目前简单的最强大的热替换/热部署工具。但缺点是收费的,而且不便宜。之前介绍的都是免费的。首先大家可以看一下它支持的特性与JVM Hot Swap对比列表:
   
        
            JavaEE支持
            JRebel
            JVM Hot Swap
        
        
            装载时间
            
            
        
        
            内存泄漏
            无
            无
        
        
            改变类结构
        
        
            改变方法体
            
            

            
            
            

            
            
        
        
            添加/删除方法
            

            

        
        
            添加/删除构造器
            

            

        
        
            添加/删除字段
            

            

        
        
            添加/删除类
            

            

        
        
            添加/删除注解
            

            

        
        
            改变静态字段值
            

            

        
        
            添加/删除enum值
            

            

        
        
            改变接口
            

            

        
        
            替换父类
            

            

        
        
            添加/删除实现的接口
            

            

        
        
            即时构建
        
        
            跳过WAR目录的构建
            

            

        
        
            跳过.WAR/.EAR类更新构建
            

            

        
        
            跳过.WAR/.EAR资源更新构建
            

            

        
        
            映射多个source目录到一个.WAR/.EAR目标目录
            

            

        
        
            使用include/exclude模式映射类和资源
            

            

        
        
            使用Ant风格模式映射多个sourcde目录
            

            

        
        
            使用系统属性使映射机器无关
            

            

        
        
            
Maven插件
            

            

        
        
            远程/云
        
        
            
通过HTTP进行应用更新
            

            

        
   

JavaEE支持
   
        
            JSP EL changes
        
        
            JSP Scriptlet changes
        
        
            EJB 1.x session bean interface changes
        
        
            EJB 2.x session bean interface changes
        
        
            EJB 3.x session bean interface changes
        
        
            EJB 3.x: adding new EJB
        
        
            EJB 3.x: adding new EJB reference
        
        
            JSF changes (Mojarra)
        
        
            Bean Validation support (Hibernate Validator)
        
        
            JAXB annotation changes
        
        
            JAX-RS changes (RESTEasy, Jersey, CXF)
        
        
            JAX-WS support (Metro, CXF)
        
        
            JPA changes (Hibernate, EclipseLink, TopLink, OpenJPA)
        
        
            
            
CDI changes (Weld)
            

            
        
        
            框架支持
        
        
            Spring Framework 2.x or later
        
        
            Hibernate
        
        
            JBoss Seam 2.x or later
        
        
            Google Guice
        
        
            Struts 1.x, 2.x
        
        
            Wicket
        
        
            Stripes 1.5 or later
        
        
            
查看完整的框架支持列表
            
        
        
            
            

            
代理支持
            
        
        
            CgLib
        
        
            Javassist
        
        
            
            

            
OSGi支持
            
        
        
            Apache Felix
        
        
            Eclipse Equinox
        
   

从如上列表看到其不是一般的强大。

接下来看看如何使用(以IDEA为例):
1、首先点击如下图所示的运行,然后点击Edit Configuration...



2、在弹出的窗口中输入如下图所示的jrebel.jar位置


类似于之前的javaagent配置。

3、启动后,当修改类后,请按Ctrl+F9重新编译。然后再执行程序即可看到变化。

4、Eclipse内嵌tomcat的配置:



使用起来是非常简单的。注意:如果使用web容器如tomcat、jetty,请禁用其reload,如jetty,可以配置
0 或者 manual。

JRebel也提供如Eclipse、IDEA、Maven插件,其实没必要上插件,直接配javaagent就很简单。还可以配置

如果有朋友想开启/禁用某些框架/JavaEE的支持,可以通过添加VM参数,如下所示开启/关闭:
-Drebel.spring_plugin=true
-Drebel.aspectj_plugin=true
-Drebel.struts2_plugin=true
-Drebel.hibernate_plugin=true
-Drebel.jackson_plugin=true
-Drebel.log4j-plugin=true
完整的框架支持列表

还可以通过配置一个rebel.xml来进行选择性构建:http://zeroturnaround.com/software/jrebel/how-to-configure-rebel-xml/

更多配置请参考其官方的JRebel手册。

到此就介绍完了我见到的所有热部署/热替换实现方式,大家还有什么好的方式欢迎补充。


参考资源:
hotswap 用户手册
DCE使用的问题及其解决方法
Dynamic Code Evolution VM
Spring Loaded官网
FakeReplace官网
RJC401:HotSwap和JRebel——幕后的故事
JRebel与Maven集成
JRebel与Eclipse集成
JRebel与IDEA集成
JRebel手册
转自:
http://jinnianshilongnian.iteye.com/blog/1887788

本文来自ChinaUnix新闻频道,如果查看原文请点:http://news.chinaunix.net/opensource/2013/0703/2831931.shtml

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP