硬.net问题

时间:2011-03-18 08:15:06

标签: .net

我想分享一些我感到困惑的问题。请检查。 : - )

  

在四核i7进程上运行的.NET进程中有多少个GC线程?

我说4x2 = 8?

  

哪一代GC使用更多内存?为什么?

我说Gen2,但不知道为什么?我猜对了,因为它的尺寸在每本书或网中都显得更大。 :-P

  

逆变法是协方差的必然结果?解释

它来自仿制药,但不知道如何解释它。

  

哪个数据库不支持EnlistDistributedTransaction方法?

我说Oracle和IBM DB?

  

C#中codeBase元素的重要性及其使用位置?

我说大会,但不知道确切的重要性

好吧,我设法清除了面试,但这些问题真的把我带走了。请看看你能否就这些问题给我一些建议?

感谢 Ajitpal

3 个答案:

答案 0 :(得分:3)

<强>协方差/逆变

对于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

  • 不支持事务的数据库(某些MySql,具体取决于基本数据库的类型)
  • 不支持事务监视器/事务协调器的数据库,但从我所读到的,较新的MySql,使用支持事务的基本数据库,似乎能够支持DTC(例如,阅读http://dev.mysql.com/doc/refman/5.0/en/xa.html

<强>&LT;代码库&GT;元件

写这种方式更清晰

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

您可以强制您的应用与特定版本的引用程序集一起运行。如果程序集版本之间存在“重大更改”,则非常有用。

答案 1 :(得分:0)

  1. 实施细节。可以在.net的不同版本中有所不同。并且服务器/客户端GC可能有所不同。并且可能会根据GC的相位而改变。我假设它将在gc的至少某些阶段中存在与(虚拟)CPU /核心一样多的线程,因此2x超线程quadocore可能使用多达8个线程。但如果某些阶段只是单线程,我不会感到惊讶 特别是客户端GC主要与您的其他代码并行运行。因此,使用所有核心可能是一个坏主意,因为它会降低程序的速度。另一方面,服务器GC针对最大速度进行了优化,并且可以停止整个程序。因此对于Server GC多线程来说,听起来是个好主意。

  2. 很可能是Gen2,因为所有长寿命的物体都在那里积累。但这取决于你的内存分配模式。其他世代都有(软)内存限制,之后会出现这一代的集合 然后是大对象堆,它是与正常生成堆分开的堆。如果你分配大型对象,它很可能会比正常的生成堆大。我认为它只在Gen2集合中收集,因此可以将其视为Gen2的一部分。

答案 2 :(得分:0)

协方差和反演方法基本上处理如何使用比原始指定类型更少的派生类型的能力。

协方差使用比原始指定更多的派生类型。

Contravariance 使用比最初指定的更通用的类型(即Less Derived类型)。

有关更多说明,请访问以下文章 https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance