[英]Is a Javascript this.object.property = object.property passed by reference or value; breaking garbage collector/memory leak
我們遇到了一個問題,其中我們有 memory 泄漏,我們很難隔離它。 問題是我們在自定義引擎中有代碼,診斷有限。
如果我們的代碼的一部分是按值(好)或按引用(壞)傳遞信息,我們正試圖繞開我們的腦袋。 我們引擎的開發人員表示,如果我們通過引用傳遞,則局部變量有機會獲得永久性,因此垃圾收集器不再能夠釋放 memory。
以下是代碼的精簡偽版本:
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 在本地 scope 終止后被垃圾收集?
編輯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);
}
},
我們引擎的開發人員表示,如果我們通過引用傳遞,則局部變量有機會獲得永久性,因此垃圾收集器不再能夠釋放 memory。
它不應該。
根據經驗:可以以某種方式以編程方式訪問的每個值都不能被垃圾收集(因為您可能仍然需要它)。 如果某個值無法訪問,則無論它之前如何傳遞(如果引擎正常工作),它都會被垃圾收集。
以上是否創建了這種“永久性”,防止
obj2
/obj1
在本地 scope 終止后被垃圾收集?
不可以。兩個函數結束執行后,就無法obj2
或obj1
,因為局部變量不再存在。 因此,他們引用的 object 對於 GC'ing 是可行的。
問題是我們在自定義引擎中有代碼,診斷有限。
是的,這就是問題所在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.