2013-10-22 14 views

回答

8

答案很簡單:

當一個線程完成它的過程中,如果沒有別的持有對它的引用,垃圾收集器會自動處理它。

龍答:

垃圾收集是由CLR初始化後,它分配一個 段的內存來存儲和管理對象。這個內存被稱爲 託管堆,而不是操作系統中的本地堆。 每個託管進程都有一個託管堆。

進程中的所有線程都爲同一堆上的對象分配內存。爲了保留 內存,垃圾回收器調用Win32 VirtualAlloc函數 ,併爲託管應用程序一次保留一段內存。 垃圾收集器還根據需要保留段,並通過調用Win32 VirtualFree函數將 段釋放回操作系統(在清除任何 對象之後)。在堆上分配的對象越少,垃圾收集器所做的工作就越少。 當您分配對象時,請勿使用超過您需要的 的舍入值,例如只需要分配一個32字節的數組時,就需要使用15個字節。當垃圾收集被觸發時,垃圾收集器回收被死對象佔用的內存。

的 回收過程契約生活,使他們移動 在一起的對象,死空間被刪除,從而使堆 小。這可確保分配在一起的對象在託管堆上一起保留 ,以保留其局部性。垃圾收集的入侵性(頻率和持續時間)是受管堆上的分配量和存活內存的數量 的結果。 。堆可以被認爲是兩堆的積累:大對象堆和小對象堆。對象堆大 包含85,000字節和 較大的非常大的對象。大對象堆上的對象通常是數組。對於一個實例對象來說極爲罕見的是 。

參考

http://msdn.microsoft.com/en-us/library/ee787088.aspx

1

this answer,「線程的代碼執行完畢後,該線程將被停止,其資源回收。「

4

here: -

託管線程的壽命是獨立的線程對象 創建它,因爲你不想讓GC來 終止線程,這是一件非常好的事情的仍然只是因爲你失去了 所有對相關聯的Thread對象的引用。所以GC是 收集Thread對象,但不是實際的託管線程 .............. ...

直到它的ThreadProc返回或者明確地 被終止,託管線程纔會退出(並且線程棧 的內存未被釋放)。因此,如果託管線程未正確終止,則分配給其線程堆棧的內存 將會泄漏。

+1

我認爲關鍵的措辭是在該段落的末尾:「*託管線程不退出(並且其線程堆棧的內存未釋放),直到其ThreadProc返回或明確終止。 ***因此,如果一個託管線程沒有正確終止,分配給它的線程棧的內存將會泄漏。***「因此,當你正確地聲明時,當線程對象退出時它不會被清除範圍,而是當'ThreadProc'退出時。 – RBarryYoung

+0

@RBarryYoung: - 是的。在答案中更新了!謝謝! :) –

相關問題