[Mono-list] Too many heap sections: IncreaseMAXHINCRorMAX_HEAP_SECTS

Jonathan Gagnon jonathan.gagnon at croesus.com
Thu May 10 15:46:08 EDT 2007


I simplified the test a little bit.  I also tried serializing to a
FileStream instead of a MemoryStream and I got the same result.
 
I ran the test on Mono Windows and it runs for a while before exiting with
an OutOfMemoryException.
 
Jonathan

  _____  

De : mono-list-bounces at lists.ximian.com
[mailto:mono-list-bounces at lists.ximian.com] De la part de Jonathan Gagnon
Envoyé : Thursday, May 10, 2007 2:53 PM
À : 'Alan McGovern'; Mono-list at lists.ximian.com
Objet : Re: [Mono-list] Too many heap sections:
IncreaseMAXHINCRorMAX_HEAP_SECTS


Here is a little test that reproduces the problem.  I thought that
initializing the memory stream to a size bigger than the entire list would
fix the problem but it only makes it happen less quickly in some cases.
 
If you play with the numbers in my little test to reduce the size of
allocated memory, you will notice that it takes longer to run out of memory
but it still happens after a while.  The way it behaves, it really looks
like a leak since I have a loop that does the same thing at every run and I
would expect the memory allocator to be able to reuse the same memory
instead of growing the heap.
 
Note that I compiled the test with VS 2005.  I don't know if I could
reproduce the bug using the mono compiler.
 
Jonathan


  _____  

De : mono-list-bounces at lists.ximian.com
[mailto:mono-list-bounces at lists.ximian.com] De la part de Alan McGovern
Envoyé : Thursday, May 10, 2007 11:45 AM
À : Mono-list at lists.ximian.com
Objet : [Mono-list] Too many heap sections: Increase
MAXHINCRorMAX_HEAP_SECTS



>Also, as a test, could you initialise the memory stream to roughly the size
required to store the entire list<T> and see if it works then.


 
That works fine if I do it that way.  But my problem is that I can't really
know in advance how much memory the serialization will use, so it's not
really a viable solution.  I'm thinking of trying to split up my list into
smaller chunks to see it this could fix the problem by avoiding the large
object heap, if there is such a heap in mono.


Sounds like your problem is due to heap fragmentation. The only solution is
to use a best-guess for the approximate size of the memory stream and
initialise the memorystream to that to start off with. For example if the
average size of your class is 68 bytes, then initialise the memorystream to
array.Length * 68. Or some such thing.

Still, a testcase may prove useful.

Alan.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20070510/e2002a5b/attachment.html 
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Program.cs
Url: http://lists.ximian.com/pipermail/mono-list/attachments/20070510/e2002a5b/attachment.pl 


More information about the Mono-list mailing list