項(xiàng)目的PV長(zhǎng)期徘徊在每天1億多個(gè)PV,雖然同時(shí)在線數(shù)一直在沖新高,PV始終沖不上去。doudou用其它方式做PV統(tǒng)計(jì)也證實(shí)了emu的方式是存在問(wèn)題的,但是到底是什么問(wèn)題呢?我們來(lái)看一下發(fā)起PV統(tǒng)計(jì)的代碼是怎么寫(xiě)的:
就一行代碼,還能有錯(cuò)嗎?能有什么錯(cuò)呢?難道請(qǐng)求的結(jié)果被IE給cache了?反復(fù)檢查了http header,嘗試了加隨機(jī)數(shù)來(lái)禁止cache,都沒(méi)有用
用sniffer反復(fù)試驗(yàn)后證實(shí),上面的方式確實(shí)有的時(shí)候發(fā)不出去http請(qǐng)求。再看了一眼代碼:
突然靈光一現(xiàn),找到原因了!
如果在創(chuàng)建Image對(duì)象的時(shí)候,瀏覽器的不忙,垃圾回收器正好被喚醒來(lái)收垃圾了,GC會(huì)發(fā)現(xiàn)這個(gè)Image根本就沒(méi)有句柄來(lái)引用,屬于可以回收的垃圾,因此會(huì)在請(qǐng)求發(fā)起之前就把這個(gè)對(duì)象給回收掉了。本來(lái)創(chuàng)建這個(gè)對(duì)象的時(shí)候刻意不保存引用句柄來(lái)方便GC回收它,可是沒(méi)想到GC有可能回收的這么快,那就保存一個(gè)句柄吧:


修改發(fā)布之后,一天內(nèi)PV劇增了8000萬(wàn)。
有的時(shí)候我們也用Image對(duì)象來(lái)做其它功能的,比如跨域發(fā)送http請(qǐng)求,比如測(cè)試網(wǎng)速等等,都需要小心這個(gè)問(wèn)題。