项目的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();
				var
				 tmpImage 
				=
				 
				new
				 Image();
 tmpImage.src
				=
				"
				统计PV的CGI
				"
				;
tmpImage.src
				=
				"
				统计PV的CGI
				"
				;
		 
		修改发布之后,一天内PV剧增了8000万。
有的时候我们也用Image对象来做其它功能的,比如跨域发送http请求,比如测试网速等等,都需要小心这个问题。