我有一个很长时间冻结的应用程序(有时一分钟或更长时间,有时似乎根本没有回来,但这次是大约一分钟)我拿了几个垃圾进行分析.我拿了三个转储,每个转储大约相隔15秒,但我看不出它们之间有太大不同,所以我将描述最后一个转储.
我做的第一件事就是通过调试分析运行它,它会产生以下诊断:
GC正在此过程中运行.触发GC的线程是34
我运行!threadpool并通过81%的CPU利用率确认GC:
CPU utilization: 81%
Worker Thread: Total: 19 Running: 19 Idle: 0 MaxLimit: 2047 MinLimit: 16
Work Request in Queue: 2212
AsyncTimerCallbackCompletion TimerInfo@05fc7fb8
*snipped 58 timers*
--------------------------------------
Number of Timers: 59
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 32 CurrentLimit: 0 MaxLimit: 1000 MinLimit: 16
Run Code Online (Sandbox Code Playgroud)
59个计时器,哇...无论如何,我看到CPU确认了GC的81%.分析中的下一个项目如下:
test.dmp中的以下线程正在等待.net垃圾回收完成.线程34触发了垃圾收集.收集器线程不会开始执行其工作,直到具有抢先GC禁用的线程完成执行为止.以下线程已禁用先发制人GC 34,
(3 9 10 12 19 20 30 31 38 39 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 …
假设我有以下内容:
<FrameworkElement.Resources>
<DataTemplate DataType="{x:Type viewmodel:MainViewModel}">
<view:MainBaseView />
</DataTemplate>
</FrameworkElement.Resources>
<ContentControl x:Name="uxMaster" Grid.Row="0" Content="{Binding}" />
<view:AddRemoveBaseView x:Name="uxButtons" Grid.Row="1"
DataContext="{Binding ElementName=uxMaster, Path=Content.uxGrid}" />
Run Code Online (Sandbox Code Playgroud)
现在假设Content正在绑定到 a 的新实例MainViewModel。通过 WPF 的魔力DataTemplates,它会创建一个UserControl MainBaseViewwhere 的实例ContentControl并将其DataContext设置为Binding。
问题是,你到底如何访问这个生成的内容(即MainBaseView实例)?我想绑定uxButtons'DataContext到生成的网格内Content,但在检查中Content只包含了结合,而不是MainBaseView实例及其逻辑/视频树。
例如,查看以下(抽象)声明:
int (*) (*)
Run Code Online (Sandbox Code Playgroud)
//指向返回int且不带参数的函数的指针
(我从以下网站获得:http://www.vineetgupta.com/blog/deciphering-complex-c-declarations)
我认为只有无效意味着没有争论.这真的意味着同样的事情:
int (*) (void)
Run Code Online (Sandbox Code Playgroud)
如果是这样,它在哪里声明*可用于指定无参数?
另外,我是否正确假设这样的抽象声明只存在于类型转换中?如果是这样,那么它的当前形式必须是无效的,因为它缺少周围的括号吗?所以int(*)(void)无效,但是(int(*)(void))有效,不是吗?
鉴于 CPU 现在是多核的并且有自己的 L1/L2 缓存,我很好奇 L3 缓存是如何组织的,因为它由多个内核共享。我会想象,如果我们有 4 个内核,那么 L3 缓存将包含 4 个页面的数据,每个页面对应于特定内核引用的内存区域。假设我有点正确,就这样吗?例如,它可以将这些页面中的每一个划分为子页面。这样,当多个线程在同一个内核上运行时,每个线程都可以在其中一个子页面中找到它们的数据。我只是突然想到了这个,所以我非常有兴趣让自己了解幕后真正发生的事情。任何人都可以分享他们的见解或为我提供一个链接来治愈我的无知吗?
提前谢谢了。
我想知道在C(89/90)中是否可以链接函数调用,以及它在C规范中定义的位置.我认为这是不可能的,因为谷歌搜索没有提到它.我想到这是因为与我的一个朋友进行了相关的对话,他告诉我,给定一个返回结构的函数,你不能在同一个语句中对所述结构执行任何操作; 相反,您必须将函数的结果赋给变量,然后通过变量而不是直接从函数结果本身操作结构.这让我相信你也不能链接函数,但我似乎无法找到规范中讨论的这些限制.
编辑:对不起,我应该具体了解返回值.假设函数返回一个函数指针,是否可以取消引用并以流畅的方式在同一语句中调用结果?
例如,假设getFunc返回一个函数指针:(*getFunc(getFuncParam))(otherFuncParam)
或者在struct的情况下,假设一个带有名为"count"的int成员的结构:
funcReturnsStruct(PARAM).Count之间++;
typedef int (*funcptr)(double); // pointer to function of double returning int
funcptr x = (funcptr) NULL; // C or C++
funcptr y = funcptr(NULL); // C or C++
funcptr z = static_cast<funcptr>(NULL); // C++ only
Run Code Online (Sandbox Code Playgroud)
funcptr在左侧用于声明变量,在右侧用于转换值.现在我理解第二行是向funcptr转换NULL,所以x是NULL,但第三行是什么意思呢?如果这应该是一个演员,因为维基百科条目建议那么为什么在括号中为NULL?我不熟悉那种类型的类型转换语法,并且有兴趣了解这里的解释.