是Java的this.object.property = object.property通过引用或值传递;打破垃圾收集器/内存泄漏

我们遇到了一个内存泄漏问题,我们很难隔离它。问题是我们在自定义引擎中的代码具有有限的诊断功能。

如果我们的代码的一部分正在通过值(好的)或通过引用(坏的)传递信息,我们正在努力使自己陷入困境。引擎的开发人员指出,如果我们通过引用传递,则局部变量有可能获得永久性,因此垃圾收集器将不再能够释放内存。

下面是该代码的简化伪版本:

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);   
    }

},
xclhuni 回答:是Java的this.object.property = object.property通过引用或值传递;打破垃圾收集器/内存泄漏

  

我们的引擎开发人员指出,如果我们通过引用传递,则局部变量有可能获得永久性,因此垃圾收集器将不再能够释放内存。

不应该。

经验法则:不能以编程方式访问的每个值都不能进行垃圾回收(因为您可能仍需要它)。如果无法访问某些值,则无论以前如何传递(如果引擎正确完成其工作),都将对其进行垃圾回收。

  

上面是否创建了这种“永久性”,以防止obj2 / obj1在本地范围终止后被垃圾回收?

不。在两个函数结束执行后,由于局部变量不再存在,因此无法访问obj2obj1。因此,引用所引用的对象对于GC'ing是可行的。

  

问题在于我们的自定义引擎中包含的代码具有有限的诊断功能。

是的,就是这个问题。

本文链接:https://www.f2er.com/3114003.html

大家都在问