java:加速项目调试启动速度
来源:互联网 发布:教课的软件 编辑:程序博客网 时间:2024/06/14 22:50
转自 张开涛 的博客: http://jinnianshilongnian.iteye.com/blog/1887788
首先让我们来看两个概念:热部署、热替换
热部署
即在容器运行过程中,重新加载类或重新加载整个项目。常见的解决方案就是使用自定义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类型的值。
使用方式:
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参数中指定:
1-javaagent:/path/to/fakereplace.jar可以到如下地址下载jar包,或自己编译
http://repo.grails.org/grails/plugins-releases/org/fakereplace/fakereplace-dist/1.0.0.Alpha2/
其提供了一些配置,如:
1-javaagent:/path/to/fakereplace.jar=packages=com.mycompany.myclasses,log=tracepackages 需要热替换的包
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支持JRebelJVM Hot Swap装载时间<1s<1s内存泄漏无无改变类结构 改变方法体添加/删除方法 添加/删除构造器 添加/删除字段 添加/删除类 添加/删除注解 改变静态字段值 添加/删除enum值 改变接口 替换父类 添加/删除实现的接口 即时构建跳过WAR目录的构建 跳过.WAR/.EAR类更新构建 跳过.WAR/.EAR资源更新构建 映射多个source目录到一个.WAR/.EAR目标目录 使用include/exclude模式映射类和资源使用Ant风格模式映射多个sourcde目录使用系统属性使映射机器无关Maven插件远程/云通过HTTP进行应用更新JavaEE支持
JSP EL changesJSP Scriptlet changesEJB 1.x session bean interface changesEJB 2.x session bean interface changesEJB 3.x session bean interface changesEJB 3.x: adding new EJBEJB 3.x: adding new EJB referenceJSF changes (Mojarra)Bean Validation support (Hibernate Validator)JAXB annotation changesJAX-RS changes (RESTEasy, Jersey, CXF)JAX-WS support (Metro, CXF)JPA changes (Hibernate, EclipseLink, TopLink, OpenJPA)CDI changes (Weld)框架支持Spring Framework 2.x or laterHibernateJBoss Seam 2.x or laterGoogle GuiceStruts 1.x, 2.xWicketStripes 1.5 or later查看完整的框架支持列表代理支持CgLibJavassistOSGi支持Apache FelixEclipse 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手册
- java:加速项目调试启动速度
- 加速Java应用开发速度2——加速项目调试启动速度
- 加速Java应用开发速度2——加速项目调试启动速度
- 黑马程序员_加速Java应用开发速度2:加速项目调试启动速度
- 加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度
- 加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度
- 黑马程序员_加速Java应用开发1:Spring/Hibernate应用调试时启动速度
- 加速vs2008 启动速度
- 黑马程序员_加速Java应用开发速度4:使用模板技术加速项目开发速度
- 加速VS2008的启动速度!...
- 加速linux设备启动速度
- 加速Java应用开发4—模板加速项目开发速度
- VirtualKD加速windbg双机调试速度
- 加速ubuntu(linux)的启动速度
- 加速Jdeveloper 内置WebLogic的启动速度
- blcr加速android启动速度遇到的问题及解决方法
- blcr加速android启动速度遇到的问题及解决方法
- vs2010 启动调试、停止调试速度很慢
- offsetLeft,Left,clientLeft的区别
- 详细程序注解学OpenCL一 环境配置和入门程序
- USRP N210 led 指示灯意义
- python 一个模块要执行其它模块主要有三种方法
- mysql在win7上重装出错error nr.1045
- java:加速项目调试启动速度
- 随记
- U_boot 的 bootcmd 和bootargs参数详解
- matlab中fspecial中生成高斯模板的解释以及c语言实现
- delphi seek函数中参数说明
- 成员函数指针和高性能的C++委托
- CCleaner v4.7.0.4369
- 分区 Service Bus 队列和主题
- mysql安装