java的热部署和热加载

ps:热部署和热加载实际上是两个相似但不一样的概念,以前理解不深,so,这篇文章重构了下。java

1、热部署与热加载

在应用运行的时升级软件,无需从新启动的方式有两种,热部署和热加载。git

对于Java应用程序来讲,热部署就是在服务器运行时从新部署项目,热加载即在在运行时从新加载class,从而升级应用。github

2、实现原理

热加载的实现原理主要依赖java的类加载机制,在实现方式能够归纳为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,若是类的时间戳变掉了,则将类从新载入。web

对比反射机制,反射是在运行时获取类信息,经过动态的调用来改变程序行为;
热加载则是在运行时经过从新加载改变类信息,直接改变程序行为。 spring

热部署原理相似,但它是直接从新加载整个应用,这种方式会释放内存,比热加载更加干净完全,但同时也更费时间。sql

3、在java中应用

1.生产环境

热部署做为一个比较灵活的机制,在实际的生产上运用仍是有,但相对不多,热加载则基本没有应用。分析以下编程

  • 1、安全性

热加载这种直接修改jvm中字节码的方式是难以监控的,不一样于sql等执行能够记录日志,直接字节码的修改几乎没法记录代码逻辑的变化,对既有代码行为的影响难以控制,对于越注重安全的应用,热加载带来的风险越大,这比如给飞行中的飞机更换发动机。tomcat

  • 2、适用的情景

技术大部分是跟需求挂钩的,而须要热部署的情景不多。安全

  1. 频繁的部署而且启动耗时长的应用
  2. 没法中止服务的应用

在生产中,并无须要频繁部署的应用,即便是敏捷,再快也是一周一次的迭代,而且经过业务划分和模块化编程,部署的代价彻底能够忽略不计,对于现有的应用,启动耗时再长,也并不是长到没法忍受,若是真的这么长,那更应该考虑的是如何进行模块拆分,分布式部署了。服务器

对于没法中止服务的应用,好比如今的云计算平台这样分布式应用,采用分批上线也能够知足需求,相似热部署方案应该是放在最后考虑的解决方案。

2.开发环境

在生产中,不会有频繁的部署而且启动耗时长的应用,但因为云计算的兴起,热部署仍是有其应用。
而热加载有点玩火,太危险了。但在开发和debug中,频繁启动应用却随处可见,热加载机制能够极大的提高开发效率。这两种机制,在开发中还有另一种称呼—开发者模式。

对于大型项目:每每启/停须要等待几分钟时间。更浪费时间的是,对于一个类中的方法的调试过程,若是修改屡次,须要反复的启停服务器,浪费的时间更多。

以目前的crm项目为例,其启动时间为5m,以一天debug重启十次,一个月工做20天来算,每一年重启耗时25人日,若是能彻底使用热加载,每一年节省重启时间近1人月。

crm pool启动耗时

1.struts2热加载

在struts2中热加载即开发者模式,在struts.xml配置

<constant name="struts.devMode" value="true" />

从而当更改struts.xml文件后不须要从新启动服务器就能够进行程序调试。

2.开发时使用tomcat热加载

tomcat自己默认开启了热部署方式,但热部署是直接从新加载整个应用,耗时跟重启服务器差很少,咱们须要的实际上是热加载,即修改了哪一个class,只从新加载这一个class,这样耗时几乎为0。
对于tomcat5.x 以上版本,均已支持必定程度上得热加载,但这种方式只针对代码行级别的,也就是说若是新删方法,注解,类,或者变量时是无效的,只能重启,这是我目前在公司开发时用的方式,能够显著下降debug时的重启次数,提升开发效率

1.将tomcat server.xml文件的context reloadable 值置为false 或者在web modules中编辑取消Auto reloading选项。

<Context reloadable="false"/>

OR

2.修改eclipse中的server配置

这样作能够在在修改代码以后,不会自动重启服务器,而只加载代码,新增一行java代码ctrl+s后直接刷新页面或调用接口便可看到效果,无需重启tomcat。

3.远程debug中使用tomcat热加载

tomcat的热加载机制不只能够在本地debug时,tomcat的远程调试也支持热部署,经过eclipse debug远程到远程tomcat上,修改本地代码,ctrl+s后直接刷新页面后调用接口,便可发现远程tomcat已将本地代码进行了热加载。

4.jrebel插件方式

jrebel插件能够进行更完全的热加载,不只包括类,甚至支持spring 等配置文件的热加载,但公司项目开发环境复杂,目前在eclipse中配置一直没有成功,只能使用tomcat自带的热加载机制。

总结

在实际生产中热部署在云计算中运用挺多,但热加载没有,而在开发中,热加载能够显著的提高工做效率,强烈推荐使用热加载方式,不只tomcat,大多数其余servlet容器也支持这种方式,你们能够自行搜索相关技巧。

参考文档 :

1.Tomcat 热部署实现方式源码分析总结

2.提升开发效率-jrebel插件安装

做者:初龙

原文连接:https://chulung.com/article/thermal-deployment-and-thermal-loading-of-java

本文由MetaCLBlog于2017-07-17 09:00:02自动同步至cnblogs

本文基于 知识共享-署名-非商业性使用-禁止演绎 4.0 国际许可协议发布,转载必须保留署名及连接。

相关文章
相关标签/搜索