原文:https://yq.aliyun.com/articles/4227?spm=5176.100239.yqblog1.20.cfRztB

摘要: 今年双十一,是应用容器的最新版本Ali-tomcat 7.0.59.x应对的第一次双十一。这个版本包含的一个主要功能是并行类加载,本文主要对并行类加载在双十一期间的支持做一个总结。 并行类加载在双十一期间最主要的业务系统,在双十一期间支撑了每秒14w订单创建,是一个非常了不起的成绩!

今年双十一,是应用容器的最新版本Ali-tomcat 7.0.59.x应对的第一次双十一。这个版本包含的一个主要功能是并行类加载,本文主要对并行类加载在双十一期间的支持做一个总结。

并行类加载在双十一期间最主要的业务系统,在双十一期间支撑了每秒14w订单创建,是一个非常了不起的成绩!

业务背景

由于各种原因,该业务系统比较庞大,依赖较为复杂。为了解决业务复杂性,应用引入了模块化系统,通过模块化的方式抽象出一系列的bundle,而bundle之间互相隔离,享有独立的类加载器。

由于bundle之间相互隔离,我们自然就会想到,是否能够在应用启动时多线程并行的初始化这些bundle呢?

原来的应用运行在JDK6上,Tomcat启动的时候,应用的Classloader(WebappClassLoader)在进行类加载的时候是顺序加载的,因为JDK6上Classloader.loadClass(String name)这个方法是synchonized的,如果应用里面有多个线程在同时调用loadClass方法进行类加载的话,那么锁的竞争将会非常激烈。

大家知道在JDK7上,如果调用Classloader.registerAsParallelCapable方法,则会开启并行类加载功能,把锁的级别从ClassLoader对象本身,降低为要加载的类名这个级别。换句话说只要多线程加载的不是同一个类的话,loadClass方法都不会锁住。遗憾的是,开启并行类加载必须要求一个类加载器继承链路上所有类加载器都调用registerAsParallelCapable,但tomcat7自带的WebappClassLoader并没有调用registerAsParallelCapable,所以老版本的tomcat7即使运行在JDK7上,也无法利用并行类加载的特性。

实现原理

从Ali-tomcat 7.0.59.2版本开始解决了这个问题,支持在WebappClassLoader中打开registerAsParallelCapable方法。但是情况没有那么简单,还需要解决的一个问题是如何兼容JDK6的问题,因为tomcat7.x版本是基于JDK6编译,同时运行在JDK6和JDK7+以上的。JDK6下是没有Classloader.registerAsParallelCapable这个方法的,所以JDK6下必须保持原有的行为,在JDK7下才能支持并行类加载功能。也就是说,即使用户配置了并行类加载,那么tomcat也必须根据运行时的JDK版本来决定是否开启并行类加载功能。Ali-tomcat通过反射机制解决了这个问题,在运行时刻对应用的WebappClassLoader尝试注册并行类加载功能,当发现没有这个方法时,会自动fall back到普通的类加载,也就是线性类加载功能。

并行类加载体系结构

可以看到,实际运行过程中,tomcat会自动根据JDK版本来选择是否启用并行类加载功能。当然这项功能默认是关闭的,需要用户通过配置文件显示开启。

双十一应用实际运行数据

我们看到在实际线上机器的启动时间上,当开启并行类加载功能后,模块化系统的启动时间提升了47%,应用整体启动时间提升了29%!

配置方式

  1. 确认tomcat的运行环境是JRE7及以上。
  2. 安装ali-tomcat 7.0.59.3版本
sudo yum install -b current taobao-tomcat-7.0.59.3

  3.修改/home/admin/$APP/conf/tomcat/context.xml,如果这个文件不存在,则从/opt/taobao/tomcat/conf/context.xml拷贝一份。添加如下配置:

<Loader loaderClass="org.apache.catalina.loader.ParallelWebappClassLoader" />

  4.重启Tomcat

  5.成功启动后,应该会在控制台看到类似如下的日志:

6.	2015-10-12 14:22:50,444 org.apache.catalina.loader.ParallelWebappClassLoader <clinit>

  

INFO: ParallelWebappClassLoader registration succeeded.

  

开源社区贡献

并行类加载功能已经在捐献给Apache tomcat社区,并且被社区接受,在最新的Apache tomcat 7.0.65版本中已经包含该项功能。

结语

并行类加载功能在模块化业务应用,以及合并部署等等场景下对于性能有较大提升。后续Ali-tomcat会在开发体验,监控诊断等方面继续发力,帮助业务系统提升开发诊断效率!

【转】并行类加载——让tomcat玩转双十一 @双十一实战的更多相关文章

  1. 并行类加载与OSGI类加载

    这回来分析一下OSGI的类加载机制. 先说一下OSGI能解决什么问题吧. 记得在上家公司的时候,经常参与上线.上线一般都是增加了一些功能或者修改了一些功能,然后将所有的代码重新部署.过程中要将之前的服 ...

  2. 转:手把手教你如何玩转Solr(包含项目实战)

    原文地址:手把手教你如何玩转Solr(包含项目实战) 参考原文

  3. java类加载器-Tomcat类加载器

    在上文中,已经介绍了系统类加载器以及类加载器的相关机制,还自定制类加载器的方式.接下来就以tomcat6为例看看tomat是如何使用自定制类加载器的.(本介绍是基于tomcat6.0.41,不同版本可 ...

  4. 手把手教你如何玩转Solr(包含项目实战)

    一:Solr简介       Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引 ...

  5. Docker竟然还能这么玩?商业级4G代理搭建实战!

    时间过得真快,距离这个系列的上一篇文章<商业级4G代理搭建指南[准备篇]>发布的时间已经过了两个星期了,上个星期由于各种琐事缠身,周二开始就没空写文章了,所以就咕咕咕了. 那么在准备篇中, ...

  6. Tomcat类加载器

    1JVM类加载机制   JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使 ...

  7. 深入剖析Tomcat类加载机制

    1JVM类加载机制 JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使用n ...

  8. Tomcat系列(7)——Tomcat类加载机制

    1. 核心部分 1. 类加载器: 通过一个类的全限定名来获取描述此类的二进制字节流. 对于任意一个类,都需要由加载他的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一 ...

  9. 图解Tomcat类加载机制(阿里面试题)

    Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给 ...

随机推荐

  1. Got minus one from a read call异常

    Caught: java.sql.SQLException: Io 异常: Got minus one from a read call使用JDBC连接Oracle时,多次出现上述错误,后来去网上找了 ...

  2. 在 Linux OpenVPN 服务端吊销客户端证书

    OpenVPN服务器与 VPN 客户端之间的身份验证, 主要是通过证书来进行的.有时我们需要禁止某个用户连接 VPN 服务器,则将其证书吊销即可.要吊销(Revoke) OpenVPN 客户端证书, ...

  3. Linux编程之ICMP洪水攻击

    我的上一篇文章<Linux编程之PING的实现>里使用ICMP协议实现了PING的程序,ICMP除了实现这么一个PING程序,还有哪些不为人知或者好玩的用途?这里我将介绍ICMP另一个很有 ...

  4. js拉起或下载app

    产品提了个需求,通过手机网页判断是否安装了自己公司app,如果安装了则拉起app,没有安装则跳转到下载页. 经过各种查阅资料尝试总结了一个还算可以的办法. 拉起app的原理就是js和原生统一好一个地址 ...

  5. css3瀑布流

    css3虽然可以实现,不过要是真的运用到项目中还是老老实实写js吧 .container{ /*列的宽度*/ column-width:160px; -webkit-column-width:160p ...

  6. 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来

    Wallpaper Engine,是一款Steam上的特别特别炫酷的壁纸定制软件.它可以对你的桌面进行定制,可以使用视频,动画,网页等形式来替换壁纸. 注意到没,关键是可以使用Html格式的文件作为桌 ...

  7. 【转载】JavaScript继承详解一

    面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++.C#.Java)的开发经验. 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则 ...

  8. Spring框架中 配置c3p0连接池 完成对数据库的访问

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  9. 【疑问】css

    1.p{float:left}好像意思是p后面的元素往左浮动的意思啊!!2.ff下,button的文字好像没法垂直居中2.1 button垂直对齐,其line-height似乎需要减2px(依边框宽度 ...

  10. C#调用PB写的com组件dll

    背景 小编为了使用C#去模仿PB代码的加密算法,结果发现PB算法中,的long类型只有21亿,实际上传入的数值达到了78亿,造成了数据溢出,精度丢失的情况. 然而PB的算法已经使用C#不可以还原(C# ...