[Mono-dev] Large object size limits

Rodrigo Kumpera kumpera at gmail.com
Fri Jun 13 18:07:01 UTC 2014


Hi Neale,

We should change from SIZE_MAX to the max value a ssize_t can hold.

--
Rodrigo


On Thu, Jun 12, 2014 at 4:38 PM, Neale Ferguson <NealeFerguson at verizon.net>
wrote:

> The following program runs fine on .NET -
>
> using System;
> using System.Collections.Generic;
> using System.Runtime;
> using System.Text;
>
> namespace LargeObjectTest
> {
>         class Program
>         {
>                 static void Main(string[] args)
>                 {
>
>                         IList<double> myList = new List<double>();
>
>
>                         long index = 1024*1024*1024;
>
>                         Console.WriteLine("index:" + index);
>
>                         double[] array = null;
>
>                         Console.WriteLine("UInt32.MaxValue:
> "+UInt32.MaxValue);
>                         try
>                         {
>                                 array = new double[index];
>
>                                 Console.WriteLine("doubleArray:LongLength
> " + array.Length * sizeof(double) + " bytes");
>                                 Console.WriteLine("sizeof(double) " +
> sizeof(double) + " bytes");
>                                 Console.WriteLine("index " + index);
>                                 Console.WriteLine("doubleArray:LongLength
> " + array.LongLength);
>                                 Console.WriteLine("doubleArray:Size " +
> array.LongLength * sizeof(double) * 1.0 + " Bytes");
>                         }
>                         catch (Exception e)
>                         {
>                                 Console.WriteLine("Exception:" + e);
>                                 Console.WriteLine("Exception:" + e.Message
> + " allocating :" + index);
>                                 Console.WriteLine("Exception:" + e.Message
> + " allocating :" + index * sizeof(double));
>                         }
>                 }
>         }
> }
>
> However, on mono on Linux it results in:
>
> index:1073741824
> UInt32.MaxValue: 4294967295
> Exception:System.OutOfMemoryException: Out of memory
>   at (wrapper managed-to-native)
> object:__icall_wrapper_mono_array_new_specific (intptr,int)
>   at LargeObjectTest.Program.Main (System.String[] args) [0x00000] in
> <filename unknown>:0
> Exception:Out of memory allocating :1073741824
> Exception:Out of memory allocating :8589934592
>
> If I make the following change to override the SIZE_MAX value from
> /usr/include/stdint.h:
>
> --- a/mono/metadata/sgen-los.c
> +++ b/mono/metadata/sgen-los.c
> @@ -342,8 +342,12 @@ sgen_los_alloc_large_inner (MonoVTable *vtable,
> size_t size)
>          *
>          * size <= SIZE_MAX - (mono_pagesize () - 1) - sizeof (LOSObject)
>          */
> +#undef SIZE_MAX
> +#define SIZE_MAX (17179869184U)
>         if (size > SIZE_MAX - (mono_pagesize () - 1) - sizeof (LOSObject))
>                 return NULL;
> +#undef SIZE_MAX
> +#define SIZE_MAX (4294967295U)
>
>  #ifdef LOS_DUMMY
>         if (!los_segment)
>
> Then the program works as it does under .NET:
>
> index:1073741824
> UInt32.MaxValue: 4294967295
> doubleArray:LongLength 0 bytes
> sizeof(double) 8 bytes
> index 1073741824
> doubleArray:LongLength 1073741824
> doubleArray:Size 8589934592 Bytes
>
> The question is, what is the correct value for the comparison in lieu of
> SIZE_MAX? I can't determine what the max is on .NET. Another question is
> what type of compacting happens with large objects like this?
>
> Neale
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20140613/41cf08e1/attachment.html>


More information about the Mono-devel-list mailing list