2013-08-07 13 views
2

如果你在JavaScript中廢棄了用過的對象,你是否保存了可能的愚蠢的垃圾收集?如果您在JavaScript中廢棄了用過的對象,您是否保存了可能的傻垃圾集合?

例如。

如果通過在JavaScript中一些用戶重複:

var users = [ 
    { FirstName: "Chris", LastName: "Pearson" }, 
    { FirstName: "Kate", LastName: "Johnson" }, 
    { FirstName: "Josh", LastName: "Sutherland" }, 
    { FirstName: "John", LastName: "Ronald" }, 
    { FirstName: "Steve", LastName: "Pinkerton" } 
]; 

// Do something with the data, perhaps put it in a table 

users = null; 

是現在值得抵消該名單?有沒有人有一些科學背後的性能提升,或者如果這是浪費時間等?

有時很難向人們解釋爲什麼你以某種方式做某件事,我知道它在很多場合保存了我的培根,當然,C++,但是在JavaScript中,是否有任何實驗來確定它是否值得在JavaScript?找到我可以信任的sizeof函數,讓我哭泣......如果有人已經做過這種實驗,我會非常感謝你看到你的想法!

+1

你嘗試過它[?jsPerf.com] (http://jsperf.com) –

+3

如果你的變量超出範圍,並且沒有人提及它,那麼無論你是否取消它,它都會被GC吞噬。 – Renan

+0

不幸的是,我的用戶是全球性的,我有一個「班級」(所有意圖和目的),我製作了很多版本,這些都是我的用戶。它們是在一個全局類中創建的(爲了讓我更容易調試 - 命名空間),所以用戶持久化。但它不僅僅是用戶,我在JavaScript對象中有大約50種不同類型的數據。我注意到,在而瀏覽器突然加速。我當時在想:「它一定是垃圾收集」......現在,我可以在正確的時間潛入並取消所有的事情,但是在做這件事之前我想知道更多。 – Jimmyt1988

回答

1

這取決於具體情況。例如,在這裏它是無用的:

function putUsersInTable(){ 
    var users = [ 
     { FirstName: "Chris", LastName: "Pearson" }, 
     { FirstName: "Kate", LastName: "Johnson" }, 
     { FirstName: "Josh", LastName: "Sutherland" }, 
     { FirstName: "John", LastName: "Ronald" }, 
     { FirstName: "Steve", LastName: "Pinkerton" } 
    ]; 

    // Do something with the data 

    users = null; // Useless, the data could be GC'd anyways 
} 

這將使得數據不被GC'd時,不能以其他方式:

function putUsersInTable(){ 
    var users = [ 
     { FirstName: "Chris", LastName: "Pearson" }, 
     { FirstName: "Kate", LastName: "Johnson" }, 
     { FirstName: "Josh", LastName: "Sutherland" }, 
     { FirstName: "John", LastName: "Ronald" }, 
     { FirstName: "Steve", LastName: "Pinkerton" } 
    ]; 

    // Do something with the data 

    // This could be an event hander in the DOM or any global variable 
    outsidethisscope = function(){ 
     // This anonymous function has access to users, 
     // But doesn't necessarily make use of it 
     console.log('Hi'); 
    } 

    users = null; // Removes the only reference to that array, 
        // allowing it to be GC'd 
} 
+0

啊,我明白了,因爲這個功能必須能夠繼續使用外徑引用。 這是否意味着用戶將實際上始終是滿的,或者是否在某個時候釋放內存?它是否聰明? – Jimmyt1988

+3

V8中的關閉GC問題/內存泄漏需要'outsidethisscope'引用至少另一個變量的外部範圍,並且'users'至少在某些其他內部函數中被引用。後者是'用戶'被分配上下文所需要的,前者是'外部索引'需要的一個指向上下文的指針,因此即使在沒有必要時也保持活動狀態。 – Esailija

+1

@Esailija我不是指GC問題。只要只要仍然引用匿名函數'users'就不能GC'd。這不是一個錯誤。 – Paulpro

相關問題