Closed
Description
consider this program:
long bigger_than_los_section = 32 * 1024 * 1024;
long bigger_than_small_obj = 100 * 1024;
long small_obj = 50;
long alloc_size = bigger_than_small_obj;
long cnt = 0;
long[] data = new long[1024*1024*32];
var end = DateTime.Now + TimeSpan.FromMilliseconds(10000);
do
{
// these are just dummy computations to keep CPU busy
Interlocked.Increment(ref cnt);
data = new long[alloc_size];
data[0] = cnt;
// force some GC
if(cnt % 10000 == 0)
{
GC.Collect();
var total = GC.GetTotalMemory(true);
Console.WriteLine("GC.GetTotalMemory: "+total);
}
}
while(DateTime.Now<end);
if alloc_size
is small_obj
then the LOS size stays constant, as we would expect
$ MONO_LOG_MASK=gc MONO_LOG_LEVEL=debug dotnet run
...
Mono: GC_MAJOR: (user request) time 0.05ms, stw 0.08ms los size: 1024K in use: 24K
...
Mono: GC_MAJOR: (user request) time 0.05ms, stw 0.06ms los size: 1024K in use: 24K
if alloc_size
is bigger_than_small_obj
then we also have a LOS size that stays constant
$ MONO_LOG_MASK=gc MONO_LOG_LEVEL=debug dotnet run
...
Mono: GC_MAJOR_CONCURRENT_FINISH: (finishing) time 0.23ms, stw 0.12ms los size: 3072K in use: 1625K
...
Mono: GC_MAJOR_CONCURRENT_FINISH: (finishing) time 0.24ms, stw 0.14ms los size: 3072K in use: 1625K
if alloc_size
is bigger_than_los_section
then the LOS heap size grows bigger and bigger (despite us not actually placing the new long[alloc_size]
in the LOS section (!)
$ MONO_LOG_MASK=gc MONO_LOG_LEVEL=debug dotnet run
...
Mono: GC_MAJOR_CONCURRENT_FINISH: (finishing) time 0.20ms, stw 0.13ms los size: 525344K in use: 524313K
...
Mono: GC_MAJOR_CONCURRENT_FINISH: (finishing) time 0.19ms, stw 0.13ms los size: 787504K in use: 786457K
...
Mono: GC_MAJOR_CONCURRENT_FINISH: (finishing) time 0.14ms, stw 0.09ms los size: 1049664K in use: 1048601K
...
Mono: GC_MAJOR_CONCURRENT_FINISH: (finishing) time 0.20ms, stw 0.14ms los size: 1573984K in use: 1572889K
...
This showed up in a MT WASM test #97970