我有一个应用程序可以将3 + GB的数据处理成300MB的数据。在主线程上顺序运行每个独立数据集,其内存使用率最高可达3.5GB,并且工作正常。
如果我在10个线程上同时运行每个数据集,我会看到以下内容:
这是针对具有大堆支持的Linux的单声道4.2.2版本,在具有40个逻辑处理器的128GB RAM上运行。我正在运行mono-sgen并尝试了我能想到的所有自定义GC设置(并发标记扫描,最大堆大小等)。
Windows上不会发生这些问题。如果我重写代码来执行重要的对象池,那么在运行OOM之前我会在数据集中得到更多,但命运是相同的。我已经使用多个工具和古老的printf调试验证了我没有内存泄漏。
我最好的理论是,许多线程的大量分配对于GC来说都是一个弱点,并且大多数挂钟时间花费在我的工作线程暂停上。
有没有人有这方面的经验?有没有办法可以帮助GC摆脱100%的车祸而陷入困境,并且不会耗尽内存?