用 JavaScript 检测 CPU 占比和内存泄露

作者:玉伯

 

最近在项目中碰到 IE6-7 下的内存泄露,通过 Drip 能探测出来,问题也解决了。最近小组成员同时有在做前端质量工具,通过性能检测,可以排查出一些耗时较长的代码,但对内存泄露想不到好的自动化探测方式。本着集思广益的初衷,发了条微博:

通过 setTimeout 等方式,可以检测当前页面所在操作系统 CPU 的大体情况。请教万能的微博:有没有什么办法,通过 JavaScript 检测到当前页面所在操作系统的内存使用情况(比如是否持续上涨、存在内存泄露)?

 

CPU 占比探测

通过 setTimeout 的方式探测 CPU 已经不是秘密,去年腾讯的朋友在 Velocity 上分享过,北京有朋友还通过这个原理,几年前就实现了网页游戏中动画等耗时操作的自动调节。原理很简单:

var data = []
var t

function pulse() {
  t && data.push(Date.now() - t)
  t = Date.now()
  setTimeout(pulse, 50)
}

pulse()

就是每隔 50ms 打一下点。理想情况下,data 的值应该是

data = [50, 50, 50, 50, ...]

但实际情况,data 会是

data = [51, 52, 50, 52, ...]

当 CPU 比较忙时,data 的数据变成

data = [81, 102, 90, 62, ...]

即 CPU 越忙,data 数据项会越大。这样,记录一系列 data 值,就可以绘制出 CPU 占比趋势图,和通过任务管理器看到的 CPU 趋势图非常接近。

上面只是原理说明,实际情况没这么简单。但很明显,通过这么一个简单的规律,就能实现用纯 JavaScript 来探测 CPU 占比了。

 

内存泄露探测

回到那条微博,是否也存在某种规律,使得可以用 JavaScript 来间接探测到内存泄露情况?

从微博的回复里还没看到有价值的信息。今天回家时,想到一种思路:

  1. 如果存在内存泄露,意味着浏览器在 GC 时,没有进行某些操作。
  2. 没有进行某些操作,意味着会节省一些 CPU 时间。
  3. CPU 耗时的变化,可以通过合理的打点探测出来。

似乎有点希望,回到家后,立刻写了点代码验证。但发现干扰因素太多,基线也很难确定。折腾了一个多小时,有些死结,很难突破。

于是停下来写这篇文章,看看大家有没有更好的思路。我们以为不可能的事情多了去,但不可能的事情往往存在可能,思路是无限的。

 

最后描述下我的具体需求:

有一个 a.html 页面,里面有 JS 业务代码,以及单元测试代码。
通过前端测试系统,我们可以把 a.html 自动跑在各个浏览器上,比如 IE6/7/8/9。
现在已经可以自动得到 a.html 在各个浏览器下的单元测试结果,以及一些性能指标。
现在想进一步,想通过单元测试代码,也能探测出当前页面是否存在内存泄露。

页面存在内存泄露时,典型的现象是,不断刷新当前页面,内存占用不会归位,而会一直往上涨。

时间: 2024-10-05 15:53:44

用 JavaScript 检测 CPU 占比和内存泄露的相关文章

利用JavaScript检测CPU使用率自己写的

 这篇文章主要介绍了自己写的一个利用JavaScript检测CPU使用率的方法,需要的朋友可以参考下 之前在玉伯的Github Issues里看到了使用JS检测CPU使用率的方法,觉得很赞.  特别自己实现了一下,另外加了一个绘制直方图的功能可以直观看到CPU使用率的情况.    效果请见:传送门    实现思想    其实就是setInterval,利用当前时间减去上一次执行timer记录的时间,得到时间差来反映CPU的延迟,侧面反映了CPU的使用率.  代码如下: var data = []

利用JavaScript检测CPU使用率自己写的_javascript技巧

之前在玉伯的Github Issues里看到了使用JS检测CPU使用率的方法,觉得很赞. 特别自己实现了一下,另外加了一个绘制直方图的功能可以直观看到CPU使用率的情况. 效果请见:传送门 实现思想 其实就是setInterval,利用当前时间减去上一次执行timer记录的时间,得到时间差来反映CPU的延迟,侧面反映了CPU的使用率. 复制代码 代码如下: var data = [],t; var cpuTimer = setInterval(function(){ t && data.p

找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题

简介: 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 UI 操作,问题可能比较严重.在本文中,学习如何使用 sIEve 工具检测并解决内存泄漏问题,本文也包含内存泄漏问题的应用示例以及解决方案. 发布日期: 2012 年 4 月 09 日 级别: 中级 原创语言: 英文 访问情况 : 10932 次浏览 评论: 0 (查看 | 添加评论 - 登录)  平均分 (7个评分)

kmemleak的使用---内存泄露检测工具【转】

转自:http://blog.csdn.net/lishenglong666/article/details/8287783 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 内核泄露检测kmemleak 介绍 用法 功能实现的基本方法原理 Kmemleak API 处理假阳性阴性 限制和缺点 测试的特定部分kmemleak   内核泄露检测(kmemleak) 介绍: Kmemleak 提供了一种可选的内核泄漏检测,其方法类似于跟踪内存收集器.(http://en.w

Android 和 Java 内存泄露检测工具——LeakCanary

LeakCanary Android 和 Java 内存泄露检测. "A small leak will sink a great ship." - Benjamin Franklin 千里之堤, 毁于蚁穴. -- <韩非子·喻老> demo 一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo 开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: depende

Instruments指南:如何调试内存泄露

Instruments指南:如何调试内存泄露 开篇 现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他.但是我们在使用ARC的时候也会出现内存泄露的情况. 幸运的是,苹果为我们提供了Instruments,他可以用来检测你的应用程序的内存泄露.可能刚学习iOS开发的开发者被这个工具给吓到了,里面有太多东西了.其实他们是非常了不起的,而且也非常容易使用. 在这篇文章里,你将会通过使用XCode和Instruments来调试和发现内存相关的问题(例如内存泄露). 开始使用 我们这篇文章的目

GDI对象导致内存泄露

最近在一个项目中,被测试组人员检测出来GDI对象导致内存泄露,之后,经过代码的走读,确实发现存在这样一个问题. 首先是现象,在一些项目中,如果发现图片,图标等突然显示不出来,就有可能是GDI对象已经满了,这个事情,用任务管理器,把GDI对象打开,就可以看到了,如果GDI对象迅速上涨,就基本可以确认是GDI对象导致内存泄露. 经过查证,发现以下代码会导致GDI对象上涨,内存泄露,因为以下代码会定时执行,每当一个执行周期一道,就会重新申请内存,导致泄露. m_switch_http.SetIcon(

服务地址本机服务内存和cpu占用率90%

问题描述 服务地址本机服务内存和cpu占用率90% 刚装好的系统,现在是win10,以前win8.1也是这种情况,找了好多种方法还是不行 解决方案 通过任务管理器看一下是哪个进程占用cpu高,把它干掉 解决方案二: 任务管理器怎么查看进程的CPU时间 http://jingyan.baidu.com/article/425e69e6d77cb3be15fc16e6.html

CPU占用率100%的处理办法

Q:CPU 资源占用 100% 的处理办法 A:我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务治理器"才发现CPU占用达到100%.这是怎么回事情呢?碰到病毒了,硬件有问题,还是系统设置有问题,在本文中笔者将从硬件,软件和病毒三个方面来讲解系统资源占用率为什么会达到100%. 经常出现CPU占用100%的情况,主要问题可能发生在下面的某些方面: CPU占用率高的九种可能 1.防杀毒软件造成故障 由于新版的KV.金山.瑞星都加入了对网页.插件.邮件的随机监