FullGC正常運行時會正常暫停所有線程。有兩個AppDomain,每個都運行多個線程。 GC運行時,所有線程是否會暫停,或者只有一個AppDomain的線程?垃圾收集是否發生在流程級別或應用程序級別?
22
A
回答
13
從這個線程在這裏:Is the garbage collector in .net system-wide or application-wide?,它發生在工藝水平。該進程中的所有線程都將暫停,但不會跨越多個進程。
一個或多個應用程序域可以在一個進程中存在,但應用程序域不進程之間共享。每個:http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx,「過程中的所有應用程序共享相同的GC。」因此,當觸發GC時,GC應該會影響所有應用程序域。
然而,可以有太多的流程花費時間做GC不能參與GC的其他進程的性能產生負面影響會出現CPU的性能影響。
這個鏈接也解釋了GC的基本面太:
16
很難回答,最好的辦法是剛剛測試:
using System;
using System.Reflection;
public class Program : MarshalByRefObject {
static void Main(string[] args) {
var dummy1 = new object();
var dom = AppDomain.CreateDomain("test");
var obj = (Program)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Program).FullName);
obj.Test();
Console.WriteLine("Primary appdomain, collection count = {0}, gen = {1}",
GC.CollectionCount(0), GC.GetGeneration(dummy1));
Console.ReadKey();
}
public void Test() {
var dummy2 = new object();
for (int test = 0; test < 3; ++test) {
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.WriteLine("In appdomain '{0}', collection count = {1}, gen = {2}",
AppDomain.CurrentDomain.FriendlyName, GC.CollectionCount(0),
GC.GetGeneration(dummy2));
}
}
輸出:
In appdomain 'test', collection count = 3, gen = 2
Primary appdomain, collection count = 3, gen = 2
很好的證據表明GC影響默認CL上的所有AppDomain R主機。這讓我感到驚訝。
相關問題
- 1. Android線程是應用程序級別還是活動級別?
- 2. 在對象級別或應用程序級別使用setlocale
- 3. 在應用程序級別
- 4. 在應用程序級別
- 5. System.Web.Cache,會話級別或應用程序級別
- 6. 在數據庫級別或應用程序級別上過濾數據
- 7. 是否可以更改垃圾收集器線程的優先級?
- 8. ptrace是否在用戶級別或內核級別上工作?
- 9. 在應用程序級別分片
- 10. 在應用程序級別指定NumberFormat
- 11. 應該在應用程序級別或數據庫級別上觸發MySQL觸發器嗎?
- 12. 垃圾收集器如何識別根
- 13. iPod音量級別影響應用程序音量級別
- 14. ASP.NET應用程序級別與會話級別和Global.asax ... confused
- 15. Java線程垃圾收集與否
- 16. 是否可以在應用程序級別限制請求域?
- 17. 是否有在PRISM應用程序級別快捷方式
- 18. Android垃圾收集器在運行時是否暫停其他應用程序?
- 19. 在應用程序級別接收藍牙事件Android
- 20. 隨機數發生器:級別或方法級別?
- 21. CAS是否支持應用程序級別假冒?
- 22. iPhone下載應用程序的級別
- 23. 應用程序日誌級別
- 24. 應用程序未指定API級別
- 25. web2py應用程序級別變量
- 26. 應用程序級別變量
- 27. Spring Boot應用程序日誌級別
- 28. 應用程序信任級別
- 29. 爲什麼垃圾收集在網絡應用程序?
- 30. WPF在VSTO中的應用程序沒有被垃圾收集
你確定每個應用程序域都有它自己的堆?在這裏反駁布賴恩·拉斯穆森的回答是:http://stackoverflow.com/questions/574708/what-is-appdomain 和Aghilas Yakoub的答案在這裏: http://stackoverflow.com/questions/12219815/appdomains-and-gc-堆 – 2013-03-06 14:07:50
「AppDomain是同一進程的一部分,因此實際上共享相同的託管堆」。這與你所說的不矛盾嗎?另見我的評論編輯,Aghilas說:「你有一堆進程,並且應用程序域共享這個堆。」除非我誤解,否則似乎至少有一個答案(你的或他們的)需要更正。 – 2013-03-06 14:13:21
好的,我會調低一點。它們在邏輯上是不同的,因爲對象句柄指向AppDomain特定的數據結構。因此需要跨域進行編組。但是測試中肯定有證據表明GC堆本身是共享的。 – 2013-03-06 14:22:21