999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

空氣質(zhì)量實(shí)時(shí)監(jiān)測(cè)系統(tǒng)的內(nèi)存泄漏

2012-06-11 07:08:30劉黎志
關(guān)鍵詞:頁(yè)面定義信息

劉黎志,劉 君

(1.武漢工程大學(xué)智能機(jī)器人湖北省重點(diǎn)實(shí)驗(yàn)室, 湖北 武漢430074;2.武漢工程大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,湖北 武漢430074)

1 問(wèn)題描述

近幾年來(lái),隨著經(jīng)濟(jì)的快速發(fā)展,特別是房地產(chǎn)業(yè)和汽車(chē)產(chǎn)業(yè)的發(fā)展,空氣污染日益嚴(yán)重的問(wèn)題引起了環(huán)保部門(mén)的重視.國(guó)家環(huán)保部主要針對(duì)空氣中的PM10(可吸入顆粒物)、SO2、NO2、CO、O3等幾種主要污染物進(jìn)行實(shí)時(shí)監(jiān)測(cè),并要求地方環(huán)保部門(mén)每隔5 min上報(bào)一次各個(gè)自動(dòng)化監(jiān)測(cè)點(diǎn)的實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù).空氣質(zhì)量實(shí)時(shí)監(jiān)測(cè)系統(tǒng)要求將每5 min從數(shù)據(jù)庫(kù)中讀取一次數(shù)據(jù),并將監(jiān)測(cè)數(shù)據(jù)動(dòng)態(tài)展示在Google地圖上.空氣質(zhì)量實(shí)時(shí)監(jiān)測(cè)系統(tǒng)的系統(tǒng)結(jié)構(gòu)圖如圖1所示.

圖1 空氣質(zhì)量實(shí)時(shí)監(jiān)測(cè)系統(tǒng)結(jié)構(gòu)圖Fig.1 Air quality real-time monitoring system structure chart

空氣質(zhì)量實(shí)時(shí)監(jiān)測(cè)系統(tǒng)的工作流程為:實(shí)時(shí)數(shù)據(jù)更新程序定時(shí)將各個(gè)自動(dòng)化監(jiān)測(cè)站點(diǎn)的數(shù)據(jù)更新到中心站的數(shù)據(jù)庫(kù)服務(wù)器中;GooleMap.aspx頁(yè)面使用Microsoft AJAX框架實(shí)現(xiàn)頁(yè)面的異步刷新機(jī)制,Timer控件每300 s自動(dòng)回發(fā)頁(yè)面到Web發(fā)布服務(wù)器取5 min的監(jiān)測(cè)數(shù)據(jù)在Google地圖的標(biāo)記信息窗口顯示,實(shí)踐中有兩種方案.方案1使用著名的開(kāi)源代碼網(wǎng)站http://www.codeplex.com中的免費(fèi)開(kāi)源控件GoogleMap Control for ASP.NET[1],控件的標(biāo)記名稱(chēng)為Artem.Artem控件封裝Google Map API,使得開(kāi)發(fā)人員可以直接在aspx頁(yè)的Code Behind代碼中針對(duì)該控件公開(kāi)的編程接口編程,從而控制Google地圖的使用邏輯.方案2直接使用Google Map API[2-3],仍然使用AJAX的異步機(jī)制,通過(guò)調(diào)用Web服務(wù)取中心站數(shù)據(jù)庫(kù)中的5 min數(shù)據(jù)更新Google地圖中的標(biāo)記信息窗口.兩種方案都不同程度的存在內(nèi)存泄漏[4-5]問(wèn)題.首先分析兩種方案產(chǎn)生內(nèi)存泄漏的原因,然后針對(duì)這些原因提出解決方案,從而解決內(nèi)存泄漏問(wèn)題.

2 內(nèi)存泄漏問(wèn)題分析

2.1 方案1內(nèi)存泄漏問(wèn)題分析

方案1直接使用封裝的GoogleMap控件,并通過(guò)對(duì)Artem控件公開(kāi)的屬性、方法、事件編程,從而控制Google地圖中標(biāo)記的信息窗口顯示5 min的實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù).實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)顯示效果如圖2所示.

圖2 實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)顯示Fig.2 Real-time monitoring data presentation

GoogleMap.aspx頁(yè)面內(nèi)容為:

……

……

GoogleMap.aspx.cs后臺(tái)代碼內(nèi)容為:

protected void tmUpdate_Tick(object sender,EventArgs e)

{ gmMain.Markers.Clear();//清空以前添加的標(biāo)記

foreach (t_SStation ts in 從數(shù)據(jù)庫(kù)中取得站點(diǎn)列表)

{ GoogleMarker gk = new GoogleMarker(站點(diǎn)經(jīng)度,站點(diǎn)緯度); //實(shí)例化站點(diǎn)標(biāo)記

gk.Title = ts.SStationName; //設(shè)置站點(diǎn)標(biāo)題

gk.Text = “信息窗口中的顯示內(nèi)容,為從數(shù)據(jù)庫(kù)中取得的5 min監(jiān)測(cè)數(shù)據(jù)值”;

gmMain.Markers.Add(gk);}}

方案1設(shè)計(jì)頁(yè)面每5 min回發(fā)一次,在后臺(tái)代碼中的tmUpdate_Tick事件中從中心站數(shù)據(jù)庫(kù)中取得各個(gè)監(jiān)測(cè)站點(diǎn)5 min的監(jiān)測(cè)值,使用最新的5 min值更新地圖標(biāo)記的信息窗口.此方案從功能實(shí)現(xiàn)的角度看,是最簡(jiǎn)單的實(shí)現(xiàn)方法,但該方案內(nèi)存泄漏嚴(yán)重,幾乎每次回發(fā),Windows任務(wù)管理器顯示承載Google地圖的IE瀏覽器的iexplore.exe進(jìn)程的內(nèi)存使用增加10 MB左右.若以系統(tǒng)可用內(nèi)存為2 GB計(jì)算,2 048 MB/(10 MB Gbyte*(60/5))=17 h后,系統(tǒng)內(nèi)存耗盡.分析原因認(rèn)為,該控件的設(shè)計(jì)者在每次頁(yè)面刷新時(shí)并沒(méi)有釋放掉前一次的GoogleMap實(shí)例,而是又重新生成了一個(gè)實(shí)例,故產(chǎn)生內(nèi)存泄漏.

2.2 方案2的內(nèi)存泄漏問(wèn)題分析

由于方案1中的Artem控件是封裝發(fā)布的,從編程的角度出發(fā),已經(jīng)無(wú)法解決其在定時(shí)刷新數(shù)據(jù)時(shí)產(chǎn)生的內(nèi)存泄漏問(wèn)題.故只能直接采用Google Map API,用Javascript腳本語(yǔ)言編程實(shí)現(xiàn).具體實(shí)現(xiàn)描述如下.

* GoogleMap.aspx頁(yè)面內(nèi)容為:

……

//定義Web服務(wù)調(diào)用地址

//定義腳本語(yǔ)言調(diào)用地址

……//定義Google地圖顯示層

* MapDataWS.asmx Web服務(wù)內(nèi)容為:

public List GetStations()

{從數(shù)據(jù)庫(kù)從取得監(jiān)測(cè)站點(diǎn)的基本信息,包括名稱(chēng)、經(jīng)度、緯度等,以集合形式返回; }

public List GetCurData()

{從數(shù)據(jù)庫(kù)中取每個(gè)站點(diǎn)5 min的實(shí)時(shí)監(jiān)測(cè)值,以集合形式返回,與GetStation()返回的集合一一對(duì)應(yīng); }

* MapDataWS.js腳本內(nèi)容為:

var mdsProxy; //定義全局Web服務(wù)代理類(lèi) var map; //定義全局Google地圖實(shí)例

var sBasicInfo; //定義全局站點(diǎn)基本信息集合

function pageLoad(sender,args) {

if (!args.get_isPartialLoad()) { mdsProxy = new MapDataWS();// 初始化Web服務(wù)代理類(lèi)

var latlng = new google.maps.LatLng(30.58,114.31); //定義Google地圖

var myOptions = { zoom: 9,center: latlng,mapTypeId: google.maps.MapTypeId.ROADMAP };

map = new google.maps.Map($get('map_canvas'),myOptions);

mdsProxy.GetStations();//獲取站點(diǎn)基本信息集合

window.setInterval(mdsProxy.GetCurData(),300000); //設(shè)置定時(shí)刷新,每5 min取一次監(jiān)測(cè)值}}

function SucceededCallback(result,userContext,methodName) {

switch(methodName)

{case ("GetStations"):{ sBasicInfo = result; break;}//獲取返回的站點(diǎn)集合

case ("GetCurData")://獲取5 min實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù),并生成與之對(duì)應(yīng)的圖標(biāo)和信息窗口

{ for (i in result) { //定義站點(diǎn)的經(jīng)緯度位置對(duì)象

var Latlng = new google.maps.LatLng(sBasicInfo[i].SLatitude,sBasicInfo[i].SLongitude);

//根據(jù)站點(diǎn)基本信息定義地圖標(biāo)記

var mark = new google.maps.Marker({ position: Latlng,map: map,title: sBasicInfo[i].SStationName });

//用取得的5 min監(jiān)測(cè)數(shù)據(jù)定義信息窗口顯示內(nèi)容

var contentString = result[i].SStationName + "PM10: " + result[i].PM10.toString() + …….

//定義信息窗口,及與地圖標(biāo)記相關(guān)聯(lián)的click事件

var infowindow = new google.maps.InfoWindow({ content: contentStr });

google.maps.event.addListener(mark,'click',function () { infowindow.open(map,mark); }); break;}}

方案2使用Google Map API直接在腳本中定義地圖、地圖標(biāo)記及與地圖標(biāo)記對(duì)應(yīng)的信息窗口,保證了地圖實(shí)例對(duì)象只在頁(yè)面初始化時(shí)定義一次,這就避免了方案1中每次頁(yè)面刷新就重復(fù)定義一次地圖實(shí)例的問(wèn)題.但經(jīng)過(guò)仔細(xì)觀察,仍然存在內(nèi)存泄漏問(wèn)題,只是沒(méi)有方案1那么明顯,大約每回發(fā)兩次,Windows任務(wù)管理器顯示承載Google地圖的IE瀏覽器的iexplore.exe進(jìn)程的內(nèi)存使用增加1 MB左右.以系統(tǒng)可用內(nèi)存為2 GB計(jì)算,2 048 MB/(0.5 MB*(60/5))=341 h后,系統(tǒng)內(nèi)存耗盡,還是不能滿(mǎn)足不間斷實(shí)時(shí)監(jiān)測(cè)的需要.經(jīng)分析得出,雖然地圖實(shí)例沒(méi)有在每次頁(yè)面刷新時(shí)生成,但仍然生成地圖標(biāo)記對(duì)象、信息窗口對(duì)象,且前次生成的地圖標(biāo)記及信息窗口對(duì)象均沒(méi)有被IE瀏覽器釋放,故產(chǎn)生內(nèi)存泄漏.

3 內(nèi)存泄漏問(wèn)題的解決

分析方案1及方案2產(chǎn)生內(nèi)存泄漏的原因,得出的結(jié)論是IE瀏覽器不會(huì)自動(dòng)的回收由Javascript腳本語(yǔ)言定義的Google地圖、標(biāo)記、信息窗口實(shí)例對(duì)象,故不論采用何種方式定時(shí)刷新頁(yè)面,只要存在實(shí)例對(duì)象的重復(fù)定義,就會(huì)產(chǎn)生內(nèi)存泄漏.由于不知道IE瀏覽器如何回收自定義對(duì)象實(shí)例的機(jī)制,故要避免內(nèi)存泄漏,解決的方案只有避免對(duì)象的重復(fù)定義,具體的方法描述如下:

即在方案2的MapDataWS.js腳本全局定義部分,增加var infowindowArray = []及var markerArray = []全局?jǐn)?shù)組定義,分別表示信息窗口數(shù)組及地圖標(biāo)記數(shù)組,用于保存和各個(gè)監(jiān)測(cè)站點(diǎn)對(duì)應(yīng)的地圖標(biāo)記實(shí)例對(duì)象及信息窗口對(duì)象.改進(jìn)的更新算法為:

function SucceededCallback(result,userContext,methodName) {

switch(methodName)

{ …… case ("GetCurData"):

{ if (infowindowArray.length == 0) {//保證只生成一次標(biāo)記實(shí)例、信息窗口實(shí)例

for (var i in sBasicInfo) {

var Latlng = new google.maps.LatLng(sBasicInfo[i].SLatitude,sBasicInfo[i].SLongitude);

var mark = new google.maps.Marker({ position: Latlng,map: map,title: sBasicInfo[i].SStationName });

//保存標(biāo)記實(shí)例到markerArray數(shù)組

markerArray.push(mark);

var infowindow = new google.maps.InfoWindow({ content: MakeInfoWindowContent(i,result) });

//保存信息窗口實(shí)例到infowindowArray數(shù)組

infowindowArray.push(infowindow);

google.maps.event.addListener(mark,'click',function () { infowindow.open(map,mark); });

}}

//頁(yè)面定時(shí)讀取各個(gè)監(jiān)測(cè)站點(diǎn)5 min值,更新對(duì)應(yīng)的信息窗口內(nèi)容,但不再重復(fù)生成信息窗口實(shí)例

else {for (var i in result) {infowindowArray[i].setContent(MakeInfoWindowContent(i,result));}}break;

} ……

其中MakeInfoWindowContent函數(shù)根據(jù)監(jiān)測(cè)站點(diǎn)5 min值, 生成信息窗口展示的信息,具體實(shí)現(xiàn)不再描述.由于地圖、標(biāo)記、信息窗口對(duì)象實(shí)例均只生成一次,系統(tǒng)在IE瀏覽器中運(yùn)行時(shí),Windows任務(wù)管理器顯示承載Google地圖的IE瀏覽器的iexplore.exe進(jìn)程的內(nèi)存不再增加,內(nèi)存泄漏問(wèn)題得到解決.各方案的iexplore.exe進(jìn)程的內(nèi)存泄漏對(duì)比如圖3所示,隨著時(shí)間的增加,沒(méi)有內(nèi)存使用增長(zhǎng)則表示沒(méi)有內(nèi)存泄漏.

圖3 內(nèi)存使用對(duì)比圖Fig.3 Memory using comparison chart

4 結(jié) 語(yǔ)

利用地理位置信息來(lái)展示與之相關(guān)數(shù)據(jù)信息變化的技術(shù)在Internet網(wǎng)上已經(jīng)得到廣泛應(yīng)用,特別是通過(guò)定時(shí)異步刷新數(shù)據(jù)信息,用戶(hù)可以直接通過(guò)Web瀏覽器實(shí)時(shí)觀察數(shù)據(jù)變化,地理信息和數(shù)據(jù)展示就更加的生動(dòng)形象.IE瀏覽器不會(huì)主動(dòng)釋放由Javascript腳本語(yǔ)言聲明的對(duì)象實(shí)例,從而導(dǎo)致內(nèi)存泄漏.如果這個(gè)問(wèn)題不解決,數(shù)據(jù)的實(shí)時(shí)監(jiān)控就無(wú)法實(shí)現(xiàn)連續(xù)不間斷運(yùn)行.通過(guò)對(duì)空氣質(zhì)量實(shí)時(shí)監(jiān)測(cè)系統(tǒng)中內(nèi)存泄漏的問(wèn)題的分析,找到導(dǎo)致系統(tǒng)內(nèi)存泄漏的原因,并最終解決內(nèi)存泄漏問(wèn)題,希望對(duì)從事相關(guān)工作的同仁有所借鑒.

參考文獻(xiàn):

[1] Velio Ivanov. Google Map Control for ASP.NET [EB/OL]. http://googlemap.codeplex.com.2011-02-16.

[2] 黃瑤.C/C++程序內(nèi)存泄漏檢測(cè)和分析技術(shù)的研究與實(shí)現(xiàn)[D].北京:北京航空航天大學(xué)軟件學(xué)院.2004.

[3] 胡燕,龔育昌. 一種混合式內(nèi)存泄漏靜態(tài)檢測(cè)方法. 小型微型計(jì)算機(jī)系統(tǒng)[J]. 2008,29(10): 1935-1939.

[4] Google Code. Google Maps JavaScript API V3 [EB/OL]. http://code.google.com/intl/zh-CN/zh-CN/apis/maps/documentation/javascript/.2010-06-15.

[5] Regehr J,Cooprider N,Archer W.Efficient type and memory safety for tiny embedded systems [C]//In Proceedings of the PLOS 2006 Workshop on Linguistic Support for Modern Operating Systems.California:San Jose,2006:64-68.

猜你喜歡
頁(yè)面定義信息
大狗熊在睡覺(jué)
刷新生活的頁(yè)面
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
展會(huì)信息
修辭學(xué)的重大定義
山的定義
同一Word文檔 縱橫頁(yè)面并存
淺析ASP.NET頁(yè)面導(dǎo)航技術(shù)
教你正確用(十七)
主站蜘蛛池模板: 国产乱子伦一区二区=| 国产成人综合欧美精品久久| 欧美日韩国产在线观看一区二区三区| 亚洲天堂.com| 精品久久国产综合精麻豆| 亚洲欧美成人| 国产午夜无码专区喷水| 波多野结衣第一页| 亚洲综合色吧| 狠狠操夜夜爽| 99re视频在线| 热99精品视频| 亚洲天天更新| 九九线精品视频在线观看| 日韩欧美亚洲国产成人综合| 日本伊人色综合网| 四虎AV麻豆| 亚洲成av人无码综合在线观看| A级毛片高清免费视频就| 国产精品永久久久久| 美女内射视频WWW网站午夜 | 91视频首页| 啦啦啦网站在线观看a毛片| AV熟女乱| 国产h视频在线观看视频| 国产黑丝一区| 免费又爽又刺激高潮网址| 国产色爱av资源综合区| 久草视频福利在线观看| 日韩第一页在线| 成人午夜天| 播五月综合| 五月婷婷综合网| 狼友视频国产精品首页| 99精品免费欧美成人小视频| 久久久精品无码一区二区三区| 欧美激情网址| 欧美一区二区自偷自拍视频| 国产精品女人呻吟在线观看| 国产免费久久精品99re丫丫一| 欧美一级黄片一区2区| 国产在线观看成人91| 青青青视频91在线 | 国产精品视频观看裸模| 亚洲国产理论片在线播放| 久久无码av三级| 性69交片免费看| 国产真实乱人视频| 国产福利不卡视频| 亚洲精品成人片在线播放| 国产成人免费| 一本久道热中字伊人| 香蕉蕉亚亚洲aav综合| 国产视频 第一页| 久久久精品久久久久三级| 日韩不卡高清视频| a网站在线观看| 国产精品亚洲天堂| 国产精品自拍露脸视频| 国产精品蜜芽在线观看| 成人福利在线观看| 国产99在线| 亚洲中字无码AV电影在线观看| 国产丝袜丝视频在线观看| 国产精欧美一区二区三区| 五月婷婷综合网| 中文字幕久久亚洲一区| a级高清毛片| 欧美日韩在线成人| 亚洲嫩模喷白浆| 无码中文字幕乱码免费2| 国产乱人伦精品一区二区| www.亚洲一区| 久无码久无码av无码| 亚洲欧美精品一中文字幕| 色综合久久无码网| 国产欧美精品午夜在线播放| 久久综合亚洲色一区二区三区| 中文字幕调教一区二区视频| 麻豆国产在线观看一区二区 | 久久精品视频一| 美女免费黄网站|