簡體   English   中英

硬.net問題

[英]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

  • 不支持事務的DB(一些MySql,取決於基本DB的類型)
  • 不支持事務監視器/事務協調器的數據庫,但從我所讀到的,較新的MySql,使用支持事務的基本數據庫,似乎能夠支持DTC(例如,讀取http://dev.mysql。 com / doc / refman / 5.0 / en / xa.html

<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

  1. 實施細節。 可以在.net的不同版本中有所不同。 並且服務器/客戶端GC可能有所不同。 並且可能會根據GC的相位而改變。 我假設它將在gc的至少某些階段中存在與(虛擬)CPU /核心一樣多的線程,因此2x超線程quadocore可能使用多達8個線程。 但如果某些階段只是單線程,我不會感到驚訝。
    特別是客戶端GC主要與您的其他代碼並行運行。 因此,使用所有核心可能是一個壞主意,因為它會降低程序的速度。 另一方面,服務器GC針對最大速度進行了優化,並且可以停止整個程序。 所以對於Server GC多線程盡可能聽起來是個好主意。

  2. 最有可能是Gen2,因為所有長壽命的物體都在那里積累。 但這取決於你的內存分配模式。 其他代有(軟)內存限制,之后會發生這一代的集合。
    然后是大對象堆,它是與正常生成堆分開的堆。 如果你分配大型對象,它很可能會比正常的生成堆大。 我認為它只在Gen2集合中收集,因此可以將其視為Gen2的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM