`
jinnianshilongnian
  • 浏览: 21499434 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2417776
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008074
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5638960
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259807
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597045
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250111
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858157
Group-logo
跟我学Nginx+Lua开...
浏览量:701791
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:784902
社区版块
存档分类
最新评论

加速Java应用开发速度2——加速项目调试启动速度

阅读更多

《加速Java应用开发速度》系列目录:

加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度

加速Java应用开发速度2——加速项目调试启动速度

加速Java应用开发速度3——单元/集成测试+CI

加速Java应用开发速度4——使用模板技术加速项目开发速度

加速Java应用开发速度5——使用脚本自动化日常操作 

 

上一篇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类型的值。

 

使用方式:

-javaagent:<pathTo>/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参数中指定:

-javaagent:/path/to/fakereplace.jar

可以到如下地址下载jar包,或自己编译

http://repo.grails.org/grails/plugins-releases/org/fakereplace/fakereplace-dist/1.0.0.Alpha2/ 

 

其提供了一些配置,如:

-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
装载时间 <1s <1s
内存泄漏
改变类结构
 改变方法体  

 
 


添加/删除方法    
添加/删除构造器    
添加/删除字段    
 添加/删除类    
 添加/删除注解    
改变静态字段值     
添加/删除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,可以配置

<scanIntervalSeconds>0</scanIntervalSeconds> 或者 <reload>manual</reload>。

 

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手册

 

 

下一篇:单元/集成测试+CI加速发现问题到解决问题

 

3
0
分享到:
评论
31 楼 finallygo 2013-07-11  
hamber 写道
开涛,怎么让Junit测试的时候不用每次重启的?
比如测一些Service层的东西,每次测一个方法都把Spring容器给整起来然后测试完成退出,有啥办法让Junit随Spring一起起来,然后直接一直运行,类似集成web端测试一样。再配上Jrebel就perfect了。

建议你还是拆分下spring配置文件,按需获取,这样可以减少spring启动的时间消耗
30 楼 jinnianshilongnian 2013-07-10  
hamber 写道
开涛,怎么让Junit测试的时候不用每次重启的?
比如测一些Service层的东西,每次测一个方法都把Spring容器给整起来然后测试完成退出,有啥办法让Junit随Spring一起起来,然后直接一直运行,类似集成web端测试一样。再配上Jrebel就perfect了。

木有啥办法 速度慢 最好上个持续集成服务器 这个是干这事的 平常我们都只跑我们当前需要测试的那个测试用例即可
29 楼 hamber 2013-07-10  
开涛,怎么让Junit测试的时候不用每次重启的?
比如测一些Service层的东西,每次测一个方法都把Spring容器给整起来然后测试完成退出,有啥办法让Junit随Spring一起起来,然后直接一直运行,类似集成web端测试一样。再配上Jrebel就perfect了。
28 楼 hzxlb910 2013-06-19  
jinnianshilongnian 写道
hzxlb910 写道
开涛,怎么写一个JAVA代码直接启动tomcat服务器,而不是点击server右键启动服务器,怎么写,谢谢

如eclipse 有快捷键 Ctrl+alt+R

现在tomcat也支持内嵌方式运行
http://tech.it168.com/j/2007-12-20/200712201500982.shtml



嗯,就是这种内嵌方式哈
27 楼 jinnianshilongnian 2013-06-19  
hzxlb910 写道
开涛,怎么写一个JAVA代码直接启动tomcat服务器,而不是点击server右键启动服务器,怎么写,谢谢

如eclipse 有快捷键 Ctrl+alt+R

现在tomcat也支持内嵌方式运行
http://tech.it168.com/j/2007-12-20/200712201500982.shtml
26 楼 hzxlb910 2013-06-19  
开涛,怎么写一个JAVA代码直接启动tomcat服务器,而不是点击server右键启动服务器,怎么写,谢谢
25 楼 jinnianshilongnian 2013-06-18  
zhukewen_java 写道
jinnianshilongnian 写道
hamber 写道
yunzhu 写道
开涛咋把自己的靓照全部撤下了呢

是呀,忒不习惯呢。

等我照个比较顺眼的

加菲猫非常适合

说实话 我现在确实胖了  ;哈哈哈
24 楼 zhukewen_java 2013-06-18  
jinnianshilongnian 写道
hamber 写道
yunzhu 写道
开涛咋把自己的靓照全部撤下了呢

是呀,忒不习惯呢。

等我照个比较顺眼的

加菲猫非常适合
23 楼 jinnianshilongnian 2013-06-18  
hamber 写道
yunzhu 写道
开涛咋把自己的靓照全部撤下了呢

是呀,忒不习惯呢。

等我照个比较顺眼的
22 楼 jinnianshilongnian 2013-06-18  
cnyangqi 写道
热部署不稳定的飘过。。。

你用的何种方式?
21 楼 jinnianshilongnian 2013-06-18  
zhukewen_java 写道
zhukewen_java 写道
强烈笔试jrebel,同时也强烈笔试盗版序列号的。。。。
笔试jrebel是因为它不开源不免费,笔试用它的人是因为就是你们这些人才导致了它不免费。

作为一个造福人类的工具,竟然要收费?
如果每个程序员都不用它,它收费也收不起来。


只要你在eclipse里把内存开得大一点,把tomcat自动部署时间设得短一点,就和jrebel一样的效果了,甚至更好。


tomcat自动部署时间设得短一点。 那叫reload, 是重新加载所有类; 如果你的项目比较大,会比较漫长,和重启差不多
20 楼 jinnianshilongnian 2013-06-18  
lection.yu 写道
开涛大师换头像了。。。

19 楼 jinnianshilongnian 2013-06-18  
yunzhu 写道
开涛咋把自己的靓照全部撤下了呢

因为 有人觉得俺头像 太。。 
18 楼 jinnianshilongnian 2013-06-18  
蝌蚪锄草 写道
顶了。。。。。。

17 楼 jinnianshilongnian 2013-06-18  
crud0906 写道
顶。jrebel有破解的么

有的
16 楼 zhukewen_java 2013-06-18  
zhukewen_java 写道
强烈笔试jrebel,同时也强烈笔试盗版序列号的。。。。
笔试jrebel是因为它不开源不免费,笔试用它的人是因为就是你们这些人才导致了它不免费。

作为一个造福人类的工具,竟然要收费?
如果每个程序员都不用它,它收费也收不起来。


只要你在eclipse里把内存开得大一点,把tomcat自动部署时间设得短一点,就和jrebel一样的效果了,甚至更好。
15 楼 zhukewen_java 2013-06-18  
强烈笔试jrebel,同时也强烈笔试盗版序列号的。。。。
笔试jrebel是因为它不开源不免费,笔试用它的人是因为就是你们这些人才导致了它不免费。

作为一个造福人类的工具,竟然要收费?
如果每个程序员都不用它,它收费也收不起来。
14 楼 lection.yu 2013-06-18  
开涛大师换头像了。。。
13 楼 hamber 2013-06-18  
yunzhu 写道
开涛咋把自己的靓照全部撤下了呢

是呀,忒不习惯呢。
12 楼 yunzhu 2013-06-18  
开涛咋把自己的靓照全部撤下了呢

相关推荐

    基于Java的游戏设计——贪吃蛇.doc

    Eclipse作为Java开发的主流IDE,提供了强大的代码编辑、调试和项目管理工具,为游戏开发提供了便利的环境。 接下来是需求分析。贪吃蛇游戏的主要功能包括显示游戏主界面、生成游戏地图、控制蛇移动、食物生成与消失...

    JAVA项目——多线程下载代码

    本项目以"JAVA项目——多线程下载代码"为主题,使用Eclipse集成开发环境进行实现,适合于Java初学者或毕业设计实践。下面我们将深入探讨相关的Java多线程下载知识点。 1. **线程基础**:在Java中,线程是程序执行的...

    Java基础学习教程,eclipse简单使用教程(Java集成开发工具)(csdn)————程序.pdf

    Java基础学习教程主要涵盖使用Java集成开发工具Eclipse的基础知识,Eclipse是一个广泛使用的开源IDE,最初由IBM开发,现在由Eclipse基金会维护。它的名称来源于日食的天文现象,象征着它曾试图超越SUN公司的影响力,...

    java毕业设计——文本编辑器.zip

    在这个特定的案例中,"java毕业设计——文本编辑器.zip" 文件很可能包含了一个使用Java开发的文本编辑器应用程序。文本编辑器是计算机科学中常见的项目,因为它能够帮助学生掌握GUI(图形用户界面)设计、事件处理、...

    java小游戏——“打飞机”源码

    首先,让我们深入了解一下Java语言在游戏开发中的应用。Java是一种跨平台的面向对象编程语言,具有良好的可移植性和稳定性,因此常被用于开发各种类型的游戏。在这个"打飞机"项目中,作者可能使用了Java Swing或...

    m2e —— maven to eclipse plugin 1.5 最新离线安装版

    Maven是一个强大的项目管理和构建工具,广泛应用于Java开发领域,它通过定义项目对象模型(POM)来管理项目依赖、构建过程以及配置。而m2e插件则将Maven的强大功能无缝融入Eclipse,使得开发者在Eclipse环境中可以...

    数据库课程设计——学生成绩管理系统(java版)

    运行环境为NetBeans IDE 7.1,这是一款流行的Java开发集成环境,提供了代码编辑、调试和部署等功能,便于开发者进行项目开发。 首先,我们来看"成绩管理系统.sql",这是一个SQL文件,通常包含了创建数据库和表结构...

    安卓Android源码——开源项目Jchat编译以及源码分析含开发文档.zip

    7. **性能优化**:分析内存使用、CPU占用、启动时间和响应速度等,找出性能瓶颈,并运用Android提供的工具如Systrace、Profile GPU Rendering等进行优化。 最后,开发文档是理解和学习项目的关键。它通常包含了项目...

    Android源码——掌上几分钟视频应用源码.7z

    通过这个项目,开发者不仅可以学习到Android应用开发的基础知识,还可以深入理解如何构建一个完整的视频应用,包括前后端交互、用户体验设计、性能优化等多个方面。这对于提升Android开发技能和实战经验非常有帮助。

    Android应用开发详解

    《Android应用开发详解》这本书是为那些希望深入理解Android应用开发技术的开发者量身打造的。它涵盖了Android开发的各个方面,旨在帮助读者从基础到高级,全面掌握Android平台的编程技巧。 首先,Android应用开发...

    java 课件交流及其。。。。。

    - **安装JDK**:Java开发工具包(JDK)包含了编译、调试和运行Java程序所需的工具。 - **设置环境变量**:需要配置`JAVA_HOME`、`PATH`等环境变量,以便系统能够找到JDK的安装位置。 - **IDE选择**:如Eclipse、...

    安卓Android源码——RunnersHigh(2).zip

    2. **GPS与传感器**:在运动类应用中,GPS通常用于获取用户的实时位置,结合加速度计、陀螺仪等传感器数据,可以计算出速度、距离和消耗的卡路里。源码中会包含对这些硬件接口的调用和数据处理逻辑。 3. **UI设计**...

    Android软件平台架构与应用开发.docx

    ### Android软件平台架构与应用开发 #### 15.1 Android平台概述 2008年9月22日,美国运营商T-Mobile USA在纽约正式发布了第一款Google手机T-Mobile G1,这款由宏达电制造的手机是全球首部采用真正开放且完整的移动...

    俄罗斯方块 Java 源码 含海量注释

    8. **使用Eclipse**:Eclipse是一个流行的Java集成开发环境(IDE),支持代码编辑、调试和项目管理。用户可以导入这个项目到Eclipse中,查看源码并进行进一步的修改和学习。 9. **jar文件运行**:`tetris.jar`是一...

    安卓Android源码——安卓Android源码安卓与PC的Socket通信项目java版.zip

    使用adb或Wi-Fi调试可以帮助调试Android应用,而PC端的服务可以通过命令行启动和监控。 9. **安全考虑**: 虽然Socket通信提供了灵活性,但开放的端口可能带来安全风险。确保仅在必要时开启服务,并且使用安全的...

    Java web项目-网上淘书吧.zip

    同时,Spring Boot简化了Spring的配置,加速项目的启动和运行。 5. **前端技术** 前端界面可能使用HTML、CSS和JavaScript构建,也可能引入了前端框架如Bootstrap或Vue.js来提高用户体验和响应速度。JavaScript库如...

    最新的 java web2.0开工具 - MyEclipse 7.0 M2

    ### 最新的 Java Web 2.0 开发工具 —— MyEclipse 7.0 M2 随着技术的不断发展,Java Web 开发工具也在不断地更新换代。MyEclipse 作为一款备受开发者喜爱的集成开发环境(IDE),在 Java Web 领域有着举足轻重的...

    Android源码——i-jetty开源项目.zip

    本文将详细探讨这个项目的核心概念、工作原理以及如何在实际开发中应用。 1. **项目概述** i-jetty项目旨在为Android开发者提供一个嵌入式的HTTP服务器,允许应用程序在本地或远程提供服务。它使得Android设备能够...

    俄罗斯方块 源程序 Java 语言eclipse平台

    Eclipse作为一款强大的集成开发环境(IDE),为Java程序员提供了丰富的代码编辑、调试和项目管理工具。开发者可以利用Eclipse的特性,如自动完成、语法高亮和错误检测,来提高开发效率和代码质量。 在提供的压缩包...

Global site tag (gtag.js) - Google Analytics