到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comBlogJava无关,不对该信息负责.通过http://kb.csdn.net/keyword/java//../../java/Articles/200606/bb99296a-82a0-4aa2-8a4b-fc98921bf0fd.html访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
fix一个bug,一天增加近亿个PageView
作者:emu 来源:BlogJava  发布时间:2006-06-28 00:00:00.0

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



emu 2006-06-28 10:51 发表评论

 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读