2012-07-26 125 views
5

我剛剛開始使用C#作爲我的語言。我有點理解Java中GC的概念,並且今天在.NET中重新討論了相同的概念。垃圾收集是否影響堆棧?

在C#中,值類型被放到堆棧上(與Java的情況相同,其中局部變量放入堆棧)。但在C#中,即使struct也包含在值類型中。所以,即使struct被放置在堆棧上。在最糟糕的情況下,如果有很多方法調用,並且堆棧使用很多方法大量填充,並且每種方法都有許多本地值類型,並且許多本身有許多本地值類型的垃圾收集器會影響堆棧?從我研究的內容(部分是我被教的內容),我明白它不會這樣做。主要是因爲操作堆棧內容會涉及很多開銷,而且GC只會參考堆棧來查找引用 - 除此之外無非就是如此。

只是要添加另一個相關主題相關的問題:強制調用GC(如Java中的System.gc(),不確定C#等價物),並不能確保GC例程在那裏被調用。那麼我應該在哪裏發出這樣的電話 - 我希望我需要GC運行,或任何隨機的地方,因爲不能保證我的電話會立即觸發GC?或者我應該把這些東西放到運行環境中而不用擔心呢?

注:我添加了Java標記,因爲我試圖從那裏鏈接概念。我知道GC在兩個獨立的運行時環境中的內部功能肯定會有所不同,但我想基本概念是一樣的。

回答

2

垃圾收集不會影響java堆棧上的對象。

GC隻影響jvm堆中的對象。 Java GC進程是多層次的,可能非常複雜,值得一讀。查看一個網站,如:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html,以便更好地掌握它的運作方式。

至於強制系統的GC 這是一個壞主意。當GC需要運行時,jvm會有更好的想法。如果你正在嘗試分配一個大對象,那麼jvm將確保這個空間在那裏,而你不需要告訴它運行GC。

編輯 我不好,你比C#更關心java。應用相同的內存管理原則,堆棧不受影響,不明確運行GC等.C#旨在以與java相似的方式運行。 http://msdn.microsoft.com/en-us/library/ms973837.aspx

+0

感謝您的回答。閱讀更多內容後我會回來。 – 2012-07-26 14:58:34

1

編號AFAIK GC不影響堆棧。它隻影響HEAP內存。堆棧框架將在方法調用時創建,並將在方法退出時刪除。

編輯

MSDN article解釋了.NET框架是如何GC的作品。

+0

這對於Java,C#或兩者都適用? – 2012-07-26 14:32:23

+0

這僅適用於JAVA。我對c#不太瞭解,但我的猜測是C#遵循類似的原則。 – kosa 2012-07-26 14:32:53

+0

我的問題是在C#的情況下,但感謝您的迴應。 – 2012-07-26 14:33:59

2

堆棧不需要垃圾收集器的幫助;因爲當你移出堆棧幀(堆棧中當前執行的範圍)時,當你創建一個新的堆棧幀時,整個幀(包括內容)被釋放(並被覆蓋)。

function foo(int a, int b) { 
    int i; 
    doStuff(); 
} 

創建一個堆棧幀(粗略可視化)

---- Frame Start ---- 
(value for parameter a) 
(value for parameter b) 
(other items needed for tracking execution) 
(extra stack frame space 
    (value for stack allocated i) 
) 
---- End of Frame ---- 

當進入一個函數,堆棧分配的變量被分配爲幀被分配,在離開幀時,整個幀被丟棄,重新分配幀分配變量的內存。

請記住,Java通常在堆棧上分配對象引用和堆棧本地基元,而不是整個對象。最近的幾次優化只允許棧內分配的對象在幀外不可訪問;它有這樣的條件,它不被認爲是你可以指望的東西。

也就是說,棧幀中的引用通常指向堆,這是垃圾正常收集。

+0

我明白堆棧的概念。但是在最壞的情況下,我曾經問過堆棧中有很多函數調用(一個函數調用另一個函數等等,其他框架沒有彈出堆棧)。但我現在有點理解,無論如何,堆棧不會受到影響。 – 2012-07-26 15:00:39

+1

如果需要足夠的堆棧以超過爲堆棧空間分配的內存,則幀不會移動到堆中。而是發生stackoverflow錯誤,並停止處理。 – 2012-07-26 15:13:35

+0

我希望我能更好地回答你的答案,甚至接受它,我非常喜歡它,因爲你讓我很好地理解了堆棧場景,並且還提醒我存在一個名爲stackoverflowerror的東西。但另一個答案提供了一個整體解決方案。不過謝謝。 – 2012-07-27 15:15:56