(注:相关代码请参考 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脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性: 1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。 2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的...
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。 3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使...
《脚本技术Script56--2006》是一本专注于脚本编程的电子书籍,以CHM(Compiled Help Manual)格式提供下载。这个压缩包包含了一本完整的Script56年度指南,它深入探讨了2006年时的脚本技术,特别是JavaScript和相关...
简单明了的shell脚本语言讲义,让你轻松了解shell语言。
QLExpress是一种强大、轻量级且动态的编程语言,它为开发者提供了高效的代码编写和执行环境。QLExpress的设计目标是简化编程过程,提高开发效率,同时保持灵活性和可扩展性。这种语言通常适用于快速开发、脚本编写...
### Linux-定期清内存缓存-shell脚本 #### 背景与意义 在Linux系统中,内存资源的管理非常重要。随着系统运行时间的增长,内存中的缓存数据可能会占用大量空间,导致可用内存减少,从而影响系统的性能。为了确保...
使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...
Linux 内核CVE-2024-1086漏洞复现脚本。 在普通用户下,将文件上传后,chmod 777 exploit ,然后运行 ./exploit ,提权成功,输入id,可看到已经是root权限 。
**批处理**(Batch Scripting),是一种计算机编程语言,它允许用户创建一系列预定义命令的脚本文件,以实现自动化任务的执行。在Windows操作系统中,这种脚本通常被称为**批处理脚本**,其文件扩展名为`.bat`或`....
magic-script是一款基于JVM的脚本语言,目前主要是为magic-api项目设计。magic-api,接口快速开发框架,通过Web页面配置,自动映射为HTTP接口;spider-flow,新一代爬虫平台,以图形化方式定义爬虫流程,不写代码...
《3ds MAXScript脚本语言完全学习手册》是一本全面介绍MAXScript脚本语言的教程,不仅适合于初学者学习基础知识,也适合于专业人士深入了解高级功能和技术细节。通过本书的学习,读者将能够有效地利用MAXScript提升...
仅供学习。勿用商业。谢谢合作。漏洞验证脚本ssl-deacth-alert(cve-2016-8610)
7. **相关技术**: - DOM(文档对象模型):JavaScript操作HTML文档的主要接口,允许修改页面内容。 - Babel:一个转换JavaScript的工具,用于将ES6+的新特性转换为向后兼容的版本。 - Linting工具:如ESLint,...
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的网络安全漏洞,它允许攻击者通过在网页上插入恶意脚本,从而在用户的浏览器上执行代码。这些脚本可以窃取用户的数据,包括登录凭证、个人信息,甚至操纵...
1. **优化**: 对解释器进行性能优化,例如通过缓存常量或优化执行路径。 2. **高级特性**: 添加更多的数据类型,如数组、对象等,并支持更复杂的控制结构,如循环、异常处理等。 3. **模块化**: 实现模块系统,允许...
标题"WINCC全局脚本-使用手册-中文版.zip"表明这是一个关于SIMATIC WinCC(西门子的一种人机界面软件)的资源,具体来说是关于全局脚本的使用手册,且该手册是中文版本。这意味着手册将详细解释如何在WinCC项目中...
### Linux系统缓存清理脚本知识点详解 #### 一、概述 在Linux系统运维工作中,定期清理系统缓存是一项非常重要的任务。缓存虽然能够提高数据读取速度,但随着时间的推移,缓存文件会逐渐积累占用大量磁盘空间,并...
1、wincc全局脚本动作-------隐藏控件; #include "apdefap.h" int gscAction( void ) { // WINCC:TAGNAME_SECTION_START // syntax: #define TagNameInAction "DMTagName" // next TagID : 1 // WINCC:TAGNAME_...
- **定义**:VBS(Visual Basic Script Edition)是微软推出的一种轻量级脚本语言,基于Visual Basic语言的一个子集。它直接由Windows系统解释执行,无需编译成二进制文件。 - **优点**: - 高效、易学,适用于自动...