我们遇到了一个内存泄漏问题,我们很难隔离它。问题是我们在自定义引擎中的代码具有有限的诊断功能。
如果我们的代码的一部分正在通过值(好的)或通过引用(坏的)传递信息,我们正在努力使自己陷入困境。引擎的开发人员指出,如果我们通过引用传递,则局部变量有可能获得永久性,因此垃圾收集器将不再能够释放内存。
下面是该代码的简化伪版本:
Device:{
name,ip
},func1: function(var1,var2){
var obj1 = {name:"",ip:""};
//Do Stuff
this.func2(obj1);
},func2: function(obj2){
//Do More Stuff
this.Device.name = obj2.name
this.Device.ip = obj2.ip
}
上面是否创建了这种“永久性”,以防止在本地范围终止后对obj2 / obj1进行垃圾回收?
编辑1:
较大的自定义编译器中的JS特定引擎基于qt 4.8
这是实际的代码,也就是为了清楚起见而进行了一些错误检查的内容。 QMedialon是将变量传入和传出引擎的JavaScript部分到其自定义部分的位。
Device: {
Processed_Name: "",Processed_IP: "",Processed_Mute: "",Processed_Pause: "",Processed_Volume: "",Processed_Status: "",Debug: "",Debug2: "",Error: ""
},ProcessInput: function (rawFrame,rawIP) {
//$$NAME$$*$$State$$+$$PAUSED$$+$$CH1_MUTE_STATUS$$+$$CH1_VOLUME$$^
var ter = {name:" ",status:0,pause:0,mute:0,volume:0,ip:""};
var x = rawFrame.indexOf("*");
ter.name = rawFrame.slice(0,x);
ter.ip = rawIP;
rawFrame = rawFrame.slice(x + 1,(rawFrame.length - 1));
var splitter = rawFrame.split("+");
ter.status = splitter[0];
ter.pause = splitter[1];
ter.mute = splitter[2];
ter.volume = splitter[3];
if(ter.status){
this._BrightWrite(ter);
}
},_BrightWrite: function(obj){
this.Device.Processed_Name = obj.name;
var key = this._KeyGen(obj.name,"-");
this.Device.Processed_Status = obj.status;
QMedialon.Setvalue("STATUS_AV_"+key,obj.status);
QMedialon.Setvalue("TECH_MUTE_"+key,obj.status + ".Text");
this.Device.Processed_IP = obj.ip;
QMedialon.Setvalue("TECH_IP_"+key,obj.ip + ".Text");
this.Device.Processed_Mute = obj.mute;
QMedialon.Setvalue("MUTE_AV_"+key,obj.mute);
QMedialon.Setvalue("TECH_MUTE_"+key,obj.mute + ".Text");
this.Device.Processed_Pause = obj.pause;
QMedialon.Setvalue("PAUSE_AV_"+key,obj.pause);
QMedialon.Setvalue("TECH_PAUSE_"+key,obj.pause + ".Text");
this.Device.Processed_Volume = obj.volume;
QMedialon.Setvalue("VOLUME_AV_"+key,obj.volume);
QMedialon.Setvalue("TECH_VOL_"+key,obj.volume + ".Text");
QMedialon.Setvalue("POLLING_AV_"+key,0);
if(QMedialon.GetvalueAsInteger("A_actIVE_AV") == key){
if(obj.pause == 1){
QMedialon.Setvalue("BSC_DSP_STATUS.Text","Paused");
}
else{
QMedialon.Setvalue("BSC_DSP_STATUS.Text",this._StatusTranslate(parseInt(obj.status)));
}
this._SliderHandler(key);
}
},