Linux中的Mono GC:为什么要占用更多的内存,更多的时间来执行GC和GetTotalMemory如此昂贵?

时间:2018-09-26 12:28:19

标签: garbage-collection mono

我有几个运行在Linux服务器上的游戏服务器,每个服务器占用的初始内存大小是不同的。

在每台服务器中,我写了一些性能日志来记录服务器的状态,例如,“一个循环花费了多长时间”,“一个循环中的gc计数”。因此,在空闲状态下,由于日志的字符串分配,内存大小会缓慢分组,这会导致 0代GC

我在运行时间后检查状态日志时,发现每次发生GC时,循环时间都会增加,我认为这是合理的。但是我不明白的是,由于GC而导致的循环时间增加是不同的, GC发生的时间占用的内存越多,循环时间增加的次数就越多。日志显示“ 600M内存使用只需要 1ms 做一个0代GC,而2G内存使用只需要 15ms 做一个0代GC”!

据我所知,Mono使用具有两代苗圃和专业的 Generational GC ,因此0代GC仅需要处理Nursery堆部件(写屏障技术),而在我的情况下,托儿所部分的大小应相同,其中应包含新分配的字符串对象。谁能告诉我为什么?

此外,当我在Mono中使用 GC.GetTotalMemory(false)来获取应用程序使用的内存量时,循环时间每次都会增加约7-8ms。我已经检查了mono的代码,但仍然不知道为什么。

1 个答案:

答案 0 :(得分:0)

我猜活着的物体标记将花费更多的时间。内存中存在更多的对象,这意味着收集器需要从根中搜索更大的树。