1

前回Googleでメモリリーク、サイクルリファレンス、ガベージコレクションの仕組みについて調べました。しかし、すべてが少し混乱しています。ガベージコレクションは次のように機能することを理解しています。

var a = {}; // a is only reference to this object
a = 5 /* now variable a is reference to "number" (other js object)
and now the first empty object has no reference,
so it is cleaned from the memory. */

それはかなりクールに見えます。しかし、IEにはJScriptオブジェクトとCOMオブジェクトがあります。COMとJScriptのオブジェクト間に循環参照がある場合、メモリリーク(クリーンアップされていないメモリ)があります。だから今、私は混乱していて、私が理解していること、または理解していないことを示すためにいくつかの簡単な例を作成します:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <div style="width: 30px;" id='myDiv'></div>
    <script language='javascript'>
    "use strict";
     var a = 4,
     i,
     div = document.createElement('div');

     //no leaks
     function noLeaks(b) {
         this.a = a;
         a = this.b;
     }
     var obj = new noLeaks(5);

     //leak pattern
    function makeLeaks(func) {
        div.badAttachToCOMObject = func; // the problem is here
    }
    makeLeaks(function(){}); //attach reference to JScript objcet/function?


    //no leaks
    function size() {
        return '30px'; //just a value
    }
    function noStyleLeaks() {
        div.style.width = size();
        /* DOM (COM in IE) element just get a value,
        not a reference, only if I put a object or
        function to the value is a problem? */
    }
    noStyleLeaks();

    //leaks or not
    function styleLeaks() {
        div.style.width = document.getElementById('myDiv').style.width;/* this
        is cycle reference, but maybe only between COM and COM objects?
        And do not make leaks? */
    }
    styleLeaks();
    </script>
</body>
</html>

私は主な考えを理解していますか?最後の質問ですが、Chromeにはタスクマネージャーがあり、Windowsタスクマネージャーでは、 http://www.javascriptkit.com/javatutors/closuresleak/index.shtmlからこれを使用すると、更新のたびにメモリ使用量が最大1MB増加することが示されています。

function LeakMemory(){
    for(i = 0; i < 50000; i++){
        var parentDiv = 
        document.createElement("div");
    }
}

Chrome(21)はリークしますか?それは正常ではないと思います。そのため、JSガベージコレクションがどのように機能するかについて、私はますます混乱しています。

4

0 に答える 0