ps:热部署和热加载其实是两个类似但不同的概念,之前理解不深,so,这篇文章重构了下。

一、热部署与热加载

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

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

二、实现原理

热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。

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

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

三、在java中应用

1.生产环境

热部署作为一个比较灵活的机制,在实际的生产上运用还是有,但相对很少,热加载则基本没有应用。分析如下

  • 一、安全性

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

  • 二、适用的情景

技术大部分是跟需求挂钩的,而需要热部署的情景很少。

  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 国际许可协议发布,转载必须保留署名及链接。

java的热部署和热加载的更多相关文章

  1. Tomcat热部署和热加载

    1.热部署与热加载 在应用运行的时候升级软件,无需重新启动的方式有两种,热部署和热加载.它们之间的区别是: (1).部署方式: 热部署在服务器运行时重新部署项目.热加载在运行时重新加载class. ( ...

  2. springboot热部署(一)——Java热部署与热加载原理

    一.概述 在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载. 对于Java应用程序来说, 热部署就是在服务器运行时重新部署项目,——生产环境 热加载即在在运行时重新加载class,从而 ...

  3. SpringBoot+gradle+idea实现热部署和热加载

    前言 因为之前使用myeclipes的同学就知道,在使用myeclipes的时候,java文件或者jsp文件写完之后会被直接热加载到部署的容器中,从而在开发的时候,不同经常去重启项目,从而达到了增加开 ...

  4. 【Tomcat】tomcat热部署和热加载(转载)

    我在项目开发过程中,经常要改动JAVA/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果.有两种方式热部署 和热加载: 1.热加载:在server.xml ...

  5. SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?

    在SpringBoot开发调试中,如果我每行代码的修改都需要重启启动再调试,可能比较费时间:SpringBoot团队针对此问题提供了spring-boot-devtools(简称devtools)插件 ...

  6. Tomcat热部署与热加载!

    所谓的热部署与热加载就是两个值:(reloadable='true'与autoDeloy='true')

  7. tomcat 和 jboss的热部署(热发布)问题

    所谓的热部署(热发布)(下面称为“热部署”),就是说,在web工程发布之后,不可避免的,会遇到修改BUG的问题.现在的热部署就是为了解决这个问题,其功能就是说:在不停止web服务的同时,对jsp和Ja ...

  8. java中带继承类的加载顺序详解及实战

    一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...

  9. Java虚拟机——类的结构与加载

    1.为什么Java可以跨平台 因为有java虚拟机,跨平台是因为字节码即class文件具有平台无关性,java代码会经过java虚拟机转换为字节码 2.class文件的结构 class文件主要是以8位 ...

随机推荐

  1. C# linq左连接与分组

    1.左连接使用DefaultIfEmpty(): 2.分组时候判断newper.FirstOrDefault() == null ? null: newper.ToList()这个经常出错误,如果不判 ...

  2. Spring各jar包作用及依赖

    先附spring各版本jar包下载链接http://repo.spring.io/release/org/springframework/spring/ spring.jar 是包含有完整发布模块的单 ...

  3. HTML+CSS+js常见知识点

    一.HTML.CSS常见知识点 1.垂直居中盒子 /* 方法一 */ html, body { width: 100%; height: 100%; padding: 0; margin: 0; } ...

  4. Linux系列教程(二十)——Linux的shell概述以及如何执行脚本

    从这篇博客开始,我们将进入Linux的shell脚本的学习,这对于Linux学习爱好者而言是特别重要的一节,也是特别有意思的一节,shell 脚本就像我们知道的Java,php类似的编程语言一样,通过 ...

  5. JavaScript基本知识点整理(超实用)

      絮叨絮叨                   今天给大家分享一下这两天自己整理的JavaScript部分的笔记,下面都是我觉得比较常用的,希望能帮助到大家! 1. 导入JS的三种方式 ①在HTML ...

  6. 第二篇-FPGA学习之RoadMap

    古语云:知己知彼,百战不殆.那么既然选择了FPGA之路,欲练此功,必先-- 必先了解清楚,FPGA的特点,FPGA善于/不善于解决什么类型问题,以及FPGA应用的方向,FPGA学习的要素等等. 一.F ...

  7. concurrent.futures

    concurrent.futures concurrent.futures提供高层次的接口,用来实现异步调用. 这个异步执行可以使用threads(ThreadPoolExecutor)或者proce ...

  8. 深入浅出Java动态代理

    文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...

  9. Java 中实现方法重试的一种机制

    有这样一个需求,当调用某个方法抛出异常,比如通过 HttpClient 调用远程接口时由于网络原因报 TimeOut 异常:或者所请求的接口返回类似于"处理中"这样的信息,需要重复 ...

  10. 去除HTML选择——兼容IE、FireFox(document.onselectstart,样式)

    引之:http://taoistwar.iteye.com/blog/278963 今天做一个拖动效果,在网上找了个模板,作发后发现一拖动就会选择其它页面部分,需要去除这个效果, 找了个模板看了下发现 ...