项目的PV长期徘徊在每天1亿多个PV,虽然同时在线数一直在冲新高,PV始终冲不上去。doudou用其它方式做PV统计也证实了emu的方式是存在问题的,但是到底是什么问题呢?我们来看一下发起PV统计的代码是怎么写的:
new
Image().src
=
"
统计PV的CGI
"
;
就一行代码,还能有错吗?能有什么错呢?难道请求的结果被IE给cache了?反复检查了http header,尝试了加随机数来禁止cache,都没有用
用sniffer反复试验后证实,上面的方式确实有的时候发不出去http请求。再看了一眼代码:
new
Image().src
=
"
统计PV的CGI
"
;
突然灵光一现,找到原因了!
如果在创建Image对象的时候,浏览器的不忙,垃圾回收器正好被唤醒来收垃圾了,GC会发现这个Image根本就没有句柄来引用,属于可以回收的垃圾,因此会在请求发起之前就把这个对象给回收掉了。本来创建这个对象的时候刻意不保存引用句柄来方便GC回收它,可是没想到GC有可能回收的这么快,那就保存一个句柄吧:
var
tmpImage
=
new
Image();
tmpImage.src
=
"
统计PV的CGI
"
;
修改发布之后,一天内PV剧增了8000万。
有的时候我们也用Image对象来做其它功能的,比如跨域发送http请求,比如测试网速等等,都需要小心这个问题。