-
Notifications
You must be signed in to change notification settings - Fork 851
Open
Labels
Description
Hi,作者你好,我们在制作geo3D地图的时候出现了内存溢出的异常,我们使用setInterval,每3s切换一个地图,我们将会无限轮询全国所有省份,环境如下:
电脑: win10 16g内存
代码框架: angular4 + typescript
样例代码:http://gallery.echartsjs.com/editor.html?c=xHyL5_gEjW
样例为了重现效果,只是在世界地图和中国地图之间切换
我们将echarts封装为angular的directive来使用,在地图切换的时候我们调用了dispose(),并输出了isDispose为true,说明echarts实例已经删除了,echarts对象删除之后,我们重新init了echarts对象,并重新setOption了
初始化方法:
initChart() {
if (this.__etheme) {
this.myChart = echarts.init(this.el.nativeElement, this.__etheme);
} else {
this.myChart = echarts.init(this.el.nativeElement);
}
this.isEchartsInited = true;
if (this.eoptionCache) {
this.eoptionCache.forEach((eo) => {
this.setOption(eo);
});
this.eoptionCache = [];
}
this.initEvent();
}
对象销毁的方法:
ngOnDestroy(){
this.destroyChart();
}
destroyChart() {
if (this.myChart){
console.log(this.myChart.isDisposed());
console.log("echarts 对象 dispose了");
this.myChart.dispose(this.myChart);
console.log(this.myChart.isDisposed());
console.log("echarts 对象是否被清楚");
}
}
setOption方法:
@Input('eoption')
private set seteOption(option: any) {
if (option) {
this.__eoption = option;
if (!this.isEchartsInited) {
this.eoptionCache.push(option);
} else {
this.setOption(option);
}
}
}
public setOption(newOption: any) {
if (this.myChart && newOption) {
var newMap = this.getNewMap(newOption); //这个是自己写的方法
var _this = this;
if (newMap) {
this.registerMap(newMap, () => {
_this.myChart.setOption(newOption, true);
// }
});
} else {
this.myChart.setOption(newOption);
}
}
}
在每次地图切换的时候,都是先执行destroyChart()后再执行initChart(),最后setOption(),但即使是这样销毁了对象,内存依旧蹭蹭往上涨