![]() |
1
1
终结器与“正常”线程执行同时执行。我们通常说gc运行终结器,但是gc检测哪些实例有应该运行的终结器,并将它们存储在一个专用队列中会更准确。一个(隐藏的)线程从队列中获取实例并运行终结器。需要这样的异步性,例如,因为终结器本身可能分配内存并可能触发gc。还有其他的 good reasons 为什么终结器必须是异步的。
底线是你不能改变
|
![]() |
2
0
我知道这并不能回答您的问题,但我怀疑您的代码中存在死锁,而不是奇怪的gc问题。
我建议你检查一下你的代码是否有死锁,特别是像
|
![]() |
3
0
这个问题实际上是由垃圾收集器引起的。在用windbg调试和分析内存转储数天后,我们意识到存在死锁情况,但这是由gc并发收集引起的。 Changing the GC to collect non-concurrently 解决了我们的问题。 |
![]() |
4
0
支持marek的答案,这看起来很像是您正在使用的并发模型的设计问题。作为一个设计问题,这是你无法通过测试有效解决的问题。 我的建议是仔细考虑您使用的并发模型,并相应地更正设计。首先,研究死锁的必要条件,例如:
考虑到这些因素,如果您有循环的资源分配结构,那么您将研究可能的死锁情况。 |
![]() |
codeforester · 测量GC暂停时间的最佳方法是什么? 7 年前 |
![]() |
Venki WAR · 需要解释G1的并行完整GC 7 年前 |
![]() |
Stephan_Berlin · 为什么CMS系列中的初始标记阶段 7 年前 |
![]() |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 7 年前 |
![]() |
goks · 如何清除熊猫的数据帧内存? 7 年前 |