.NET面试题C卷

1、 在一个进程里面有多少个finalizer个线程?

A1个堆一个

B1个CPU一个

C1

D2

E我不知道怎么回答

2、 在分析过程中检查检查数据结构可以判别方法是否被JIT编译过?

AMethodTable

BEEClass

CMethodDescriptor

DPEHeader

E我不知道怎么回答

3、 什么命令能够检查对象被根化?

Afindroots

Broot

CDumpObj

D!gcroot

E我不知道怎么回答

4、 在过CPU挂起的时候,什么命令能够检查CPU的线程耗时?

A!analyze

B!runaway

C!threads

D~*

E我不知道怎么回答

5、 DotNet三种GC的模式?

AConcurrentWorkstationGC

BNon-ConcurrentWrokStationGC

CFinalizerGC

DServerGC

E我不知道怎么回答

6、 当对象超过多大时,系统将对象放入到LOH中?

A4000bytes

B无固定的值

C85000bytes

D1M

E我不知道怎么回答

7、如何定位内存泄漏出现在托管堆上?(分别采取2种方式来判别)

【方法一】打开性能计数器,设置监视对象为“.NetCLRMemory”和“Process”,启动监视。运行待分析的应用程序一段时间后,停止监视。点击查看日志数据,选择“.NETCLRMemory/#BytesinallHeaps”和“Process/PrivateBytes”节点。查看此时的图表,如果二者同增同减,说明系统内存增加很大程度上都是.Net程序导致的,即内存泄露于托管堆。

【方法二】用WinDbg肯定可以,不会。

8、 内存泄漏的分析流程是什么?并描述如何在堆中寻找对应的对象地址?

1. 再WinDbg中打开应用程序的dump文件(由调试器生成)。

2. 使用命令“!addresssummary”查看内存,判断内存是否泄漏于GC堆上。

3. 如果内存泄露与GC堆,说明.Net应用程序的问题。

4. 使用命令“!dumpheapstat”分析程序中对象的情况。该命令执行结果的第一列就是对应对象的地址。

5. 可以重点分析string对象。使用同样的命令,获取stringMethodTable,使用“!do”命令查看string对象的信息。

6. 使用“!gcroot”命令查看对象被根化在何处,大量的根化意味着GC处理的异常。

7. 使用“!finalizequeue”命令查看终止化队列。分析这些正在被终止的对象,正是这些数据导致内存异常的大量占用。

9、 从应用角度分析什么操作可能导致CPU长时间处在High状态下,什么情况会导致资源消耗比较低,但是应用却出现延迟?

1. 大数据排序、申请回收大空间、复杂数值运算(包括如视频播放、游戏环境贴图等的应用)等都会使CPU长期高负荷占用。

2. 资源(理解为内存)消耗比较低,说明没有过多的空间申请,或者只是空间调换。延迟,说明线程或进程被阻塞。所以下面是几个可能的原因:

1) 线程死锁或暂停。

2) 线程工作负荷超重(如1中的某些情况),导致响应不及时,并且可能连带阻塞了下游线程的访问。

3) 程序死循环。

10、请描述对象的Finalizer流程?

这里将Finalizer流程理解为.Net的析构流程,不包括.NetDispose模式。

1. GC会以一定的优化算法轮询所有的对象,如果该对象不会再被引用到,则GC认为该对象可以在适当的时候进行垃圾回收了。

2. GC会寻找一个合适的机会(如0代对象饱和、应用程序域被卸载、CLR异常等)启动回收操作。

3. 内存回收分两种情况:

a) 如果该对象没有显式定义Finalize方法,则直接回收内存。

b) 如果该对象已显式定义了Finalize方法,GC在第一次回收时,将其从终止化队列(即第8个问题的FinalizeQueue)中转移到准备回收的对象列表。在第二次回收时,GC调用该对象的Finalize方法,完成用户自定义析构,然后,将这些项从列表中移除。完成回收对象的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值