echarts是百度的一個圖表插件,確實好用美觀。 之前實習接觸到的頁面大多是下麵這種調用方式 這次有一個頁面需要計時器反覆載入新數據,然後重繪echarts圖表。一開始我還是使用了上面這種方式,沒有發現太大問題。第二天早上來調試的時候,網頁運行了一段時間,我的電腦記憶體達到了56%,我是8G的記憶體, ...
echarts是百度的一個圖表插件,確實好用美觀。
之前實習接觸到的頁面大多是下麵這種調用方式
var chart=echarts.init(document.getElementById(dom)); var option={ //..................... } chart.setOption(option);
這次有一個頁面需要計時器反覆載入新數據,然後重繪echarts圖表。一開始我還是使用了上面這種方式,沒有發現太大問題。第二天早上來調試的時候,網頁運行了一段時間,我的電腦記憶體達到了56%,我是8G的記憶體,十分好奇,發現chome占用了大量的記憶體,調出chome的任務管理器,發現就是帶有計時器的頁面記憶體占用一直再穩定上升。。。我意識到了記憶體泄漏,一直認為記憶體泄漏與我無緣的我內心是奔潰的。
為了確認,我把計時器改成了200ms,果然,一會記憶體就上漲到1G了,趕緊上網查資料,發現chome自帶記憶體快照,拍了幾張快照對比,發現原來是echarts的問題。搜了挺久,似乎也沒比較好的方案,有一個說調用dispose()(這個應該也是可以的,但沒有過多的嘗試),試了一下,好像調用方法有錯,我就去官網查了一下文檔。
看到這裡我突然就想到,百度建議的是修改配置,我也確實是使用setOption()去修改的,但是我沒註意到,當第二次進入時我們是用
var chart = echarts.init(document.getElementById(dom));
這段代碼重新初始化了一個echarts對象。然後嘗試著把代碼改成了
var chart = echarts.getInstanceByDom(document.getElementById(dom)); if (chart === undefined) { chart = echarts.init(document.getElementById(dom)); } var option = { //....................... } chart.setOption(option);
果然記憶體占用穩定下來了(這次不是穩定上升。。。),大概就是這樣了。應該也可以寫成下麵這種方式。
var chart = echarts.getInstanceByDom(document.getElementById(dom)); echarts.dispose(chart); chart = echarts.init(document.getElementById(dom)); var option = { //....................... } chart.setOption(option);
大家可以試試。
補:後來我用兩種方式試了一下,第一種方式(if.....)記憶體占用大概在100M左右,第二種方式(echarts.dispose())記憶體占用大概是300M左右,原因還不太清楚,頁面上有6個echarts圖表,還有其他元素。