为你的JavaScript内存性能做个体检

简介: 转载请注明来源:http://blog.csdn.net/horkychen 因为JavaScript的语言特性决定了,它的内存管理更主要的是交给浏览器的JavaScript解释器来处理,这其中被广为人知是垃圾回收(Garbage Collection)机制。

转载请注明来源:http://blog.csdn.net/horkychen

因为JavaScript的语言特性决定了,它的内存管理更主要的是交给浏览器的JavaScript解释器来处理,这其中被广为人知是垃圾回收(Garbage Collection)机制。不过天生的限制使得JS使用的内存也需要加以控制,特别是现在使用HTML5的游戏对JS内存管理的要求也越来越高。

目前很多的资料都是关注在JavaScript的执行性能上的。如FireBug等工具都能提供相应的功能。下面是一些参考网页:

   Javascript性能分析——工具(YUI Profiler)

   JSProfiler – JS性能分析工具

   移动Web应用程序开发 高性能JavaScript篇 (三) JavaScript 加载解析和部署

    javascript 内存泄露工具使用   (内存泄露和内存消耗不算是一个话题,但也可以做为参考)

目前,确实只有Chrome的开发工具,可以获取当前脚本占用的堆(Heap)的状况。在Profiles选择对Heap进行快照分析就可以了。

(下图显示的是某个对象占用17M多的内存)

详细的说明,请点这里

 

对于其它的浏览器可以使用vmmap对浏览器查看其总体的内存状况:

以下是Mac OS下vmmap对Safari获取结果 (执行是vmmap pid. 这个pid是Safari运行叫起的另一个进程):

REGION TYPE                        VIRTUAL
===========                        =======
...

JS JIT generated code               256.0M
JS JIT generated code (reserved)    768.0M        reserved VM address space (unallocated)
JS VM register file                  4096K
JS garbage collector                 34.6M
MALLOC                              625.0M        see MALLOC ZONE table below
...

注意:如果其中JS garbage collector后面数字比较大,表示脚本里有可能存在较多的闭包使得GC不能及时发挥作用。

 

再使用heap指令,可以看到Malloc Zone中的状况:

                                            VIRTUAL ALLOCATION      BYTES
MALLOC ZONE                                    SIZE      COUNT  ALLOCATED  % FULL
===========                                 =======  =========  =========  ======
JavaScriptCore FastMalloc_0x7fff7d8b8148     534.1M    2863601     307.6M     57%
DefaultMallocZone_0x10b033000                 41.1M      42615      9643K     22%

......

我想你已经看出一些问题了,内存开销跑到500M以上去了!

下一步,就是要分析具体是什么在耗费我们的内存,从而优化脚本执行。

Good Luck!

 

*Windows下也有vmmap, 来自大名鼎鼎的SysInternals组件, 到这里看看 [MSDN LINK].

*Windows下的Heap View在这里

 

目录
相关文章
|
3天前
|
存储 缓存 Java
Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问
【6月更文挑战第22天】Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问。`BufferedInputStream`和`BufferedOutputStream`用于字节流,缓存数据批量读写。`BufferedReader`和`BufferedWriter`处理字符流,支持按行操作。使用后务必关闭流。
9 3
|
6天前
|
JavaScript 前端开发 算法
【JavaScript】JavaScript 垃圾回收机制深度解析:内存管理的艺术
JavaScript的内存管理和垃圾回收机制涉及栈内存与堆内存、引用计数与标记-清除算法。栈内存存储基本类型和函数调用时的局部变量,而堆内存用于复杂数据类型,如对象和数组。垃圾回收主要通过标记-清除策略,处理不再被引用的对象。现代引擎如V8使用分代收集和增量标记等优化方法,减少停顿并提升性能。开发者应注意避免内存泄漏,如及时解除引用、管理DOM引用和定时器,使用WeakMap和WeakSet等。理解这些原理和最佳实践对于编写高效代码至关重要。
18 5
|
9天前
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,优化游戏性能是非常重要的
【6月更文挑战第16天】JavaScript小游戏性能优化涉及动画流畅度和减少重绘:使用requestAnimationFrame替代定时器;减少DOM操作,利用DocumentFragment或虚拟DOM;Canvas/WebGL高效渲染;压缩图像,使用雪碧图;分层渲染与视口裁剪;Web Workers处理后台计算;缓存计算结果;事件委托;定期性能分析。优化是持续过程,需结合具体需求调整。
39 8
|
9天前
|
存储 缓存 JavaScript
JavaScript内存泄漏通常发生在对象不再需要时
【6月更文挑战第16天】JavaScript内存泄漏常由闭包引起,当不再需要的对象仍被闭包引用时,垃圾回收机制无法清理。例如,创建返回大型对象引用的闭包函数会导致内存泄漏。避免泄漏需及时解除引用,清除事件监听器,利用WeakMap或WeakSet,以及定期清理缓存。使用性能分析工具监控内存使用也有助于检测和解决问题。
23 8
|
14天前
|
算法 Linux 测试技术
Linux编程:测试-高效内存复制与随机数生成的性能
该文探讨了软件工程中的性能优化,重点关注内存复制和随机数生成。文章通过测试指出,`g_memmove`在内存复制中表现出显著优势,比简单for循环快约32倍。在随机数生成方面,`GRand`库在1000万次循环中的效率超过传统`rand()`。文中提供了测试代码和Makefile,建议在性能关键场景中使用`memcpy`、`g_memmove`以及高效的随机数生成库。
|
1月前
|
存储 编解码 安全
阿里云服务器计算型、通用型、内存型主要实例性能及选择参考
在阿里云的活动中,属于计算型实例规格的云服务器主要有计算型c7、计算型c7a、计算型c8a、计算型c8y、计算型c8i这几个实例规格,属于通用型实例规格的云服务器有通用型g7、通用型g7a、通用型g8a、通用型g8y、通用型g8i,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y、内存型r8i等实例。不同实例规格的云服务器在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例性能及选择参考
|
1天前
|
JavaScript 前端开发 算法
JavaScript 使用自动垃圾回收机制来管理内存
JavaScript 使用自动垃圾回收机制来管理内存
3 0
|
8天前
|
Web App开发 JavaScript 前端开发
JS 哪些操作会造成内存泄露
JS 哪些操作会造成内存泄露
|
1月前
|
缓存 自然语言处理 JavaScript
JavaScript内存泄漏导致应用性能下降,常见于闭包使用不当
【5月更文挑战第14天】JavaScript内存泄漏导致应用性能下降,常见于闭包使用不当。闭包能记住并访问词法作用域,若函数返回后,其引用的对象未被释放,就会引发泄漏。例如,`createLeakyFunction`创建的闭包保留了对大型对象`someLargeObject`的引用,即使函数执行完毕,对象也无法被垃圾回收。避免泄漏的方法包括及时解除引用、清除事件监听器、使用WeakMap和WeakSet以及定期清理缓存。使用性能分析工具可检测和修复内存泄漏问题。
26 3
|
1月前
|
缓存 编解码 JavaScript
提升JavaScript游戏性能的关键点
【5月更文挑战第14天】提升JavaScript游戏性能的关键点包括:使用requestAnimationFrame优化动画流畅度;减少DOM操作,利用DocumentFragment或虚拟DOM;使用Canvas/WebGL高效渲染;优化图像资源,压缩图片并使用雪碧图;分层渲染和视口裁剪降低无效计算;借助Web Workers进行后台计算;缓存不变的计算结果;合理使用事件监听器并采用事件委托;定期进行性能分析以发现和解决问题。不断测试与调整,以实现最佳性能。
19 2