項目的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請求,比如測試網速等等,都需要小心這個問題。