《加速Java应用开发速度》系列目录:
加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度
上一篇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模式下调试。具体使用可以参考如下文章,在此就不重复了
我测试时使用的是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手册。
到此就介绍完了我见到的所有热部署/热替换实现方式,大家还有什么好的方式欢迎补充。
参考资源:
下一篇:单元/集成测试+CI加速发现问题到解决问题
相关推荐
Eclipse作为Java开发的主流IDE,提供了强大的代码编辑、调试和项目管理工具,为游戏开发提供了便利的环境。 接下来是需求分析。贪吃蛇游戏的主要功能包括显示游戏主界面、生成游戏地图、控制蛇移动、食物生成与消失...
本项目以"JAVA项目——多线程下载代码"为主题,使用Eclipse集成开发环境进行实现,适合于Java初学者或毕业设计实践。下面我们将深入探讨相关的Java多线程下载知识点。 1. **线程基础**:在Java中,线程是程序执行的...
Java基础学习教程主要涵盖使用Java集成开发工具Eclipse的基础知识,Eclipse是一个广泛使用的开源IDE,最初由IBM开发,现在由Eclipse基金会维护。它的名称来源于日食的天文现象,象征着它曾试图超越SUN公司的影响力,...
在这个特定的案例中,"java毕业设计——文本编辑器.zip" 文件很可能包含了一个使用Java开发的文本编辑器应用程序。文本编辑器是计算机科学中常见的项目,因为它能够帮助学生掌握GUI(图形用户界面)设计、事件处理、...
首先,让我们深入了解一下Java语言在游戏开发中的应用。Java是一种跨平台的面向对象编程语言,具有良好的可移植性和稳定性,因此常被用于开发各种类型的游戏。在这个"打飞机"项目中,作者可能使用了Java Swing或...
Maven是一个强大的项目管理和构建工具,广泛应用于Java开发领域,它通过定义项目对象模型(POM)来管理项目依赖、构建过程以及配置。而m2e插件则将Maven的强大功能无缝融入Eclipse,使得开发者在Eclipse环境中可以...
运行环境为NetBeans IDE 7.1,这是一款流行的Java开发集成环境,提供了代码编辑、调试和部署等功能,便于开发者进行项目开发。 首先,我们来看"成绩管理系统.sql",这是一个SQL文件,通常包含了创建数据库和表结构...
7. **性能优化**:分析内存使用、CPU占用、启动时间和响应速度等,找出性能瓶颈,并运用Android提供的工具如Systrace、Profile GPU Rendering等进行优化。 最后,开发文档是理解和学习项目的关键。它通常包含了项目...
通过这个项目,开发者不仅可以学习到Android应用开发的基础知识,还可以深入理解如何构建一个完整的视频应用,包括前后端交互、用户体验设计、性能优化等多个方面。这对于提升Android开发技能和实战经验非常有帮助。
《Android应用开发详解》这本书是为那些希望深入理解Android应用开发技术的开发者量身打造的。它涵盖了Android开发的各个方面,旨在帮助读者从基础到高级,全面掌握Android平台的编程技巧。 首先,Android应用开发...
- **安装JDK**:Java开发工具包(JDK)包含了编译、调试和运行Java程序所需的工具。 - **设置环境变量**:需要配置`JAVA_HOME`、`PATH`等环境变量,以便系统能够找到JDK的安装位置。 - **IDE选择**:如Eclipse、...
2. **GPS与传感器**:在运动类应用中,GPS通常用于获取用户的实时位置,结合加速度计、陀螺仪等传感器数据,可以计算出速度、距离和消耗的卡路里。源码中会包含对这些硬件接口的调用和数据处理逻辑。 3. **UI设计**...
### Android软件平台架构与应用开发 #### 15.1 Android平台概述 2008年9月22日,美国运营商T-Mobile USA在纽约正式发布了第一款Google手机T-Mobile G1,这款由宏达电制造的手机是全球首部采用真正开放且完整的移动...
8. **使用Eclipse**:Eclipse是一个流行的Java集成开发环境(IDE),支持代码编辑、调试和项目管理。用户可以导入这个项目到Eclipse中,查看源码并进行进一步的修改和学习。 9. **jar文件运行**:`tetris.jar`是一...
使用adb或Wi-Fi调试可以帮助调试Android应用,而PC端的服务可以通过命令行启动和监控。 9. **安全考虑**: 虽然Socket通信提供了灵活性,但开放的端口可能带来安全风险。确保仅在必要时开启服务,并且使用安全的...
同时,Spring Boot简化了Spring的配置,加速项目的启动和运行。 5. **前端技术** 前端界面可能使用HTML、CSS和JavaScript构建,也可能引入了前端框架如Bootstrap或Vue.js来提高用户体验和响应速度。JavaScript库如...
### 最新的 Java Web 2.0 开发工具 —— MyEclipse 7.0 M2 随着技术的不断发展,Java Web 开发工具也在不断地更新换代。MyEclipse 作为一款备受开发者喜爱的集成开发环境(IDE),在 Java Web 领域有着举足轻重的...
本文将详细探讨这个项目的核心概念、工作原理以及如何在实际开发中应用。 1. **项目概述** i-jetty项目旨在为Android开发者提供一个嵌入式的HTTP服务器,允许应用程序在本地或远程提供服务。它使得Android设备能够...
Eclipse作为一款强大的集成开发环境(IDE),为Java程序员提供了丰富的代码编辑、调试和项目管理工具。开发者可以利用Eclipse的特性,如自动完成、语法高亮和错误检测,来提高开发效率和代码质量。 在提供的压缩包...