fix一个bug,一天增加近亿个PageView

fix一个bug,一天增加近亿个PageView

项目的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请求,比如测试网速等等,都需要小心这个问题。

你可能感兴趣的:(fix一个bug,一天增加近亿个PageView)