簡體   English   中英

是 Javascript this.object.property = object.property 通過引用或值傳遞; 打破垃圾收集器/內存泄漏

[英]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 終止后被垃圾收集?

不可以。兩個函數結束執行后,就無法obj2obj1 ,因為局部變量不再存在。 因此,他們引用的 object 對於 GC'ing 是可行的。

問題是我們在自定義引擎中有代碼,診斷有限。

是的,這就是問題所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM