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

问题描述 投票:0回答:1

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

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

当我在运行时间后检查状态日志时,我发现每次GC发生时,循环时间都会增加,我认为这是合理的。但我不明白的是,由于GC引起的循环时间的增加是不同的,GC时间占用的内存越多,循环时间越长。由于日志显示“600M内存使用仅需1ms即可完成一代0代GC,但2G内存使用需要15ms才能完成一代0代GC”!

据我所知,Mono使用具有两代幼儿园和Major的Generational GC,因此0代GC只需要处理幼儿园堆部分(写障碍技术),在我的情况下,幼儿园部分应该是相同的大小包含新的分配了字符串对象谁能说出原因?

另外,当我在单声道中使用GC.GetTotalMemory(false)来获取应用程序使用的内存量时,每次循环时间增加大约7-8ms。我检查了单声道的代码,但仍然没有找出原因。

garbage-collection mono
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.