1. 装箱拆箱
(1). 什么是装箱,什么是拆箱
(2). 请用文字或者图,描述出装箱和拆箱在内存中的动作(stack/heap).
(3). 如果同时执行装箱和拆箱动作各10W次,是装箱的性能好,还是拆箱的性能更好 并且请说出为什么.
2. 值类型与引用类型
(1).字符串是值类型还是引用类型
(2).为什么说.NET中的字符串很特殊
(3).值类型分配在哪里
(4).引用类型分配在哪里
(5).值类型和引用类型分配的地方是固定不变的吗?如果不是,请说明原因.
(6).请说出下列哪些是值类型哪些是引用类型:
Guid,DateTime, TimeSpan, struct
3. 线程与锁
(1) .NET中一共分为几种锁类型
(2) Lock关键字在.NET FRAMEWORK中对应了哪个类
(3) 众所周知,lock关键字只是个语法糖, 请写出lock关键字展开后的C#代码.
(4) .NET中Lock的内部实现一共分为几个版本?
(5) .NET 4.0 对于Lock内部的实现做出了哪些修改? 这样的修改是为了解决什么问题
(6) .NET中Lock的内部实现是属于哪种锁的分类?如果可以,请描述出lock的内部实现.
(7) 你知道.NET类库中一共有多少个锁吗 可否说出来几个.
(8) 你常用的锁是哪些
(9) Interlocked是个什么类型的锁
(10)你觉得,使用Interlocked可以提高程序的性能吗
(11)你知道Interlocked是如何在多线程的情况下保证资源同步的吗
(12).NET线程池中一共分为几种类型的线程
(13).NET线程默认的用户态栈大小是多少
(14)你觉得在.NET中,线程是一种很昂贵的资源吗? 请写出你的看法.
(15)当对一个委托进行异步操作的时候,触发回调函数的线程是.NET线程池中的线程吗 如果是,请说出,触发的线程属于.NET线程池中的哪一类线程.
(16)你经常会在什么情况下使用多线程 为什么说使用多线程能提高程序性能
(17)线程在.NET当中对应的类名是什么
(18)在多线程的场景下,为什么说线程上下文会带来额外的性能开销
(19)有什么方法可以在要求高性能的情况下减少这种线程上下文所带来的额外成本吗
(20)请描述出线程死锁的经典场景,并且给予避免死锁的解决方案.
4. GC与内存
(1). 请描述出GC的作用
(2). GC一共分为几个代龄 请分别描述一下这几代.
(3). 请描述出GC回收时候的步骤,越详细越好.
(4). LOH是什么
(5). 请描述一下LOH.
(6). 在什么情况下,.NET中的对象会存储在LOH中
(7). 请描述一下LOH的回收过程,另外,LOH的回收会触发Compress步骤吗 如果会,请说出原因,如果不会,请说出理由。
(8). 请说出GC的回收,一般会在什么时候进行触发
(9). 在程序初始化的时候,.NET一共为这几个GC代龄分配了几个MemorySegment 这些Segment会增加吗 如果会,请写出在什么情况下,.NET GC会增加自身的Memory Segment.
(10). 什么情况下,程序的内存会出现大量的内存碎片 内存碎片在GC的第几代时才是最致命的 我们如何尽可能的规避这个问题
(11). 什么情况下.NET的程序会出现内存泄露 为什么会出现内存泄漏的情况 请举出几个经典的场景来说明一下,并且阐述一下你对于此问题的解决方案.
5. 调试
(1). 请描述出你一般使用的.NET调试工具
(2). VS IDE是非常权威的工具,那么请问,你都使用过这个IDE的哪些调试功能
(3). 在下断点的时候,断点一共分为几种 你经常会使用哪一种的断点来协助调试你的程序
(4). 假设你的程序正在运行于生产环境之上,任意时间过后,发现该程序使用的内存正在不断地上涨,在以后的任意时间内,随着上涨的趋势,程序就会崩溃,请问,你该如何面对此问题
(5). 假设你的程序正在运行于生产环境之上,任意时间过后,发现该程序的CPU使用率突然飙升到很高的一个值,在以后的任意时间内,随着这种情况将可能会影响到当前系统中的其余程序,请问,你该如何面对此问题
(6). 请给出WINDBG中查询内存中某个具体类型的命令.
6. TCP网络编程
(1). 请写出.NET FRAMEWORK 2.0关于Socket接收数据的APM示例代码.
(2). 请写出.NET FRAMEWORK 4.0关于Socket接收数据的APM示例代码.
(3). 这2种APM,哪种更好 为什么 .NET 4.0的新APM是为了解决什么问题
(4).SocketAsyncEventArgs在高性能的场景下,频繁的实例化此类会造成什么问题 请说出这样做的缺点,并且给出一定的解决方案.