我们遇到了内存泄漏的问题,并且很难隔离它。问题是我们的自定义引擎中的代码具有有限的诊断功能。
如果我们的代码的一部分是按值(好)或按引用(坏)传递信息,我们会尝试解决这一问题。我们引擎的开发人员声明,如果我们通过引用传递,局部变量就有机会获得永久性,因此垃圾收集器不再能够释放内存。
下面是代码的删节伪版本:
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);
}
},
最佳答案
The developer of our engine states if we pass by reference there is a chance for a local variable to gain permanence and thus the garbage collector is no longer able to free the memory.
不应该。
根据经验:每个可以通过编程方式访问的值都不能被垃圾收集(因为您可能仍然需要它)。如果某个值无法访问,则无论它之前如何传递(如果引擎正确执行其工作),它都将被垃圾收集。
Does the above create this 'permanence' which prevents
obj2
/obj1
from being garbage collected after the termination of the local scope?
没有。两个函数结束执行后,无法访问 obj2 或 obj1,因为局部变量不再存在。因此,它们引用的对象对于GC来说是可行的。
The problem is we have code in a custom engine with limited diagnostics.
是的,这就是问题所在。
关于javascript - this.object.property = object.property 是通过引用或值传递的 Javascript;破坏垃圾收集器/内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827421/