我在.net 4.0下看到一些不寻常的垃圾收集模式,我无法解释,任何建议都会受到赞赏.
在我的程序运行的不同时间,G2收集计数开始增加,GC%时间接近100%.这会在停止前持续一段时间(请参阅下面的性能监视器屏幕抓取).在此期间,CLR GC ETW事件的PerfView跟踪显示许多长时间运行的G2集合正在以"AllocSmall"的原因背靠背触发.
任何人都可以了解一下:
LowMemory似乎不是问题,因为GC启动事件不会将其作为原因代码(http://msdn.microsoft.com/en-us/library/ff356162.aspx).我们也看到了类似的情况,其中G0集合背靠背发生.
编辑:有人建议触发器可能超出某个阈值.鉴于仍有可用的内存,我希望G2堆在这一点上扩展,而不是让GC捶打试图收集.
编辑:下面发布的图片分辨率远高于StackOverflow显示 - 只需在浏览器选项卡中直接打开图片链接即可.

我一直在阅读Eric Lippert关于C#5中Asynchrony的博客文章(第4部分特别相关),并观看了Anders PDC10关于这个主题的讨论,我不清楚如何在单线程上下文中恢复异步方法的延续.
两个来源都讨论在单线程UI循环中使用异步方法来提高响应能力,在Anders的例子中,他提到当异步任务完成时,通过向消息泵添加消息来安排延续.
异步方法是否真的知道它需要执行看似特定于上下文的操作,还是简化?
更一般地说,如何在单线程上下文中处理异步方法的恢复?是否需要在单个线程内进行调度?
我正在尝试从data.table分组的结果绘制直方图,但似乎无法在发生跟随错误之前生成多个图表:
错误
[.data.table(DT ,,, hist(V2,break = 2),by = V1):maxn(3)不是此j列长度的精确倍数(2)
这个玩具示例应该有希望证明这个问题
require( data.table )
DT = data.table(c(1,1,2,2), c(1,2,3,4))
# This works
DT[,plot(V2,V2), by = V1]
# This fails after the first plot
DT[,hist(V2, breaks = 2), by = V1]
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么的任何想法?
我想从data.table为每个组生成一个散点图并从函数返回它.
我可以使用plot(下图)生成不同的图表,所以我假设这不是data.table问题:
dt = data.table(A = c(1,2,3,4), B = c(1,1,2,2), C = c(4,5,6,7))
result = dt[, list(plot = list(plot(A, C))), by = B]
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试用qplot做同样的事情(为了获得我可以返回的情节),我似乎最终得到了第二张图的两个副本.
dt = data.table(A = c(1,2,3,4), B = c(1,1,2,2), C = c(4,5,6,7))
result = dt[, list(plot = list(qplot(A, C))), by = B]
result[1,][["plot"]]
result[2,][["plot"]]
Run Code Online (Sandbox Code Playgroud)
如果我错过了一些明显的东西/做一些愚蠢的事情,我会道歉.