(注:相关代码请参考 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
分享到:
相关推荐
《脚本技术Script56--2006》是一本专注于脚本编程的电子书籍,以CHM(Compiled Help Manual)格式提供下载。这个压缩包包含了一本完整的Script56年度指南,它深入探讨了2006年时的脚本技术,特别是JavaScript和相关...
简单明了的shell脚本语言讲义,让你轻松了解shell语言。
QLExpress是一种强大、轻量级且动态的编程语言,它为开发者提供了高效的代码编写和执行环境。QLExpress的设计目标是简化编程过程,提高开发效率,同时保持灵活性和可扩展性。这种语言通常适用于快速开发、脚本编写...
### Linux-定期清内存缓存-shell脚本 #### 背景与意义 在Linux系统中,内存资源的管理非常重要。随着系统运行时间的增长,内存中的缓存数据可能会占用大量空间,导致可用内存减少,从而影响系统的性能。为了确保...
"游戏脚本-猩红收割者-弗拉基米尔2.zip"这个压缩包很可能包含了某个游戏——可能是电子游戏或者角色扮演游戏——中的角色“猩红收割者”(Vladimir)的相关脚本代码。弗拉基米尔这个名字通常与吸血鬼或暗黑角色相...
Microsoft SQL Server 2008技术内幕 T-SQL 查询 一书中,第四章,索引优化章节的示例数据库脚本。
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神...
使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...
**批处理**(Batch Scripting),是一种计算机编程语言,它允许用户创建一系列预定义命令的脚本文件,以实现自动化任务的执行。在Windows操作系统中,这种脚本通常被称为**批处理脚本**,其文件扩展名为`.bat`或`....
magic-script是一款基于JVM的脚本语言,目前主要是为magic-api项目设计。magic-api,接口快速开发框架,通过Web页面配置,自动映射为HTTP接口;spider-flow,新一代爬虫平台,以图形化方式定义爬虫流程,不写代码...
仅供学习。勿用商业。谢谢合作。漏洞验证脚本ssl-deacth-alert(cve-2016-8610)
### Windows 7系统清理IE缓存的Batch脚本解析及应用 #### 一、脚本概述 在Windows 7操作系统中,Internet Explorer (IE) 浏览器是默认的浏览器之一。用户在浏览网页时,IE会将部分数据缓存在本地以加快网页加载...
7. **相关技术**: - DOM(文档对象模型):JavaScript操作HTML文档的主要接口,允许修改页面内容。 - Babel:一个转换JavaScript的工具,用于将ES6+的新特性转换为向后兼容的版本。 - Linting工具:如ESLint,...
标题"WINCC全局脚本-使用手册-中文版.zip"表明这是一个关于SIMATIC WinCC(西门子的一种人机界面软件)的资源,具体来说是关于全局脚本的使用手册,且该手册是中文版本。这意味着手册将详细解释如何在WinCC项目中...
本文将深入探讨“游戏脚本-虚空恐惧-科加斯.zip”所涉及的游戏脚本语言及其在游戏设计中的应用。 首先,我们要理解什么是游戏脚本。游戏脚本是用于控制游戏行为、事件序列和逻辑的编程代码,通常使用专门的脚本语言...
以下是从给定文件中提取并解析的关键SQL优化脚本,涵盖数据库缓存管理、资源状态监控、空间使用情况统计、索引优化以及数据库检查与修复等方面。 #### 1. 缓存对象查询与管理 - **查询数据库ID**:`select db_id('...
- **定义**:VBS(Visual Basic Script Edition)是微软推出的一种轻量级脚本语言,基于Visual Basic语言的一个子集。它直接由Windows系统解释执行,无需编译成二进制文件。 - **优点**: - 高效、易学,适用于自动...
通过以上知识点的梳理,我们可以了解到,Fine Packet Builder 结合 Jython 脚本语言不仅为网络协议的学习提供了实践平台,还大大降低了网络技术的入门门槛,使初学者能够在实践中加深对网络原理的理解。同时,详细的...
magic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zipmagic-script是一款基于JVM的脚本语言.zip