Hi Jeff,
Thanks very much for your reply. That's brilliant. I had tried playing around 
with a few "tricks" I thought might prompt a pool drain, but to no joy. It's 
great to have a bit of code that will do the job for that - I'll give it a go 
tomorrow.
Cheers
Jonny

On 4 Jun 2013, at 16:30, Jeff Johnson <[email protected]> wrote:

> Hi Johnny.
> 
> This is a long-standing problem with AppKit. According to the documentation, 
> "The Application Kit creates an autorelease pool on the main thread at the 
> beginning of every cycle of the event loop, and drains it at the end, thereby 
> releasing any autoreleased objects generated while processing an event." 
> However, this is somewhat misleading. The "end" of the event loop cycle is 
> immediately before the beginning. Thus, for example, if your app is in the 
> background and not receiving events, then the autorelease pool will not be 
> drained. That's why your memory drops significantly when you click the mouse 
> or switch applications.
> 
> We've run into this issue in a number of apps. As a workaround, we add a 
> timer to the main thread and have it fire periodically. The timer's action 
> method does the following:
> 
> NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined 
> location:NSZeroPoint modifierFlags:0 timestamp:[NSDate 
> timeIntervalSinceReferenceDate] windowNumber:0 context:nil subtype:0 data1:0 
> data2:0]
> [NSApp postEvent:event atStart:YES];
> 
> This basically "tickles" the event loop and causes the autorelease pool to 
> drain.
> 
> -Jeff
> 
> 
> On Jun 3, 2013, at 10:59 AM, Jonathan Taylor <[email protected]> 
> wrote:
> 
>> Hi all,
>> 
>> Can anybody advise what tools I should be using to debug a particular out of 
>> memory condition - and maybe even how I can fix it? The error that I 
>> ultimately encounter (in a 32-bit application on Snow Leopard) is:
>> 2013-06-03 15:44:30.271 MyApplication[25115:a0f] NSImage: Insufficient 
>> memory to allocate pixel data buffer of 1228800 bytes
>> However as I'll explain I don't feel that I am doing anything that should 
>> result in running out of memory.
>> 
>> The program loads and processes a large number (~2000) image files, and I 
>> believe that I am disposing of memory and draining autorelease pools 
>> correctly. Running the program under ObjectAlloc, it never reports memory 
>> usage over 300MB. The problem seems to be that, even though ObjectAlloc 
>> thinks the memory has been released, it is not actually being properly freed 
>> up until some time later. The memory usage as reported in Activity Monitor 
>> climbs higher and higher until, if left unattended, there is apparently no 
>> more memory available. Clicking the mouse or switching applications causes 
>> an immediate and significant drop in memory usage.
>> 
>> Thus the situation seems to be that I believe I am doing everything I can 
>> for good memory management, but the OS is not actually freeing things up for 
>> re-use. I encountered a similar problem that I asked about on here last year:
>> http://lists.apple.com/archives/cocoa-dev/2012/Jul/msg00602.html
>> Although in that case the eventual conclusion was that I should be using a 
>> different approach in my code, it involved the same issue of memory not 
>> being released when I would have expected it to be. In that case from last 
>> year, I was wrong to rely on it being released when I expected, but I feel 
>> that this time it should be reasonable to expect that I won't run out of 
>> memory entirely, given that I am releasing all the buffers that I am 
>> finished with and only keeping a small working set allocated!
>> 
>> This is of course partly just speculation because ObjectAlloc isn't giving 
>> any info about this unavailable but apparently not-allocated memory. So...
>> 1. Can anybody recommend a way of debugging this problem to get more 
>> concrete evidence for what is actually happening?
>> 2. Assuming my interpretation is correct, can anybody suggest a solution?
>> 
>> Many thanks
>> Jonny
> 


_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to