use*_*422 2 c# debugging garbage-collection visual-studio
到底是什么
表示托管堆垃圾回收的开始
意思是,它不好吗?
在运行visual studio调试器时,我正在查看进程内存,当我的一个操作发生时,进程内存图中有许多黄色符号表示一些"表示托管堆垃圾收集的开始"操作已经发生.代码在合理的时间内处理,这是件坏事吗?
"表示托管堆垃圾收集的开始"是什么意思?
CLR有一个垃圾收集器.它跟踪正在使用的内存量,当它的启发式指示现在可能是尝试回收未使用内存的好时机时,它会收集垃圾内存并将其释放.这样做可以压缩堆.
这不好吗?
根据您使用的CLR版本及其配置方式,有各种不同的垃圾收集策略.其中一些是"阻止世界"的收藏家; 也就是说,在收集发生时,程序会暂停几毫秒. 如果您的程序需要实时或接近实时处理时间预算小于几毫秒的事件,那么错误时间的集合可能非常糟糕.
例如,假设您正在编写代码来分析以每秒几千米的速度移动的入射导弹的飞行路径,并触发一些对策.如果你错误了几毫秒,因为在错误的时间有垃圾收集,你的分析可能会偏离几米,你可能会错过你的目标. 不要编写软件来运行C#中的导弹拦截系统.人们可能会死 那真的很糟糕.
例如,假设您正在编写一个每秒刷新60次屏幕的游戏.这使得每次刷新少于17毫秒来完成所有必要的游戏计算.如果这样做需要14毫秒,那么垃圾收集可能会导致您错过一个帧.游戏玩家可能会生气.那真的很糟糕.
例如,假设您正在编写更新数据库的业务线软件,更新数据库需要10秒钟.垃圾收集可能会中断,然后可能需要10秒加3毫秒.那不错.没关系.
从用户体验性能角度分析您的应用程序,设置性能预算,并验证垃圾收集是否会使您保持在预算范围内.如果您没有预算中的垃圾收集,那么您需要使用特殊技术来控制收集的执行方式和时间,以确保它们在预算范围内发生.
特别是,如果您的产品性能预算超出了收集范围,那么您必须管理收集压力."压力"是GC用来决定何时收集的启发式方法; 它是最近分配了多少内存,分配大小,内存存活多少集合以及许多其他因素的组合.
当我们设计Roslyn(当前一代C#编译器技术)时,我们必须非常小心地管理收集压力,因为编译器在编辑器中的键击之间进行了许多小的分配.在某些情况下,由于不需要的收集,我们没有足够快地进行分析以在打字期间产生IntelliSense行为.我们使用各种技术来减少压力,以及收集器在收集过程中移动内存所需的工作量.
这些都是先进的技术.如果您符合预算,请不要担心.但是,在您制定预算之前,您不会知道自己是否符合预算,并衡量自己是否在预算范围内!