[英]Hard .net Question
我想分享一些我感到困惑的問題。 請檢查。 :-)
在四核i7進程上運行的.NET進程中有多少個GC線程?
我說4x2 = 8?
哪一代GC使用更多內存?為什么?
我說Gen2,但不知道為什么? 我猜對了,因為它的尺寸在每本書或網中都顯得更大。 :-P
逆變是協方差的必然結果? 說明。
它來自仿制葯,但不知道如何解釋它。
EnlistDistributedTransaction方法不支持哪個數據庫?
我說Oracle和IBM DB?
codeBase元素在C#中的重要性和使用位置?
我說大會,但不知道確切的重要性
好吧,我設法清除了面試,但這些問題真的把我帶走了。 請看看你能否就這些問題給我一些建議?
謝謝Ajitpal
協方差/逆變
對於CoVariance / ContraVariance,他們可能會考慮數組的例子(或者一般是R / W CoVariant對象)
class A
{
}
class B : A
{
}
static void Func(A[] a) {
a[0] = new A();
}
B[] b = new B[5];
Func(b);
這是寫“合法”的,但它會拋出賦值(在Func中)(ArrayTypeMismatchException)。 CoVariant引起了一個問題。 從Func的POV來看,它是“奇怪的”。 我會說ContraVariance是ReadWrite CoVariance的“缺失”必然結果(它應該存在,但很明顯它是不可能的)
對於GC
http://architecturebyashwani.blogspot.com/2010/02/foreground-gc-and-background-gc.html
它看起來Workstation GC總是發生在分配內存的線程中,因此GC沒有任何“額外”線程。 我將補充說,這是依賴於版本的,因此它可以從.NET的版本更改為版本(而Mono的版本也不同)。 使用Server GC,您可以使用GC的專用線程,每個處理器一個。 該示例的I7四核可能具有HT(超線程),因此有8個“核心”,因此有8個線程。
代大小
對於世代的大小...我會說“通常”Gen2更大,因為大對象總是Gen2( http://msdn.microsoft.com/en-us/magazine/cc534993.aspx )(技術上)它們不是Gen2 ......它們生活在一個單獨的空間中,當Gen2被檢查時會被檢查,但我們會忽略這個......問題不是很清楚,而且它是實現定義的,不透明,我們不要我們確切地知道Gens在內存中是如何“LinkedListed”的,並且長壽命對象將轉到Gen2(所以在程序的“啟動”階段之后,單例和其他長壽命對象都在Gen2中)
但是......總的來說這不是真的。
假設您創建了一個執行單個分配的程序( var obj = new object()
)。 該分配將從Gen0開始。 分配該對象時,只有一個對象,該對象為Gen0,因此技術上Gen0是最大的對象。
DTC
IBM DB2支持DTC,因此Oracle:
它是半重復的,但我會說不支持EnlistDistributedTransaction
<codeBase>元素
這樣寫的方式更加清晰
http://msdn.microsoft.com/en-us/library/efs781xb.aspx
您可以強制您的應用程序與特定版本的引用程序集一起運行。 如果程序集的版本之間存在“重大更改”,則非常有用。
Covariance和Contravariance基本上處理如何使用比原始指定類型更少的派生類型的能力。
協方差用於使用比原始指定更多的派生類型。
逆變量用於使用比最初指定的更通用的類型(即Less Derived類型)。
有關更多說明,請訪問以下文章https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance
實施細節。 可以在.net的不同版本中有所不同。 並且服務器/客戶端GC可能有所不同。 並且可能會根據GC的相位而改變。 我假設它將在gc的至少某些階段中存在與(虛擬)CPU /核心一樣多的線程,因此2x超線程quadocore可能使用多達8個線程。 但如果某些階段只是單線程,我不會感到驚訝。
特別是客戶端GC主要與您的其他代碼並行運行。 因此,使用所有核心可能是一個壞主意,因為它會降低程序的速度。 另一方面,服務器GC針對最大速度進行了優化,並且可以停止整個程序。 所以對於Server GC多線程盡可能聽起來是個好主意。
最有可能是Gen2,因為所有長壽命的物體都在那里積累。 但這取決於你的內存分配模式。 其他代有(軟)內存限制,之后會發生這一代的集合。
然后是大對象堆,它是與正常生成堆分開的堆。 如果你分配大型對象,它很可能會比正常的生成堆大。 我認為它只在Gen2集合中收集,因此可以將其視為Gen2的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.