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

空氣質量實時監(jiān)測系統(tǒng)的內存泄漏

2012-06-11 07:08:30劉黎志
武漢工程大學學報 2012年6期
關鍵詞:頁面定義信息

劉黎志,劉 君

(1.武漢工程大學智能機器人湖北省重點實驗室, 湖北 武漢430074;2.武漢工程大學計算機科學與工程學院,湖北 武漢430074)

1 問題描述

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

圖1 空氣質量實時監(jiān)測系統(tǒng)結構圖Fig.1 Air quality real-time monitoring system structure chart

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

2 內存泄漏問題分析

2.1 方案1內存泄漏問題分析

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

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

GoogleMap.aspx頁面內容為:

……

……

GoogleMap.aspx.cs后臺代碼內容為:

protected void tmUpdate_Tick(object sender,EventArgs e)

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

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

{ GoogleMarker gk = new GoogleMarker(站點經度,站點緯度); //實例化站點標記

gk.Title = ts.SStationName; //設置站點標題

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

gmMain.Markers.Add(gk);}}

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

2.2 方案2的內存泄漏問題分析

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

* GoogleMap.aspx頁面內容為:

……

//定義Web服務調用地址

//定義腳本語言調用地址

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

* MapDataWS.asmx Web服務內容為:

public List GetStations()

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

public List GetCurData()

{從數(shù)據(jù)庫中取每個站點5 min的實時監(jiān)測值,以集合形式返回,與GetStation()返回的集合一一對應; }

* MapDataWS.js腳本內容為:

var mdsProxy; //定義全局Web服務代理類 var map; //定義全局Google地圖實例

var sBasicInfo; //定義全局站點基本信息集合

function pageLoad(sender,args) {

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

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();//獲取站點基本信息集合

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

function SucceededCallback(result,userContext,methodName) {

switch(methodName)

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

case ("GetCurData")://獲取5 min實時監(jiān)測數(shù)據(jù),并生成與之對應的圖標和信息窗口

{ for (i in result) { //定義站點的經緯度位置對象

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

//根據(jù)站點基本信息定義地圖標記

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

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

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

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

3 內存泄漏問題的解決

分析方案1及方案2產生內存泄漏的原因,得出的結論是IE瀏覽器不會自動的回收由Javascript腳本語言定義的Google地圖、標記、信息窗口實例對象,故不論采用何種方式定時刷新頁面,只要存在實例對象的重復定義,就會產生內存泄漏.由于不知道IE瀏覽器如何回收自定義對象實例的機制,故要避免內存泄漏,解決的方案只有避免對象的重復定義,具體的方法描述如下:

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

function SucceededCallback(result,userContext,methodName) {

switch(methodName)

{ …… case ("GetCurData"):

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

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 });

//保存標記實例到markerArray數(shù)組

markerArray.push(mark);

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

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

infowindowArray.push(infowindow);

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

}}

//頁面定時讀取各個監(jiān)測站點5 min值,更新對應的信息窗口內容,但不再重復生成信息窗口實例

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

} ……

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

圖3 內存使用對比圖Fig.3 Memory using comparison chart

4 結 語

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

參考文獻:

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

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

[3] 胡燕,龔育昌. 一種混合式內存泄漏靜態(tài)檢測方法. 小型微型計算機系統(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.

猜你喜歡
頁面定義信息
大狗熊在睡覺
刷新生活的頁面
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
修辭學的重大定義
當代修辭學(2014年3期)2014-01-21 02:30:44
山的定義
公務員文萃(2013年5期)2013-03-11 16:08:37
同一Word文檔 縱橫頁面并存
淺析ASP.NET頁面導航技術
教你正確用(十七)
海外英語(2006年11期)2006-11-30 05:16:56
主站蜘蛛池模板: 91精品免费久久久| 青青青视频蜜桃一区二区| 精品国产免费观看| 曰韩人妻一区二区三区| 高潮毛片无遮挡高清视频播放| 人妻精品久久久无码区色视| 国产三区二区| 国产精品第| 国产微拍精品| 亚洲无码高清一区二区| 欧美狠狠干| 亚洲国产欧美中日韩成人综合视频| 中文字幕色在线| lhav亚洲精品| 亚洲精品无码久久毛片波多野吉| 久草美女视频| 国产成人亚洲精品蜜芽影院| 亚洲天堂网在线播放| 亚洲人成网站在线播放2019| 日韩福利视频导航| 久久久噜噜噜| 亚洲日韩在线满18点击进入| 亚欧美国产综合| 九九热精品在线视频| 精品超清无码视频在线观看| 色国产视频| 999精品在线视频| 国产一二视频| 免费观看无遮挡www的小视频| 少妇人妻无码首页| 亚洲精品大秀视频| 六月婷婷激情综合| 手机成人午夜在线视频| 日韩毛片基地| 久久亚洲高清国产| 成人年鲁鲁在线观看视频| 久久精品波多野结衣| 青青青伊人色综合久久| 久热精品免费| 色天天综合久久久久综合片| 久久香蕉国产线看精品| 久爱午夜精品免费视频| 亚洲V日韩V无码一区二区| 九九久久99精品| 黄色网址手机国内免费在线观看| 在线日韩一区二区| 黄色网站在线观看无码| 伊人久久福利中文字幕| 无码免费的亚洲视频| 四虎成人精品| 亚洲av色吊丝无码| 综合天天色| 欧美69视频在线| 欧美在线视频a| 国产99欧美精品久久精品久久| 国产精品吹潮在线观看中文| 国产剧情国内精品原创| 日本免费福利视频| 一级成人a做片免费| www.99在线观看| 亚洲欧洲日韩国产综合在线二区| 免费看黄片一区二区三区| 国产女人在线视频| 国产在线专区| 婷婷成人综合| 国产第三区| 日韩麻豆小视频| 伊人激情久久综合中文字幕| 伊人精品视频免费在线| 亚洲精品无码在线播放网站| 免费观看成人久久网免费观看| 制服丝袜亚洲| 亚洲天堂网在线播放| 美女一级毛片无遮挡内谢| 国产欧美日韩资源在线观看| av无码久久精品| 91精品国产无线乱码在线| 黄色一及毛片| 99re精彩视频| 国产亚洲高清在线精品99| 亚洲无限乱码一二三四区| 精品久久久久无码|