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

标签 javascript object memory-leaks reference

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

如果我们的代码的一部分是按值(好)或按引用(坏)传递信息,我们会尝试解决这一问题。我们引擎的开发人员声明,如果我们通过引用传递,局部变量就有机会获得永久性,因此垃圾收集器不再能够释放内存。

下面是代码的删节伪版本:

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/

相关文章:

javascript - 有没有办法将数组的变量名打印为字符串? (JavaScript)

ios - 如何使用自动引用计数(ARC)?

javascript - 无法更改 mousemove 上的值

javascript - 返回 JavaScript 数组中具有最低值的对象

javascript - 获取对象中数组的大小

c++ - 对 `sendArrayObj::count()' 的 undefined reference

javascript - 主干内存泄漏与否?

python - 在 for 循环中加载大型 pickle 文件时如何防止内存泄漏?

javascript - 在javascript中读取excel正在将长数字转换为指数

java - 是否可以使用 Nashorn 将 Java 代码转换为 Javascript?