`
agapple
  • 浏览: 1582495 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

velocity的一些优化记录

阅读更多

背景

前段时间做了个项目,主要优化一个产品页面。整个优化过程中,针对velocity的分析过程占了比较大的比重,这里做一下整理和记录。

 

描述

velocity版本: 

 

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.6.4</version>
</dependency>

优化1: 锁优化

通过velocimacro.library.autoreload=false进行关闭autoreload,因为使用了同步锁,非常影响性能

"TP-Processor20" daemon prio=10 tid=0x00002aab4c7cb800 nid=0x3d46 waiting for monitor entry [0x00000000423a3000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at org.apache.velocity.runtime.VelocimacroFactory.getVelocimacro(VelocimacroFactory.java:571)
	- waiting to lock <0x00002aaad964ca48> (a org.apache.velocity.runtime.VelocimacroFactory)
	at org.apache.velocity.runtime.RuntimeInstance.getVelocimacro(RuntimeInstance.java:1563)
	at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:199)
	at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:175)
	at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
	at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
	at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
	at org.apache.velocity.Template.merge(Template.java:328)
	at org.apache.velocity.Template.merge(Template.java:235)

说明: 

1.  velocity针对macros的自动reload,采用了同步排他锁进行控制

2.  在velocity实现中,org.apache.velocity.runtime.VelocimacroFactory.getVelocimacro中,line 569,每次获取一个宏对象,都会进行一个是否需要自动reload的逻辑控制

3.  针对设置了autoReloadLibrary为true时,velocity就会先获取一个同步锁,然后进行相应检查判断是否需要重新载入

 

默认是关闭的,因为公司开发的框架中针对线上和线下velocity参数设置有所不同,在开发环境开启了autoreload,所以导致在测试时发现block现象很严重。

 

优化2: veocity cache策略

velocity针对template查找有一定的cache策略,比如是否启用cache,cache的数量大小。resource.manager.defaultcache.size=89(默认值为89,0代表不限制) 

 

TP-Processor12" daemon prio=10 tid=0x00002aab4c868800 nid=0x3d3c waiting on condition [0x0000000042abf000]
   java.lang.Thread.State: RUNNABLE
	at org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:175)
	at org.springframework.core.io.AbstractResource.exists(AbstractResource.java:51)
	at com.alibaba.citrus.service.velocity.impl.AbstractResourceLoader.getLastModified(AbstractResourceLoader.java:72)
	at org.apache.velocity.runtime.VelocimacroFactory.getVelocimacro(VelocimacroFactory.java:601)
	- locked <0x00002aaad964ca48> (a org.apache.velocity.runtime.VelocimacroFactory)
	at org.apache.velocity.runtime.RuntimeInstance.getVelocimacro(RuntimeInstance.java:1563)
	at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:199)
	at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:175)
	at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
	at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
	at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
	at org.apache.velocity.Template.merge(Template.java:328)
	at org.apache.velocity.Template.merge(Template.java:235)

 

 

1. velocity中使用ResourceManager进行资源查找,在ResourceManagerImpl资源管理查找中,定义了一份resource globalCache

2. 在globalCache.initialize()方法中,会读取定义 resource.manager.defaultcache.size配置,默认值只有89

3. global cache生效,必须要开启对应xxx.resource.loader.cache=true,这样的size调整才有意义,不然velocity个根本不会进行global cache

 

优化3:modificationCheckInterval优化

 

 

  如果开启了优化2,则会对该Resource定期进行是否已经进行了修改的扫描,file.resource.loader.modificationCheckInterval = 2 (单位为秒,如果不需要hot deploy,可以设置更大点)

 

说明:

1.  velocity通过ResourceManagerImpl进行资源加载,在开启优化2后,会针对从cache中返回的resource资源(velocity中模板都认为是一个resource)。

2.  针对resource会进行requiresChecking()判断,主要的依据就是modificationCheckInterval。 0代表永不做检查处理

 

 

优化4: MapGetExecutor优化处理

背景知识

  1. Uberspect : velocity中用于Node render时进行数据解析的一个操作 (introspection/reflection interface)
    • UberspectImpl : Uberspect的默认实现类
    • SecureUberspector(安全调用) , LinkingUberspector(链式支持)
  2. AbstractExecutor :velocity中实现具体$bean交互操作的工具(getMethod , render数据)
    • PropertyExecutor : pojo bean的处理规则,通过getXXX()进行处理
    • BooleanPropertyExecutor : boolean方法处理,通过isXXX()进行处理
    • MapGetExecutor : 如果是Map的子类,通过调用map.get()方法进行处理
    • GetExecutor : 默认调用bean的get()方法进行处理。 我们使用的一些PullTool,比如$form.preTest.defaultInstance,就是调用了$form.get("preTest")
  3. SetExecutor : 和AbstractExecutor相对应,是针对set进行处理.
    • SetPropertyExecutor , MapSetExecutor , PutExecutor 与get处理类似。
protected void discover (final Class clazz)
    {
        Class [] interfaces = clazz.getInterfaces();
        for (int i = 0 ; i < interfaces.length; i++)
        {
            if (interfaces[i].equals(Map.class))
            {
                try
                {
                    if (property != null)
                    {
                        setMethod(Map.class.getMethod("get", new Class [] { Object.class }));
                    }
                }

	    .......
            }
        }
    }

 

profile截图:


 

 

代码分析:MapGetExecutor的本意是对一个class如果是Map.class的之类,就委托对应的map.get方法进行处理。但在判断是否是Map之类的过程,通过getInterfaces后进行便利匹配,性能比较差。

优化: 

1. 自定义MapGetExecutor, 直接调用native方法isAssignableFrom进行Map转型判断

 

if (Map.class.isAssignableFrom(clazz)) { // 直接调用native方法进行,Map接口判断
            try {
                if (property != null) {
                    // 通过introspector进行method cache,同时直接查找对象clazz实例的method方法
                    setMethod(introspector.getMethod(clazz, "get", new Class[] { Object.class }));
                }
           }

2. 自定义UberspectImpl,引入前面自定义的CustomxMapGetExecutor

 

public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception {
.......
if (!executor.isAlive()) {
            executor = new CustomxMapGetExecutor(log, claz, identifier);
        }
.....
}

 3. 配置velocity参数,将自定义的CustomUberspectImpl引入到velocity调用

 

runtime.introspector.uberspect=xxxx.velocityx.CustomUberspectImpl

 

总结一下

最后的优化参数列表

 

file.resource.loader.cache = true
file.resource.loader.modificationCheckInterval = 0 #不检查
resource.manager.defaultcache.size=0 #无限制

velocimacro.library.autoreload=false

runtime.introspector.uberspect = xxxx.velocityx.CustomUberspectImpl

 

velocity的几个概念

 

  • Resource : 在velocity中每个模板都可以用一个Resource来表示,类似于velocity资源概念。
  • Node : 在velocity中系统引擎对resource解析后的生成的Node对象,可以理解为语法树等概念。主要的基类:SimpleNode
  • Directive : 在velocity系统中定义的一系统指令,比如#foreach ,#if, #macro等。
  • EventHandler & EventCartridge : velocity系统中提供的扩展机制,可以监听在velocity解析,渲染,异常过程中进行自定义的业务处理。比如我们的校长大人的安全框架,在webx3上已经被宝宝内嵌到velocity指令级别,而不是原先定义的宏概念。比如$sql和#escapse('sql')$value#end

说明:

 

 

其他

 

上次在qcon中,taobao的一个分享文章中提到一个char to byte的优化部分。它认为每次的String.tobytes[]都涉及一次StringCoding.encode的转化过程,有点浪费。

一个新的想法: 缓存velocity中的静态文本的String.toBytes()的数据,每次都只做动态数据的toBytes,提升系统性能。

 

这个就做的有点深度了,佩服taobao同学对性能的追求

  • 大小: 16.9 KB
6
0
分享到:
评论
2 楼 agapple 2013-08-22  
wsmajunfeng 写道
clazz.isAssignableFrom(Map.class)这块写反了吧,应该是Map.class.isAssignableFrom(clazz)


可能的,笔误,多谢指出
1 楼 wsmajunfeng 2013-08-22  
clazz.isAssignableFrom(Map.class)这块写反了吧,应该是Map.class.isAssignableFrom(clazz)

相关推荐

    大数据在电商的应用.pdf

    技术概念-逻辑处理 大数据价值体现 大数据价值 记录——情景辅助,操作基础 备份和监督——情景复原,责任追究 预测——情景研究,系统优化 纠偏——情景指引,方向微调 大数据价值体现 大数据创造价值的三个关键点...

    解读大数据.pdf

    IBM 把大数据概括为三 个 V,即大量化(Volume)、多样 化 (Variety) 和快速化 (Velocity) 。 由此可见,一方面,不能简单 地从字面上理解大数据之大,应该 从大价值上去理解,单一数据一样 大数据是指汇集不同...

    大数据与伦理.pdf

    ⾸先我们来看看百度百科对"⼤数据"的定义: ⼤数据(big data),指⽆法在⼀定时间范围内⽤常规软件⼯具进⾏捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策 ⼒、洞察发现⼒和流程优化能⼒的海量...

    notational-fzf-vim:vim的符号速度

    放松精神障碍来记录信息。 铲除妨碍其检索的常规牙垢。 --- Notational Velocity是一个记笔记应用程序,其中搜索笔记和创建笔记是相同的操作。 您搜索一个查询,如果没有匹配的注释,它将以该查询为标题创建一个...

    论大数据的数据来源与采集.docx

    大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。 1、大数据的来源与采集方式. 首先,来源多样是大数据的一个重要且普遍的特征,针对...

    大数据在生活中的应用(1).doc

    实例:你通过百度搜索 "贷款",之后,这个信息就会被记录, 当你访问一些网站其带有 百度广告位,那这些广告位 就会显示和 "贷款"相关的内容. 大数据从何而来?美国互联网数据中心指出,互联网上的数据每年将增长50%...

    大数据在生活中的应用.doc

    实例:你通过百度搜索 "贷款",之后,这个信息就会被记录, 当你访问一些网站其带有 百度广告位,那这些广告位 就会显示和 "贷款"相关的内容。 大数据从何而来?美国互联网数据中心指出,互联网上的数据每年将增长50...

    大数据在生活中的应用.docx

    实例:你通过百度搜索 "贷款",之后,这个信息就会被记录, 当你访问一些网站其带有 百度广告位,那这些广告位 就会显示和 "贷款"相关的内容。 大数据从何而来?美国互联网数据中心指出,互联网上的数据每年将增长50%...

    大数据PPT材料.docx

    在企业数据还没有井喷的时候,我们就发现个人用户以及社会应用产生的数据已经开始爆发了,比如社交、交互式应用带来了大量的网络数据,这种非对称性数据充斥在我们周围,包括网络日志、点击流、电话记录、医疗记录、...

    浅谈对大数据的理解.pdf

    速度(Velocity):指获得数据的速度,就是通过算法对数据的逻辑处理速度⾮常快,1秒定律,可从各种类型的数据中快速获得⾼价值的 信息,这⼀点也是和传统的数据挖掘技术有着本质的不同。; 价值(Value):指价值...

    RuoYi若依管理系统-其他

    邮箱重复验证个人中心刷新后样式问题操作日志返回参数添加非空验证velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞子表模板默认日期格式化代码生成预览语言根据后缀名高亮显示代码生成主子表相同...

    大数据下软件技术的.doc

    大数据是以数据容量为计量的一种全新的数据表达方式,容量大是其主要的特点, 从目前对大数据的研究来看,大数据时代的"3V理论"受到了大部分学者的认同,即大 数据应该具有"Volume"、"Velocity"以及"Variety...

    高频大数据解决方案.pptx

    电信领域 计费和权限管理,用户数据 个性化营销 广告优化,观众分组 能源与传感器领域 智能电网/电表,资产跟踪与管理,实时交通与地理位置 证券市场 风控管理,市场数据管理 基础设施 数据管道,批次-&gt;实时,流...

    剖析大数据.docx

    不过随着IT 应用在业务中的逐渐深入,决策者们发现他们需要收集的数据不仅存在于销售年报这样的传统信息中,而且还同样存在于网络日志、传感器网络、社交网络、影音文件、互联网搜索索引、详细通话记录、医疗记录、...

    大数据与我们的生活.docx

    数据的收集方式有很多方法,通过浏览器可以获取用户上网的浏览记录,搜索引擎可以轻而易举地获取全球每天发出的数十亿条搜索指令,购物网站可以得到顾客的购买记录,也可以根据人们在社交软件上面的聊天记录来收集...

    大数据的V特征.doc

    然而,数据多样性的增加主要是由于新型多结构数据,以 及包括网络日志、社交媒体、互联网搜索、手机通话记录及传感器网络等数据类型造成 。其中,部分传感器安装在火车、汽车和飞机上,每个传感器都增加了数据的多样...

    [Flash.ActionScript.3.0动画教程

    1.2.1 帧就是记录 1.2.2 程序帧 1.3 动态动画 VS 静态动画小结 第2章ActionSript 3.0动画基础 2.1 动画基础 2.2 关于ActionSript版本 2.3 类和面向对象编程 2.3.1 基类 2.3.2 包(Package) 2.3.3 导入(Import) 2.3.4 ...

    大数据使用及现状调研报告.pdf

    ⼤数据使⽤及现状调研报告 ⼤数据使⽤及现状调研报告 ⼤数据,指⽆法在⼀定时间范围内⽤常规软件⼯具进⾏捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策⼒、洞察发 现⼒和流程优化能⼒的海量、⾼...

    大数据产业链概述.docx

    国际数据公司(IDC)从大数据的 4 个特征来定义,即海量的数据规模 (Volume)、快速的数据流转和动态的数据体系(Velocity)、多样的数据类型(Variety)、巨大的数据价值(Value)。维基百科对"大数据"的定义是...

    带您认识大数据.doc

    全 球最具权威的IT研究与顾问咨询公司Gartner将"大数据"定义为"需要新处理模式才能具 有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产"。 麦肯锡全球研究所给出的定义是:一种规模大到...

Global site tag (gtag.js) - Google Analytics