`
express_wind
  • 浏览: 30173 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

QLExpress脚本语言技术讲解(7)-------QlExpress的对象缓存优化

阅读更多

(注:相关代码请参考 com.ql.util.express.instruction.OperateDataCacheManager类,

QLExpress 源代码下载地址:http://code.taobao.org/p/QLExpress/src/ )

 

 

几乎所有的动态脚本语言在运行期都需要频繁的创建对象,并且强烈依赖语言的底层垃圾回收(java中称作GC ,可以参考这篇 《Java GC 》http://bruce-ko.iteye.com/blog/420262 )。

 

在多线程运行的情况下,cpu和内存的消耗很有可能被这个过程消耗殆尽。

近期,QlExpress在这方面做了较大的优化,在实际使用过程中,也确实效果明显。

 

 

本篇将具体介绍QlExpress创建对象过程的优化实现原理,也欢迎广大技术码农共同交流探讨。

 

public class OperateDataCacheManager {
	
	private static ThreadLocal<IOperateDataCache> m_OperateDataObjectCache = 
		new ThreadLocal<IOperateDataCache>(){
		protected IOperateDataCache initialValue() {
	        return new OperateDataCacheImpl(30);
	    }
	};

        //获取ThreadLocal成员变量
	public static IOperateDataCache getOperateDataCache(){
		return m_OperateDataObjectCache.get();
	}

//其他代码逻辑

}
 

ThreadLocal成员变量可以保证多线程情况下数据的独立性、安全性,并且尽量保持高并发性,工作原理可以参考

 《理解ThreadLocal 》 http://blog.csdn.net/qjyong/article/details/2158097

 

 

 


 

 

具体方案请看上图的数据结构示意图,(点击可以看大图)

 

在原来每次需要

new OperateDataField(Object aFieldObject,String aFieldName)       的时候,

每一次转而调用

OperateDataCacheManager.fetchOperateDataField(Object aFieldObject,String aFieldName),

这个时候会从缓冲区域获取到一个OperateDataField,成员变量被赋值。

而每次脚本运行完资源回收的时候,会把 OperateDataField【0..field】全部显示置为null,使所有的外部链接对象被java虚拟机马上释放。

 

注意:如果超过len长度, fetchOperateDataField 会直接调用new OperateDataField(Object aFieldObject,String aFieldName)返回,回收内存也就只能等jvm定期去gc了。

 

通常,我们的web应用服务器都会使用线程池来作为多线程并发的管理。

常驻内存的线程使用类似qlExpress的内存缓冲区管理方式, 减少频繁对象创建 可以很大程度上的带来的 CPU开销,内存被重复利用,也会稳定很多。

经过优化的方案在我们实际使用中也确实看到了效果,cpu 的load减少了近一倍。

 

 

  • 大小: 45.3 KB
分享到:
评论

相关推荐

    QLExpress是一种功能强大、轻量级、动态的Java平台语言,旨在提高开发人员在不同业务场景中的生产力

    QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性: 1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。 2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的...

    QLExpress:QLExpress是用于Java平台的功能强大,轻量级,动态的语言,旨在提高开发人员在不同业务场景中的工作效率

    2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。 3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使...

    脚本技术script56--2006(CHM) 下载

    《脚本技术Script56--2006》是一本专注于脚本编程的电子书籍,以CHM(Compiled Help Manual)格式提供下载。这个压缩包包含了一本完整的Script56年度指南,它深入探讨了2006年时的脚本技术,特别是JavaScript和相关...

    QLExpress is a powerful, lightweight, dynamic language for.zip

    QLExpress是一种强大、轻量级且动态的编程语言,它为开发者提供了高效的代码编写和执行环境。QLExpress的设计目标是简化编程过程,提高开发效率,同时保持灵活性和可扩展性。这种语言通常适用于快速开发、脚本编写...

    QLExpress.rar

    由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神...

    brother_ql:适用于Brother QL系列标签打印机的光栅语言协议的Python软件包(QL-500,QL-550,QL-560,QL-570,QL-700,QL-710W,QL-720NW,QL-800,QL-810W ,QL-820NWB,QL-1050,QL-1060N等)

    使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...

    exploit (Linux 内核CVE-2024-1086漏洞复现脚本)

    Linux 内核CVE-2024-1086漏洞复现脚本。 在普通用户下,将文件上传后,chmod 777 exploit ,然后运行 ./exploit ,提权成功,输入id,可看到已经是root权限 。

    magic-script是一款基于JVM的脚本语言,目前主要是为magic-api项目设计

    magic-script是一款基于JVM的脚本语言,目前主要是为magic-api项目设计。magic-api,接口快速开发框架,通过Web页面配置,自动映射为HTTP接口;spider-flow,新一代爬虫平台,以图形化方式定义爬虫流程,不写代码...

    史上最详细批处理脚本(BAT)教程-精华版

    **批处理**(Batch Scripting),是一种计算机编程语言,它允许用户创建一系列预定义命令的脚本文件,以实现自动化任务的执行。在Windows操作系统中,这种脚本通常被称为**批处理脚本**,其文件扩展名为`.bat`或`....

    3ds MAXScript脚本语言 完全学习手册

    《3ds MAXScript脚本语言完全学习手册》是一本全面介绍MAXScript脚本语言的教程,不仅适合于初学者学习基础知识,也适合于专业人士深入了解高级功能和技术细节。通过本书的学习,读者将能够有效地利用MAXScript提升...

    程序设计实践-大作业-客服脚本语言解释器1

    1. **优化**: 对解释器进行性能优化,例如通过缓存常量或优化执行路径。 2. **高级特性**: 添加更多的数据类型,如数组、对象等,并支持更复杂的控制结构,如循环、异常处理等。 3. **模块化**: 实现模块系统,允许...

    WINCC全局脚本-使用手册-中文版.zip

    标题"WINCC全局脚本-使用手册-中文版.zip"表明这是一个关于SIMATIC WinCC(西门子的一种人机界面软件)的资源,具体来说是关于全局脚本的使用手册,且该手册是中文版本。这意味着手册将详细解释如何在WinCC项目中...

    C-Script脚本使用教程

    C-Script脚本使用教程是一份全面介绍C-Script脚本的教育资源,旨在帮助用户理解和掌握这种脚本语言。C-Script,作为一种基于C语言语法的脚本语言,被广泛应用于自动化任务、系统管理以及软件开发等多个领域。下面将...

    SQL常用优化脚本,优化SQL语句

    以下是从给定文件中提取并解析的关键SQL优化脚本,涵盖数据库缓存管理、资源状态监控、空间使用情况统计、索引优化以及数据库检查与修复等方面。 #### 1. 缓存对象查询与管理 - **查询数据库ID**:`select db_id('...

    wincc-全套脚本总结

    1、wincc全局脚本动作-------隐藏控件; #include "apdefap.h" int gscAction( void ) { // WINCC:TAGNAME_SECTION_START // syntax: #define TagNameInAction "DMTagName" // next TagID : 1 // WINCC:TAGNAME_...

    Linux系统缓存清理脚本

    ### Linux系统缓存清理脚本知识点详解 #### 一、概述 在Linux系统运维工作中,定期清理系统缓存是一项非常重要的任务。缓存虽然能够提高数据读取速度,但随着时间的推移,缓存文件会逐渐积累占用大量磁盘空间,并...

    (一)网络脚本语言基础

    通过以上知识点的梳理,我们可以了解到,Fine Packet Builder 结合 Jython 脚本语言不仅为网络协议的学习提供了实践平台,还大大降低了网络技术的入门门槛,使初学者能够在实践中加深对网络原理的理解。同时,详细的...

    一键安装docker和青龙面板+一键安装MaiARK 短信登陆验证脚本

    文件结构 -docker ---------MaiARK.sh -----------------一键安装MaiARK脚本 ---------ql.sh -----------------一键安装青龙面板脚本

    magic-script是一款基于JVM的脚本语言.zip

    magic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zip

Global site tag (gtag.js) - Google Analytics