在完成Console.WriteLine(掛起它或某物)或將垃圾收集踢入並移除此線程後,是否需要使用此線程執行某些操作?在.NET中,線程完成其任務時會發生什麼?我需要管理這個嗎?
public void testThreading() {
.. do some stuff
var t = new Thread(() => { Console.WriteLine("hey!"); })
t.Start();
}
在完成Console.WriteLine(掛起它或某物)或將垃圾收集踢入並移除此線程後,是否需要使用此線程執行某些操作?在.NET中,線程完成其任務時會發生什麼?我需要管理這個嗎?
public void testThreading() {
.. do some stuff
var t = new Thread(() => { Console.WriteLine("hey!"); })
t.Start();
}
答案很簡單:
當一個線程完成它的過程中,如果沒有別的持有對它的引用,垃圾收集器會自動處理它。
龍答:
垃圾收集是由CLR初始化後,它分配一個 段的內存來存儲和管理對象。這個內存被稱爲 託管堆,而不是操作系統中的本地堆。 每個託管進程都有一個託管堆。
進程中的所有線程都爲同一堆上的對象分配內存。爲了保留 內存,垃圾回收器調用Win32 VirtualAlloc函數 ,併爲託管應用程序一次保留一段內存。 垃圾收集器還根據需要保留段,並通過調用Win32 VirtualFree函數將 段釋放回操作系統(在清除任何 對象之後)。在堆上分配的對象越少,垃圾收集器所做的工作就越少。 當您分配對象時,請勿使用超過您需要的 的舍入值,例如只需要分配一個32字節的數組時,就需要使用15個字節。當垃圾收集被觸發時,垃圾收集器回收被死對象佔用的內存。
的 回收過程契約生活,使他們移動 在一起的對象,死空間被刪除,從而使堆 小。這可確保分配在一起的對象在託管堆上一起保留 ,以保留其局部性。垃圾收集的入侵性(頻率和持續時間)是受管堆上的分配量和存活內存的數量 的結果。 。堆可以被認爲是兩堆的積累:大對象堆和小對象堆。對象堆大 包含85,000字節和 較大的非常大的對象。大對象堆上的對象通常是數組。對於一個實例對象來說極爲罕見的是 。
參考
據this answer,「線程的代碼執行完畢後,該線程將被停止,其資源回收。「
從here: -
託管線程的壽命是獨立的線程對象 創建它,因爲你不想讓GC來 終止線程,這是一件非常好的事情的仍然只是因爲你失去了 所有對相關聯的Thread對象的引用。所以GC是 收集Thread對象,但不是實際的託管線程 .............. ...
直到它的ThreadProc返回或者明確地 被終止,託管線程纔會退出(並且線程棧 的內存未被釋放)。因此,如果託管線程未正確終止,則分配給其線程堆棧的內存 將會泄漏。
我認爲關鍵的措辭是在該段落的末尾:「*託管線程不退出(並且其線程堆棧的內存未釋放),直到其ThreadProc返回或明確終止。 ***因此,如果一個託管線程沒有正確終止,分配給它的線程棧的內存將會泄漏。***「因此,當你正確地聲明時,當線程對象退出時它不會被清除範圍,而是當'ThreadProc'退出時。 – RBarryYoung
@RBarryYoung: - 是的。在答案中更新了!謝謝! :) –